JDBC 读写LOB大对象
@author ixenos
LOB
除了数字、字符串和日期之外,许多数据库还可以存储大对象,例如图片或其他数据,
在SQL中,二进制(字节型)大对象称为BLOB,字符型大对象称为CLOB
读取LOB流程
i. 执行SELECT语句
ii. ResultSet调用getBlob或getClob方法获取Blob或Clob类型的对象
iii. Blob调用getBytes或getInputStream方法获取Image等对象
iv. 代码如下:
PreparedStatement stat = conn.prepareStatement(“SELECT Cover FROM BookCovers WHERE ISBN=?”);
stat.set(1, isbn);
ResultSet result = stat.executeQuery();
If(result.next()){
//从ResultSet中获取Blob对象
Blob coverBlob = result.getBlob(1);
//Blob对象打开字节流,获取数据
Image coverImage = ImageIO.read(coverBlob.getBinaryStream());
}
v. 同理,Clob调用getSubString或getCharacterStream来获取字符数据
存储LOB对象到数据库流程
i. 在Connection对象上调用createBlob或createClob得到空的Blob、Clob
ii. 从Blob、Clob获取该LOB的输出流或写出器
iii. 将数据通过输出流写出数据到LOB对象中
iv. 将该LOB对象存储到数据库中
v. 代码如下:
Blob coverBlob = conn.createBlob();
int offset = 0;
OutputStream out = coverBlob.setBinaryStream(offset);
//将Image对象coverImage的数据用二进制流输出到Blob对象中
ImageIO.write(coverImage, “PNG”, out);
PreparedStatement stat = conn.prepareStatement(“INSERT INTO Cover VALUES (?,?)”);
stat.set(1, isbn);
//将Blob对象插入数据库中
stat.set(2, coverBlob);
stat.executeUpdate();
注意
从数据库中读取一个LOB或数组(SQL数组指值的序列,在java中是java.sql.array)时,并不等于获取了它的实际内容,
只有在访问具体的值时,它们才会从数据库中被读取出来,这对改善性能有好处,因为通常这些数据的数据量都非常大