有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何正确使用JdbcTemplate。用钥匙夹更新?

我有一个方法可以将用户保存在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
}

保存用户=INSERT INTO user (email, password) 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

共 (1) 个答案

  1. # 1 楼答案

    看起来你在用Spring。JdbcTemplate接口因版本而异。尽管如此,在我所知的任何版本中,都没有一个方法签名与我认为您的预期调用相匹配:

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

    从Spring 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语句。在这种情况下,您的密钥持有者不合适,必须将params数组作为单个参数拆分。基本上,这种方法对你正在做的事情不起作用

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

    update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)