以下是 jOOQ 手册关于该主题的内容:
jOOQ 目前不明确支持 JDBC BLOB 和 CLOB 数据类型。如果您在数据库中使用这些数据类型中的任何一种,jOOQ 会将它们映射到 byte[] 和 String。在简单的情况下(小数据),这种简化就足够了。在更复杂的情况下,您可能不得不绕过 jOOQ,以便处理这些数据类型及其各自的资源。
有没有办法绕过一些jOOQ,但仍然保持代码相对干净?例如,手动绑定 LOB 参数,但将其他所有内容留给 jOOQ?
我应该避免哪些明显的陷阱?
我为此找到了两种解决方案。
春天的方法
非 Spring 方法
在第一种情况下,只需注入 aJdbcTemplate并使用此帮助代码:
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 时,您需要使用其特殊的 C/BLOB 定位器模式。