不管你是新手還是老手,大欄位數據的操作常常令你感到很頭痛。因為大欄位有些特殊,不同資料庫處理的方式不一樣,大欄位的操作常常是以流的方式來處理的。而非一般的欄位,一次即可讀出數據。下面學步園小編來講解下JDBC怎麼讀寫MySQL的大欄位數據?
JDBC怎麼讀寫MySQL的大欄位數據
環境:
MySQL5.1
JDK1.5
一、認識MySQL的大欄位類型
BLOB是一個二進位大對象,可以容納可變數量的數據。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB.它們只是可容納值的最大長度不同。
有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT.這些對應4種BLOB類型,有相同的最大長度和存儲需求。
BLOB列被視為二進位字元串(位元組字元串)。TEXT列被視為非二進位字元串(字元字元串)。BLOB列沒有字符集,並且排序和比較基於列值位元組的數值值。TEXT列有一個字符集,並且根據字符集的校對規則對值進行排序和比較。
在TEXT或BLOB列的存儲或檢索過程中,不存在大小寫轉換。
當未運行在嚴格模式時,如果你為BLOB或TEXT列分配一個超過該列類型的最大長度的值值,值被截取以保證適合。
幾種類型的大欄位最大長度說明:
TINYBLOB最大長度為255(2^[8]–1)位元組的BLOB列。
TINYTEXT最大長度為255(2^[8]–1)字元的TEXT列。
BLOB[(M)]最大長度為65,535(2^[16]–1)位元組的BLOB列。可以給出該類型的可選長度M.如果給出,則MySQL將列創建為最小的但足以容納M位元組長的值的BLOB類型。
TEXT[(M)]最大長度為65,535(2^[16]–1)字元的TEXT列。可以給出可選長度M.則MySQL將列創建為最小的但足以容納M字元長的值的TEXT類型。
MEDIUMBLOB最大長度為16,777,215(2^[24]–1)位元組的BLOB列。
MEDIUMTEXT最大長度為16,777,215(2^[24]–1)字元的TEXT列。
LONGBLOB最大長度為4,294,967,295或4GB(2^[32]–1)位元組的BLOB列。LONGBLOB列的最大有效(允許的)長度取決於客戶端/伺服器協議中配置最大包大小和可用的內存。
LONGTEXT最大長度為4,294,967,295或4GB(2^[32]–1)字元的TEXT列。LONGTEXT列的最大有效(允許的)長度取決於客戶端/伺服器協議中配置最大包大小和可用的內存。
二、創建測試環境
createtableuser(
idint(11)notnullauto_increment,
namevarchar(50)notnull,
pswdvarchar(50)defaultnull,
piclongblob,
remarklongtext,
primarykey(id)
);
三、插入讀取blob
importlavasoft.common.DBToolkit;
importjava.io.*;
importjava.sql.*;
/**
*操作MySQL5的blob欄位
*
*@authorleizhimin2009-12-311:34:50
*/
publicclassBlobTest{
publicstaticvoidmain(String[]args){
insertBlob();
queryBlob();
}
publicstaticvoidinsertBlob(){
Connectionconn=DBToolkit.getConnection();
PreparedStatementps=null;
try{
Stringsql=「insertintotestdb.user(name,pswd,pic)values(?,?,?)」;
ps=conn.prepareStatement(sql);
ps.setString(1,「zhangsan」);
ps.setString(2,「111」);
JDBC怎麼讀寫MySQL的大欄位數據
//設置二進位參數
Filefile=newFile(「D:\\new\\dbtools\\src\\res\\PIC.PNG」);
InputStreamin=newBufferedInputStream(newFileInputStream(file));
ps.setBinaryStream(3,in,(int)file.length());
ps.executeUpdate();
in.close();
}catch(IOExceptione){
e.printStackTrace();
}catch(SQLExceptione){
e.printStackTrace();
}finally{
DBToolkit.closeConnection(conn);
}
}
publicstaticvoidqueryBlob(){
Connectionconn=DBToolkit.getConnection();
PreparedStatementps=null;
Statementstmt=null;
ResultSetrs=null;
try{
Stringsql=「selectpicfromuserwhereid=24」;
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
if(rs.next()){
InputStreamin=rs.getBinaryStream(1);
Filefile=newFile(「D:\\new\\dbtools\\src\\res\\PIC_COPY.PNG」);
OutputStreamout=newBufferedOutputStream(newFileOutputStream(file));
byte[]buff=newbyte[1024];
for(inti=0;(i=in.read(buff))>0;){
out.write(buff,0,i);
}
out.flush();
out.close();
in.close();
}
rs.close();
stmt.close();
}catch(IOExceptione){
e.printStackTrace();
}catch(SQLExceptione){
e.printStackTrace();
}finally{
DBToolkit.closeConnection(conn);
}
}
}
注意,要確保二進位數據長度足夠大,否則可能導致數據寫入不完整的問題。
以上就是關於「JDBC怎麼讀寫MySQL的大欄位數據」的內容,希望對大家有用。更多資訊請關注學步園。學步園,您學習IT技術的優質平台!