/**
*
* @param query 表示sql语句
* @param idForQuery 标识主键
* @param value 表示需要写入的字符串数据
* @throws Exception
*/
public static void writeBlobGBKBinaryStream(String query, int idForQuery,
String value) throws Exception {
PreparedStatement p = null;
ResultSet rs = null;
OutputStream blobWriter = null;
try {
p = JForumExecutionContext.getConnection().prepareStatement(query);
p.setInt(1, idForQuery);
rs = p.executeQuery();
rs.next();
Blob text = rs.getBlob(1);//在此获取第一个blob类型的字段,如果知道该段名称,也可以使用该名称
if (text instanceof BLOB) {
blobWriter = ((BLOB) text).getBinaryOutputStream();//获取字节输出流
} else {
blobWriter = text.setBinaryStream(0);
}
blobWriter.write(value.getBytes("GBK"));//写出数据blobW
blobWriter.close();
} catch (IOException e) {
throw new DatabaseException(e);
} finally {
if (blobWriter != null) {
blobWriter.close();
}
DbUtils.close(rs, p);
}
}
注意以下几点:
1,本方法只能插入一条记录,其本质上不是insert,而是update,因为当调用该方法之前,表中已存在一条数据,其blob类型的字段为空值,在此把空值填补上。
2,通过query参数是一个select参数,而不是insert或update,比如SELECT vblob FROM pub_t_bu_image where datakey=? FOR UPDATE 别忘记for update。在执行完查询之后别忘记rs.next(),这样才能定位到该条记录中。
3,一条记录中也可以加入多个blob类型数据。Blob text = rs.getBlob(1);可以理解为在select 语句中,我要获得第一个blob类型字段,如果有多个可以设置编号的不同,如果明确知道字段的名称,也可以直接使用。
4,获得流getBinaryOutputStream(),该方法在oracle.sql包中,与使用必先导入,另外需要验证类型是否为blob。
读的时候与之类似,不再赘述,只是注意编码方式保持一致。