在jOOQ中进行B/CLOB处理

biz*_*lop 6 java oracle jdbc jooq

以下是jOOQ手册对该主题的评价:

jOOQ目前没有明确支持JDBC BLOB和CLOB数据类型.如果在数据库中使用任何这些数据类型,jOOQ会将它们映射到byte []和String.在简单的情况下(小数据),这种简化就足够了.在更复杂的情况下,您可能必须绕过jOOQ,以便处理这些数据类型及其各自的资源.

有没有办法绕过一些jOOQ,但仍然保持代码相对干净?手动绑定LOB参数但是将其他所有内容留给jOOQ例如?

我应该避免哪些明显的陷阱?

Aar*_*lla 4

我为此找到了两个解决方案。

  1. 春天的方法

  2. 非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;
}
Run Code Online (Sandbox Code Playgroud)

使用以下代码读取 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 );
            }
        }
    );
Run Code Online (Sandbox Code Playgroud)

并这样写:

   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 );
                }
            }
        );
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,除非您有 Oracle,否则请使用 JDBC 读取和写入 BLOB。当你有Oracle时,你需要使用他们特殊的C/BLOB定位器模式