gpt4 book ai didi

java - 如何正确使用 JdbcTemplate.update 和 KeyHolder?

转载 作者:搜寻专家 更新时间:2023-11-01 03:23:29 36 4
gpt4 key购买 nike

我有一个将用户保存在数据库中并返回自动生成的 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 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

最佳答案

看起来您正在使用 Spring。根据版本的不同,JdbcTemplate 接口(interface)会有所不同。不过,在我所知道的版本中,没有一个方法签名与我认为您的预期调用相匹配:

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 语句。在这种情况下,您的 KeyHolder 不合适,并且必须将 params 数组拆分为单独的参数。基本上,该方法不适用于您正在做的事情。

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

update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) 

关于java - 如何正确使用 JdbcTemplate.update 和 KeyHolder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22102119/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com