【问题标题】:B/CLOB handling in jOOQjOOQ 中的 B/CLOB 处理
【发布时间】:2013-03-16 13:32:35
【问题描述】:

以下是 jOOQ 手册关于该主题的内容:

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

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

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

【问题讨论】:

  • 除了 Aaron 的建议外,目前 jOOQ 中没有任何“相对干净”的方式来处理 LOB。随时加入discussion on the jOOQ User Group 以帮助定义功能请求

标签: java oracle jdbc jooq


【解决方案1】:

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

  1. Spring 方法

  2. 非弹簧方法

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

【讨论】:

  • 这很有用,但它是普通的 JDBC 解决方案,是最后的手段。我在考虑干扰 jOOQ 的参数绑定。
  • jOOQ 不支持它,因为无法通过参数绑定来做到这一点。问题之一是您需要一个流和一个大小,即您需要将 两个 参数绑定到查询中的一个值。下一个问题是如何知道何时关闭流。
  • 我知道,但是我想在jOOQ绑定它所能绑定的所有参数后截取PreparedStatement,并在其中添加LOB。
  • 您仍然可以使用 jOOQ 生成 SQL 字符串,例如int unused=-1; select(BLOB).from(TABLE).where(PK.eq(unused)).getSQL()记得自己绑定参数
猜你喜欢
  • 2018-06-05
  • 1970-01-01
  • 2013-11-22
  • 2011-07-29
  • 2020-08-28
  • 1970-01-01
  • 2015-11-11
  • 2017-12-04
  • 1970-01-01
相关资源
最近更新 更多