返回生成密钥preparestatementsetter

时间:2017-05-18 17:06:15

标签: java spring-jdbc

我正在尝试将生成的密钥检索到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, ?,?, ...)

1 个答案:

答案 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。