这是jOOQ手册对这个主题的评价:
jOOQ当前不明确支持JDBC BLOB和CLOB数据
类型。如果您在数据库中使用这些数据类型中的任何一种,jOOQ将
将它们映射到byte []和String。在简单情况下(小数据),
这种简化就足够了。 在更复杂的情况下,您
可能不得不绕过jOOQ,以便处理这些数据类型和
他们各自的资源。
有没有办法绕过一些jOOQ,但仍保持代码相对干净?手动绑定LOB参数,但是将其他所有内容留给jOOQ?
我应该避免哪些可能的明显陷阱?
最佳答案
我为此找到了两个解决方案。
在第一种情况下,只需注入
JdbcTemplate
并使用此辅助代码:public static LobHandler getAppropriateLobHandler(Factory factory) {
LobHandler lobHandler = null;
switch( factory.getDialect() ) {
case ORACLE: lobHandler = new OracleLobHandler(); break;
default: lobHandler = new DefaultLobHandler(); break;
}
return lobHandler;
}
使用此代码读取BLOB:
return jdbcTemplate.queryForObject(
"select BLOB from TABLE where PK = ?",
args,
new RowMapper<InputStream>() {
@Override
public InputStream mapRow( ResultSet rs, int rowNum ) throws SQLException {
return lobHandler.getBlobAsBinaryStream( rs, 1 );
}
}
);
这是写给他们的:
jdbcTemplate.execute(
"update TABLE set BLOB = ? where PK = ?",
new AbstractLobCreatingPreparedStatementCallback( lobHandler ) {
@Override
protected void setValues( PreparedStatement ps, LobCreator lobCreator ) throws SQLException {
lobCreator.setBlobAsBinaryStream( ps, 1, stream, sizeInBytes );
ps.setLong( 2, pk );
}
}
);
在第二种情况下,除非您具有Oracle,否则请使用JDBC读写BLOB。使用Oracle时,需要使用其special C/BLOB locator pattern。