6

jOOQマニュアルはこの主題について次のように述べています。

jOOQは現在、JDBCBLOBおよびCLOBデータ型を明示的にサポートしていません。データベースでこれらのデータ型のいずれかを使用する場合、jOOQは代わりにそれらをbyte[]およびStringにマップします。単純なケース(小さなデータ)では、この単純化で十分です。より洗練されたケースでは、これらのデータ型とそれぞれのリソースを処理するために、jOOQをバイパスする必要がある場合があります。

jOOQの一部をバイパスする方法はありますが、それでもコードを比較的クリーンに保つことができますか?LOBパラメータを手動でバインドしますが、他のすべてはjOOQに任せますか?

そして、私が避けなければならない可能性のある明らかな落とし穴は何ですか?

4

1 に答える 1

4

私はこれに対する2つの解決策を見つけました。

  1. 春のアプローチ

  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 );
                }
            }
        );

2番目のケースでは、Oracleがない限り、JDBCを使用してBLOBの読み取りと書き込みを行います。Oracleを使用している場合は、特別なC/BLOBロケーターパターンを使用する必要があります。

于 2013-03-26T16:52:37.213 に答える