在jOOQ中进行B / CLOB处理

时间:2013-03-26 16:32:20

标签: java oracle jdbc jooq

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

  

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

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

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

1 个答案:

答案 0 :(得分:4)

我找到了两个解决方案。

  1. Spring方法

  2. 非春季方法

  3. 在第一种情况下,只需注入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