如何正确使用JdbcTemplate.update与KeyHolder?

我有一个方法将用户保存在DB中并返回自动生成的id:

public int save(User user) {
    KeyHolder holder = new GeneratedKeyHolder();
    jdbcTemplate.update(SAVE_USER, user.getParams(), holder);
    return holder.getKey().intValue();
}

public Object[] getParams() {
        return new Object[]{
                email, // String email
                password}; // String password
}

SAVE_USER = INSERT INTO用户(电子邮件,密码)VALUES(?,?)

当我尝试执行一个方法时,我得到一个例外:

Request processing failed; nested exception is org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; 
SQL [INSERT INTO user (email, password) VALUES (?, ?)]; Invalid argument value: java.io.NotSerializableException; nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException

最佳答案 看起来你正在使用Spring.根据版本的不同,JdbcTemplate接口会有所不同.尽管如此,在我所知道的任何版本中都没有符合我认为您的预期呼叫的方法签名:

update(String sql, Object[] args, KeyHolder keyHolder)

截至春季3,只有:

update(PreparedStatementCreator psc) 
update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) 
update(PreparedStatementCreator psc, PreparedStatementSetter pss) 
update(java.lang.String sql) 
update(java.lang.String sql, java.lang.Object[] args, int[] argTypes) 
update(String sql, PreparedStatementSetter pss) 

/* and this is the one I think you're matching */
update(java.lang.String sql, java.lang.Object... args)  

不幸的是,即使您的呼叫与最后一个方法的签名相匹配,它也不会执行我认为您正在寻找的内容.它尝试将每个参数作为单个参数应用于SQL语句.在这种情况下,你的KeyHolder是不合适的,并且params数组必须作为单独的参数分割出来.基本上,这种方法对你正在做的事情不起作用.

如果你想使用KeyHolder,我认为你需要改变你的方法来使用这个方法:

update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) 
点赞