Я пришел сюда в поисках тот же ответ, но не был удовлетворен тем, что было принято. Так что я сделал немного покопаться вокруг и пришел с этим решением, которое я испытывал в Oracle 10g и Spring 3,0
public Long save(final byte[] blob) {
KeyHolder keyHolder = new GeneratedKeyHolder();
String sql = "insert into blobtest (myblob) values (?)"; //requires auto increment column based on triggers
getSimpleJdbcTemplate().getJdbcOperations().update(new AbstractLobPreparedStatementCreator(lobHandler, sql, "ID") {
@Override
protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException, DataAccessException {
lobCreator.setBlobAsBytes(ps, 1, blob);
}
}, keyHolder);
Long newId = keyHolder.getKey().longValue();
return newId;
}
это также требует следующего абстрактного класса, частично на основе Spring, AbstractLobCreatingPreparedStatementCallback
public abstract class AbstractLobPreparedStatementCreator implements PreparedStatementCreator {
private final LobHandler lobHandler;
private final String sql;
private final String keyColumn;
public AbstractLobPreparedStatementCreator(LobHandler lobHandler, String sql, String keyColumn) {
this.lobHandler = lobHandler;
this.sql = sql;
this.keyColumn = keyColumn;
}
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement ps = con.prepareStatement(sql, new String[] { keyColumn });
LobCreator lobCreator = this.lobHandler.getLobCreator();
setValues(ps, lobCreator);
return ps;
}
protected abstract void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException, DataAccessException;
}
Кроме того, таблица, которую вы создаете в Oracle, должна иметь автоинкрементный столбец для идентификатора, используя последовательность и триггер. Триггер необходим, потому что в противном случае вам придется использовать функцию NamedParameterJdbcOperations от Spring (для выполнения последовательности.nextval в вашем SQL), которая, похоже, не поддерживает KeyHolder (которую я использую для получения идентификатора авто-gen). Смотрите этот блог (не мой блог) для получения дополнительной информации: http://www.lifeaftercoffee.com/2006/02/17/how-to-create-auto-increment-columns-in-oracle/
create table blobtest (
id number primary key,
myblob blob);
create sequence blobseq start with 1 increment by 1;
CREATE OR REPLACE TRIGGER blob_trigger
BEFORE INSERT
ON blobtest
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
SELECT blobseq.nextval INTO :NEW.ID FROM dual;
end;
/
Принимая этот ответ из-за всех upvotes. Вы должны заменить 'getSimpleJdbcTemplate(). GetJdbcOperations()' с 'getJdbcTemplate()', поскольку SimpleJdbcTemplate теперь устарел. – itsadok