Spring JDBCTemplate更新多行

时间:2016-03-09 22:19:41

标签: mysql spring spring-boot jdbctemplate

我想使用JDBCTemplate更新多行,只使用一个语句修复值。我的函数获取了一个id列表,我使用Guava的Joiner将它们连接成一个字符串。当我尝试调用JDBCTemplate的更新函数时,使用连接的ids作为参数,它只更新第一个元素,就好像在某个地方,在最终查询中注入“限制1”。

private int increase(final List<Long> ids){
    String query = "UPDATE mytable" +
                   "   SET count = count + 1," +
                   "       last_modified = NOW()" +
                   " WHERE id IN ( ? )";
    Object[] args = {Joiner.on(",").join(ids)};
    return jdbcTemplate.update(query, args);
}

我的代码中有什么问题吗?我使用了错误的方法吗?这是库中的错误吗?我应该只是在查询中连接id,而不是将它们作为参数发送?

3 个答案:

答案 0 :(得分:1)

以下是在Spring中执行此操作的方法。

使用JdbcTemplate

  

batchUpdate(String sql,BatchPreparedStatementSetter pss)

import '../style/core.scss'

检查this post,看看它是否能让你更清楚。

答案 1 :(得分:0)

我不确定自您发布此问题后 API 是否已更改,但截至目前,您不需要使用 batchUpdate。您使用的 update 方法工作正常。

我在您的代码片段中看到的问题是:

Object[] args = {Joiner.on(",").join(ids)};

没有必要这样做 - 您所做的是创建了一个包含逗号作为单个 id 的字符串,而不是多个 id 的列表。你实际上已经把它复杂化了,你需要的只是:

private int increase(final List<Long> ids){
    String query = "UPDATE mytable" +
                   "   SET count = count + 1," +
                   "       last_modified = NOW()" +
                   " WHERE id IN ( ? )";
    Object[] args = { ids };
    return jdbcTemplate.update(query, args);
}

答案 2 :(得分:0)

您不需要任何其他库来将列表传递给 Jdbctemplate。 可以通过以下方式轻松完成:

创建一个NamedParameterJdbcTemplate的对象,然后简单的使用

MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("ids", ids);
namedParameterJdbcTemplate.update(query, parameters);

IN 更改为 (:ids) 而不是 ?喜欢

<块引用>

字符串查询 = "UPDATE mytable" + " SET 计数 = 计数 + 1," + " last_modified = NOW()" + " 在哪里 id ( :ids )";