我想使用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,而不是将它们作为参数发送?
答案 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 )";