私はこれに対する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ロケーターパターンを使用する必要があります。