我遇到了一个关于JdbcTemplate.update(String sql,Object [] args,int [] argTypes)的相当混乱的问题。我正在开发一个Web应用程序,在我的userDao的添加和更新方法中,我有以下代码:
userDao.addUser
public int addUser(User user) {
String sql = "insert into users (firstName, lastName, username) values (?, ?, ?)";
Object[] args = {
user.getFirstName(),
user.getLastName(),
user.getUsername()
};
int[] types = {VARCHAR, VARCHAR, VARCHAR};
return jdbcTemplate.update(sql, args, types);
}
userDao.update
public int update(User user) {
StringBuffer sql = new StringBuffer("update users ");
ArrayList<Integer> typesList = new ArrayList<>();
ArrayList<Object> argsList = new ArrayList<>();
if ((user.getFirstName() != null) && (!user.getFirstName().equals(""))) {
sql.append("set firstName = ? ");
typesList.add(VARCHAR);
argsList.add(user.getFirstName());
} else if ((user.getLastName() != null) && (!user.getLastName().equals(""))) {
sql.append("set lastName = ? ");
typesList.add(VARCHAR);
argsList.add(user.getLastName());
} else if ((user.getUsername() != null) && (!user.getUsername().equals(""))) {
sql.append("set username = ? ");
typesList.add(VARCHAR);
argsList.add(user.getUsername());
}
sql.append("where userID = ?");
typesList.add(INTEGER);
argsList.add(user.getUserID());
Integer[] types = typesList.toArray(new Integer[0]);
Object[] args = argsList.toArray();
return jdbcTemplate.update(sql.toString(), args);
// return jdbcTemplate.update(sql.toString(), args, types);
}
我花了几个小时搜索SO和其他论坛寻找解决方案,但没有任何东西符合我的问题。从技术上讲,上面的代码工作正常,但更多的是缺乏对此代码段工作原理的理解(为简洁起见,args参数来自上面的代码):
摘录1:
int[] types = {VARCHAR, VARCHAR, VARCHAR};
return jdbcTemplate.update(sql, args, types);
以及为什么不这样做:
摘录2:
Integer[] types = typesList.toArray(new Integer[0]);
return jdbcTemplate.update(sql.toString(), args, types);
事实上,代码片段2没有任何编译或运行时错误,但更新不会发生,直到我删除第三个参数,如上所示。
在IntelliJ中,集成文档显示了带有3个参数的snippet 1的javadoc(这是我所期望的),但在代码段2中,javadoc用于错误的更新方法(它显示了用于public int update的javadoc) String sql,Object ... args)抛出org.springframework.dao.DataAccessException而不是)。
我得出的唯一线索可能是由于自动装箱/拆箱。其他人可以解释一下吗?