我正在尝试将生成的密钥检索到Oracle数据库。我正在使用带有jdbcTemplate的PreparedStatementSetter。我在这里已经阅读了关于此主题的其他StackOverflow post,但答案基本上建议远离StatementSetters。有没有办法在使用PreparedStatementSetter时检索密钥?使用PreparedStatementSetters检索密钥的文档非常稀少。
这是我的jdbcTemplate更新声明:
statementSetter.setUpdatedBy(...);
statementSetter.setFileStatus(...);
statementSetter.setCompany(...);
int modifiedCount = jdbcTemplate.update(sql, statementSetter);
这是我的SQL字符串:
database.insertFileControlRecordQuery = INSERT INTO MY_TABLE \
(PRIMARY_KEY_FIELD, FIELD2, FIELD3,...) VALUES (MY_TABLE_SEQ.NEXTVAL, ?,?, ...)
答案 0 :(得分:0)
按照注释中的建议使用NEXTVAL具有潜在的危险:如果在获取NEXTVAL和提交插入之间进行某些插入和提交操作,则其他过程将与您假定的键不同。
相反,我建议您使用具有返回键(即...
)的规定的update-function。JdbcTemplate.update(PreparedStatementCreator, KeyHolder);
...,从中可以确定密钥。
一个例子来说明:
String insertQuery="INSERT INTO MY_TABLE (FIELD1, FIELD2) " +
"VALUES (?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
PreparedStatementCreator preparedStatementCreator = connection -> {
PreparedStatement preparedStatement = connection.prepareStatement(insertQuery, new String[]{"PRIMARY_KEY_FIELD"});
preparedStatement.setString(1, field1);
preparedStatement.setDate(2, field2);
return preparedStatement;
};
jdbcTemplate.update(preparedStatementCreator, keyHolder);
Number primaryKey = keyHolder.getKey();
请注意,在创建PreparedStatement时保留主键的列的设置对于Oracle是必不可少的!没有它,您将获得ROWID。