⑴ java提取資料庫中blob類型的圖片,如何全部顯示在jsp頁面
在OracleQueryBean類中增加一個函數,來進行讀取,具體代碼如下:
/**
* 根據圖片在資料庫中的ID進行讀取
* @param strID 圖片欄位ID
* @param w 需要縮到的寬度
* @param h 需要縮到高度
* @return
*/
public byte[] GetImgByteById(String strID, int w, int h){
//System.out.println("Get img data which id is " + nID);
if(myConnection == null)
this.getConnection();
byte[] data = null;
try {
Statement stmt = myConnection.createStatement();
ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID);
StringBuffer myStringBuffer = new StringBuffer();
if (myResultSet.next()) {
java.sql.Blob blob = myResultSet.getBlob(this.strImgName);
InputStream inStream = blob.getBinaryStream();
try {
long nLen = blob.length();
int nSize = (int) nLen;
//System.out.println("img data size is :" + nSize);
data = new byte[nSize];
inStream.read(data);
inStream.close();
} catch (IOException e) {
System.out.println("獲取圖片數據失敗,原因:" + e.getMessage());
}
data = ChangeImgSize(data, w, h);
}
System.out.println(myStringBuffer.toString());
myConnection.commit();
myConnection.close();
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
return data;
}
頁面使用OracleQueryBean來根據用戶提供的圖片id進行查詢,在讀取並進行縮放後,通過jsp頁面進行展示,具體代碼如下:
<%@ page language="java" contentType="text/html;;charset=gbk" %>
<jsp:useBean id="OrcleQuery" scope="page" class="HLFtiDemo.OracleQueryBean" />
<%
response.setContentType("image/jpeg");
//圖片在資料庫中的 ID
String strID = request.getParameter("id");
//要縮略或放大圖片的寬度
String strWidth = request.getParameter("w");
//要縮略或放大圖片的高度
String strHeight = request.getParameter("h");
byte[] data = null;
if(strID != null){
int nWith = Integer.parseInt(strWidth);
int nHeight = Integer.parseInt(strHeight);
//獲取圖片的byte數據
data = OrcleQuery.GetImgByteById(strID, nWith, nHeight);
ServletOutputStream op = response.getOutputStream();
op.write(data, 0, data.length);
op.close();
op = null;
response.flushBuffer();
//清除輸出流,防止釋放時被捕獲異常
out.clear();
out = pageContext.pushBody();
}
%>
⑵ java String類型和blob類型轉換
如果你的數據真的是 String ,那按理就是用 Clob 嘛。
Blob 主要用於二進制內容,比如圖片,附件。
如果保持資料庫表結構不變的話,用 blob 也行,但你需要在讀取和寫入兩頭明確地指定相同的字元集,否則讀取這個還原過程會得到不到期望的結果。只要我們用支持這種字元的字元集理論上來說,只要編碼和解碼的過程使用相同的字元集就不會失真,如果字元集本身不支持這個字元(比如你拿一個只有康熙字典中才有的古漢字用 GB2312 字元集去處理就會失真,而用 UTF8 就可能正常,因為只要這個字元真的能被輸入法錄入到電腦中基本上它就已經表示有辦法能處理它)。
PreparedStatement 中有 setBlob (JDBC 4.0) 或 setBinaryStream (早期) 方法。但你需要測試你使用的驅動程序是什麼版本的與資料庫是否匹配。
⑶ java中blob類型是什麼類型
java基本類型中沒有blob類型,應該是自定義的一個類。
⑷ java里怎麼判斷Blob類型是否為空
要看寫的Blob類型是什麼
是不是只的boolean類型還是聲明為Boolean的類
jdk1.4情況下
java里有基本類型的boolean和Boolean的包裝類。兩者是有區別的。至於什麼區別,我想樓主應該多看看書。
Blooean的聲明的變數是引用類型。這個引用將指向一個對象。該對象可以為空。例如:
Boolean b = null;
System.out.println(b);
列印的結果是 null;
當然如果聲明為基本類型,列印結果默認是false的,例如:
boolean b ;
System.out.println(b);
列印的結果是false
jdk5.0的情況沒做測試結果不清楚。估計結果和上面是一樣的。
但是因為在jdk5.0的情況下包裝類對象和基本類型似乎可以互相直接轉化例如:
int i = new Integer(5);
這種語句在1.4情況下編譯不過的,似乎5.0就可以。所以5.0以後的情況不確定
⑸ 什麼java類型可以寫入BLOB類型中
public interface Blob
SQL BLOB 值在 JavaTM 編程語言中的表示形式(映射關系)。SQL BLOB 是內置類型,它將二進制大對象 (Binary Large Object) 存儲為資料庫表某一行中的一個列值。默認情況下,驅動程序使用 SQL locator(BLOB) 實現 Blob,這意味著 Blob 對象包含一個指向 SQL BLOB 數據的邏輯指針而不是數據本身。Blob 對象在它被創建的事務處理期間有效。
介面 ResultSet、CallableStatement 和 PreparedStatement 中的方法(如 getBlob 和 setBlob)允許編程人員訪問 SQL BLOB 值。Blob 介面提供一些方法來獲取 SQL BLOB (Binary Large Object) 值的長度、在客戶端實現 BLOB 值以及確定 BLOB 值中某一位元組樣本的位置。此外,此介面還有更新 BLOB 值的方法。
如果 JDBC 驅動程序支持該數據類型,則必須完全實現 Blob 介面的所有方法。
希望對你又幫助
⑹ blob欄位java如何處理
1.使用jdk中的方法進行傳輸。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多數人都會嘗試setBlob
(),getBlob() 進行讀寫,或者兩個資料庫之間BLOB的傳輸。這種方法實際上是行不通的,據網上的一些資料介紹,說sun官方的文檔有些方法
都是錯誤的。
2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream對BLOB進行讀寫或兩個資料庫間的傳輸。這種方法我自己嘗試過,
發現,如果BLOB中存儲的是文本文件的話,就沒問題,如果是二進制文件,傳輸就會有問題。
根據自己的經驗,以及查閱了Oracle的官方文檔,都是使用如下處理方法:
1.新建記錄,插入BLOB數據
1.1首先新建記錄的時候,使用oracle的函數插入一個空的BLOB,假設欄位A是BLOB類型的:
insert xxxtable(A,B,C) values(empty_blob(),'xxx','yyyy')
1.2後面再查詢剛才插入的記錄,然後更新BLOB,在查詢前,注意設置Connection的一個屬性:
conn.setAutoCommit(false);如果缺少這一步,可能導致fetch out of sequence等異常.
1.3 查詢剛才插入的記錄,後面要加「 for update 」,如下:
select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出現row containing the LOB value is not locked
的異常
1.4 從查詢到的 BLOB欄位中,獲取blob並進行更新,代碼如下:
BLOB blob = (BLOB) rs.getBlob("A");
OutputStream os = blob.getBinaryOutputStream();
BufferedOutputStream output = new BufferedOutputStream(os);
後面再使用output.write方法將需要寫入的內容寫到output中就可以了。例如我們將一個文件寫入這個欄位中:
BufferedInputStream input = new BufferedInputStream(new File("c://hpWave.log").toURL().openStream());
byte[] buff = new byte[2048]; //用做文件寫入的緩沖
int bytesRead;
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
output.write(buff, 0, bytesRead);
System.out.println(bytesRead);
}
上面的代碼就是從input里2k地讀取,然後寫入到output中。
1.5上面執行完畢後,記得關閉output,input,以及關閉查詢到的ResultSet
1.6最後執行conn.commit();將更新的內容提交,以及執行conn.setAutoCommit(true); 改回Connction的屬性
2.修改記錄,方法與上面的方法類似,
2.1首先更新BLOB以外的其他欄位
2.2 使用1.3中類似的方法獲取記錄
2.3 修改的過程中,注意以下:a 需要更新的記錄中,BLOB有可能為NULL,這樣在執行blob.getBinaryOutputStream()獲取的值可能為
null,那麼就關閉剛才select的記錄,再執行一次update xxxtable set A = empty_blob() where xxx, 這樣就先寫入了一個空的BLOB(不是null),然後再
使用1.3,1.4中的方法執行更新記錄.b 注意別忘了先執行setAutoCommit(false),以及"for update",以及後面的conn.commit();等。
3.讀取BLOB欄位中的數據.
3.1 讀取記錄不需要setAutoCommit(),以及 select ....for update.
3.2 使用普通的select 方法查詢出記錄
3.3 從ResultSet中獲取BLOB並讀取,如下:
BLOB b_to = (BLOB) rs.getBlob("A");
InputStream is = b_from.getBinaryStream();
BufferedInputStream input = new BufferedInputStream(is);
byte[] buff = new byte[2048];
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
//在這里執行寫入,如寫入到文件的BufferedOutputStream里
System.out.println(bytesRead);
}
通過循環取出blob中的數據,寫到buff里,再將buff的內容寫入到需要的地方
4.兩個資料庫間blob欄位的傳輸
類似上面1和3的方法,一邊獲取BufferedOutputStream,另外一邊獲取BufferedInputStream,然後讀出寫入,需要注意的是寫入所用的
Connection要執行conn.setAutoCommit(false);以及獲取記錄時添加「 for update 」以及最後的commit();
總結以上方法,其根本就是先創建空的BLOB,再獲取其BufferedOutputStream進行寫入,或獲取BufferedInputStream進行讀取
(1)對資料庫clob型執行插入操作
*************************************************
java.sql.PreparedStatementpstmt=null;
ResultSetrs=null;
Stringquery="";
conn.setAutoCommit(false);
query="insertintoclobtest_table(id,picstr)values(?,empty_clob())";
java.sql.PreparedStatementpstmt=conn.prepareStatement(query);
pstmt.setString(1,"001");
pstmt.executeUpdate();
pstmt=null
query="selectpicstrfromclobtest_tablewhereid='001'forupdate";
pstmt=con.prepareStatement(query)
rs=pstmt.executeQuery();
oracle.sql.CLOBclobtt=null;
if(rs.next()){
clobtt=(oracle.sql.CLOB)rs.getClob(1);
}
Writerwr=clobtt.getCharacterOutputStream();
wr.write(strtmp);
wr.flush();
wr.close();
rs.close();
con.commit();(2)通過sql/plus查詢是否已經成功插入資料庫
*************************************************
PL/SQL的包DBMS_LOB來處理LOB數據。察看剛才的插入是否成功。使用DBMS_LOB包的getlength這個procere來檢測是否已經將str存入到picstr欄位中了。如:
SQL>selectdbms_lob.getlength(picstr)fromclobtest_table;
(3)對資料庫clob型執行讀取操作
*************************************************
讀取相對插入就很簡單了。基本步驟和一半的取資料庫數據沒有太大的差別。
Stringdescription=""
query="selectpicstrfromclobtest_tablewhereid='001'";
pstmt=con.prepareStatement(query);
ResultSetresult=pstmt.executeQuery();
if(result.next()){
oracle.jdbc.driver.OracleResultSetors=
(oracle.jdbc.driver.OracleResultSet)result;
oracle.sql.CLOBclobtmp=(oracle.sql.CLOB)ors.getClob(1);
if(clobtmp==null||clobtmp.length()==0){
System.out.println("======CLOB對象為空");
description="";
}else{
description=clobtmp.getSubString((long)1,(int)clobtmp.length());
System.out.println("======字元串形式"+description);
}
}
⑺ java String類型轉換為Blob類型
java String類型轉換為Blob類型的方法:
由於Blob類型存放的是位元組數組,利用String的getBytes()方法獲得該字元串的位元組數組(注意編碼方式),之後利用hibernate工具存入Blob即可。
publicstaticBlobgetBlogValue(StringstrValue,StringcharsetName){
BlobblobValue=null;
try{
//charset為「字元編碼方式」
byte[]bytes=strValue.getBytes(charsetName);
System.out.println("byte[]:"+bytes);
blobValue=Hibernate.createBlob(bytes);
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
returnblobValue;
}
⑻ java 關於blob類型問題
public void save(String vid,String title,String type,String user,String date,String context,String file) throws Exception
{
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "insert into news(v_id,title,type,person,inputtime,context,attach_docid) values('"+vid+"','"+title+"','"+type+"','"+user+"','"+date+"',EMPTY_BLOB(),'"+file+"')";
try {
DBJdbc dbjdbc = new DBJdbc();
conn = dbjdbc.getDBConnection();
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.executeUpdate(sql);
String sql1 = "select context from news where v_id ='"+vid+"' for update"; // 使用"FOR UPDATE"得到表的寫鎖
rs = stmt.executeQuery(sql1);
if (rs.next()) {
BLOB blob = (BLOB) rs.getBlob(1); // 得到BLOB對象
OutputStream outout = blob.getBinaryOutputStream(); // 建立輸出流
InputStream in = new ByteArrayInputStream(strss.HTMLEncode(context).getBytes()); //字元串轉換為數據流
int size = blob.getBufferSize();
byte[] buffer = new byte[size]; // 建立緩沖區
int len;
while ((len = in.read(buffer)) != -1)
outout.write(buffer, 0, len);
in.close();
outout.close();
}
conn.commit();
stmt.close();
conn.close();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
希望能幫助到你
⑼ 資料庫里存儲的圖片欄位定義類型為blob,java里對應的類型為byte[],怎麼將圖片顯示到jsp頁面
這個試下吧.
....
<body>
<%
//獲取圖片對象(根據主鍵)的sql語句
String showImage = " select * "+
" from 存放圖片的表 "+
" where id='1' " ;
BufferedInputStream inputImage = null;
try{
//conn為一個Connection對象
Statement st = conn.createStatement();
//獲取結果集
ResultSet rs=st.executeQuery(showImage);
//輸出文件名
String filename="";
if(rs.next()) {
Blob blob = (Blob)rs.getBlob("BINARYFILE");
filename=rs.getString("FILENAME");
//讀取圖片位元組到數據流中
inputImage = new BufferedInputStream(blob.getBinaryStream());
}
BufferedImage image = null;
image=ImageIO.read(inputImage);
//獲取響應的輸出流
ServletOutputStream so = response.getOutputStream();
//創建圖片到頁面
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(so);
encoder.encode(image);
inputImage.close();
}
%>
</body>
<%
catch(Exception e){
}
finally{
closeConn(conn);
}
%>
⑽ mysql bolb對應java什麼類型
BLOB類型的欄位用於存儲二進制數據
MySQL中,BLOB是個類型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,這幾個類型之間的唯一區別是在存儲文件的最大大小上不同。
MySQL的四種BLOB類型
類型 大小(單位:位元組)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G