这是jOOQ手册对这个主题的评价:

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


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

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

最佳答案

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

  • Spring 方法
  • 非 Spring 方法

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

    07-24 09:38
    查看更多