关于JdbcTemplate.update的困惑

时间:2017-01-31 15:09:11

标签: java spring jdbctemplate

我遇到了一个关于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而不是)。

我得出的唯一线索可能是由于自动装箱/拆箱。其他人可以解释一下吗?

0 个答案:

没有答案