JdbcTemplate如何处理更新操作的返回值?

JdbcTemplate执行更新操作(INSERT/UPDATE/DELETE)主要通过update()方法,它返回一个整数表示影响的行数。
例如:

int rows = jdbcTemplate.update("UPDATE table_name SET name=? WHERE id=?", "Mike", 10); 

此外,JdbcTemplate还提供了一些插入操作的重载方法,可以返回自动生成的键值:

  1. update(PreparedStatementCreator psc) :
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
    public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
        PreparedStatement ps = con.prepareStatement("INSERT INTO table_name ...", Statement.RETURN_GENERATED_KEYS);
        return ps;
    }
}, keyHolder);
Number key = keyHolder.getKey();
  1. update(final String sql, final PreparedStatementSetter pss) :
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
    "INSERT INTO table_name (name) VALUES (?)", 
    new PreparedStatementSetter() {
        public void setValues(PreparedStatement ps) throws SQLException {
            ps.setString(1, "John");
        }
    },
    keyHolder
);
Number key = keyHolder.getKey();  
  1. update(final String sql, Object… args) :
final String sql = "INSERT INTO table_name (name) VALUES (?)";
KeyHolder keyHolder = new GeneratedKeyHolder(); 
jdbcTemplate.update(sql, "John", keyHolder);
Number key = keyHolder.getKey();

所以,在执行插入操作时,JdbcTemplate可以通过以下几种方式返回自动生成的键值:

  1. 实现PreparedStatementCreator接口,在createPreparedStatement方法中指定RETURN_GENERATED_KEYS,然后从KeyHolder中获取键值。
  2. 实现PreparedStatementSetter接口设置值,同时传入KeyHolder作为额外参数以获取键值。
  3. 直接传递SQL语句与参数数组,以及KeyHolder来获取自动生成的键值。

在更新操作时,要注意update()方法返回的行数,以判断操作是否成功执行。在插入操作时,通过KeyHolder可以获取自动生成的键值。