最近遇到关于使用Oracle数据库,JdbcTemplate插入数据无法返回主键的问题,如下代码:
KeyHolder keyHolder = new GeneratedKeyHolder();// 创建一个主键持有者
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement ps = con.prepareStatement(INSERT_LOG_SQL);
ps.setString(1, log.getServiceName());
ps.setInt(2, log.getServiceEventType());
ps.setString(3, log.getOper_userGuid());
ps.setString(4, log.getOper_ip());
ps.setTimestamp(5, Timestamp.valueOf(log.getOper_startTime()));
ps.setString(6, log.getInParams());
ps.setString(7, log.getDescription());
return ps;
}
}, keyHolder);
log.setAutoId(keyHolder.getKey().longValue());
但是单元测试无法通过,报错如下
百度了一下,有建议在SQL中insert主键,然后value中填入对应的sequence.nextval。但是仍然不成功。
最后发现,需要在此处指定主键
PreparedStatement ps = con.prepareStatement(INSERT_LOG_SQL,new String[]{"AutoId"});