网上有很多读写blob列的例子,但是大多都是从文件读入,存到blob中,以及从blob读取然后存到文件中,所以在这我就不写了。我想写的是如何把一个java对象存储到blob中。
对于oracle来说,要想写一个blob字段需要先获得指向它的游标,因此你不能直接insert into,你需要先插入一条blob字段为null的记录,然后update,刚开始我以为DB2也是这么回事,而且好些网站上写的也是这么实现的,后来在某人的blog上看到根本就不需要这么麻烦,直接插入就可以了,所以我写了段代码实验一下,果然可以。主要思路是将java对象转换成byte[],然后将byte[]插入到blob字段中,要输出byte[]就要用到ByteArrayOutputStream和ObjectOutputStream,其中ObjectOutputStream可以将Object写到输出流中,而ByteArrayOutputStream可以把输出流转换成byte[],转换成byte[]后一切就简单了。
先写一个java类
package test;
import java.io.Serializable;
public class O implements Serializable{
private String s;
private String[] ss;
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
public String[] getSs() {
return ss;
}
public void setSs(String[] ss) {
this.ss = ss;
}
}
这个类包含了两个域,一个是String一个是String数组
转换方法
private byte[] getbytefromobject(Object oo){
ByteArrayOutputStream bs=new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(bs);
oos.writeObject(oo);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//create a objectoutputstream from bytearrayoutputstream
return bs.toByteArray();
}
获得数据库连接
private Connection createConnection(String servername,String user,String pass) {
Connection conn = null;
try {
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
conn = java.sql.DriverManager.getConnection("jdbc:db2:"+servername,
user, pass);
} catch (SQLException ex1) {
ex1.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
return conn;
}
写入blob
private void writeblob(Connection conn,O oo,byte[] b){
try {
PreparedStatement ps=conn.prepareStatement("insert into test values(?,?)");
ps.setString(1, "2");
ps.setBytes(2, b);
ps.executeUpdate();
conn.commit();
System.out.println("insert successful");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
读出blob
private void readblob(Connection conn){
java.sql.Statement st;
try {
st = conn.createStatement();
java.sql.ResultSet rs=st.executeQuery("select ob from test ");
while(rs.next())
{
Blob bb=rs.getBlob("ob");
bb.getBinaryStream();
InputStream is= bb.getBinaryStream();
ObjectInputStream ois=new ObjectInputStream(is);
O oo=(O) ois.readObject();
System.out.println(oo.getS());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}