当前位置: 首页 > 知识库问答 >
问题:

JdbcTemplate batchUpdate的问题

颛孙航
2023-03-14

有一个简单的要求,我必须对更新查询的对象列表进行batchUpdate。

问题是,运行代码后,在数据库表中,我只看到第一行得到更新,其余的没有得到更新。下面是我为此使用的示例代码。

公共void更新(列表列表){

    String sql = "UPDATE table1 \\\r\n"
            + "SET col1 = ?, col2 = ?, modified_on = UTC_TIMESTAMP() \\\r\n"
            + "WHERE col3 = ? \\\r\n"
            + "AND col4 = ? \\\r\n"
            + "AND col5 = ? \\\r\n"
            + "AND col6 = ?" // col5 will be different for different records.

        int[] rowsArray = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
            
            
            @Override
            public int getBatchSize() {
                return list.size();
            }
            @Override
            public void setValues(PreparedStatement ps, int index) throws SQLException {
                SampleClass sampleClass = list.get(index);
                
                ps.setString(1, sampleClass.getCol1());
                ps.setString(2, sampleClass.getCol2());
                ps.setString(3, sampleClass.getCol3());
                ps.setString(4, sampleClass.getCol4());
                ps.setString(5, sampleClass.getCol5());
                ps.setString(6, sampleClass.getCol6());
                
                
            }
        });

}

如果我的列表大小为 N,我什至可以确认 setValues() 方法确实执行了 N 次。但是仍然执行批处理更新,在数据库中只更新第一行。我什至尝试更改列表中对象的顺序,结果仍然相同。但是,如果我在循环中对 N 个大小列表运行 JdbcTemplate.update() 方法进行 N 次,则 N 条记录会在数据库中更新,但不会使用 JdbcTemplate.batchUpdat() 更新。我什至也尝试了命名参数Jdbc模板的解决方案,但仍然是相同的问题。此外,我在同一数据库中的其他表中执行批处理更新具有相同的逻辑,并且此操作在同一代码流中编码。一切都很好。

为什么只有第一条记录被更新?

共有1个答案

尹欣怿
2023-03-14

必须将每条记录添加到最终批次中。您的代码中缺少这一点。添加ps.addBatch()将解决您的问题

String sql = "UPDATE table1 \\\r\n"
        + "SET col1 = ?, col2 = ?, modified_on = UTC_TIMESTAMP() \\\r\n"
        + "WHERE col3 = ? \\\r\n"
        + "AND col4 = ? \\\r\n"
        + "AND col5 = ? \\\r\n"
        + "AND col6 = ?" // col5 will be different for different records.

    int[] rowsArray = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
        
        
        @Override
        public int getBatchSize() {
            return list.size();
        }
        @Override
        public void setValues(PreparedStatement ps, int index) throws SQLException {
            SampleClass sampleClass = list.get(index);
            
            ps.setString(1, sampleClass.getCol1());
            ps.setString(2, sampleClass.getCol2());
            ps.setString(3, sampleClass.getCol3());
            ps.setString(4, sampleClass.getCol4());
            ps.setString(5, sampleClass.getCol5());
            ps.setString(6, sampleClass.getCol6());
            
            ps.addBatch(); // Add this
        }
    });
 类似资料:
  • 这个FAQ的最新版本总是可以从Apache主站点得到,位于<http://httpd.apache.org/docs/2.2/faq/> 如果你的问题在这里没有找到答案,你也可以看看Apache 1.3 FAQ ,看你的问题是否在那里有了答案。 主题 背景 关于 Apache HTTP Server 的背景知识。 支持 我遇到问题该怎么办? 错误信息 这些错误信息是什么意思? 背景 什么是Apac

  • 我试图在fabric rocket chat上联系,但没有得到太多帮助,因此在SO上发布了它。我有以下疑问: 我们是否可以在链码内访问块高度(我知道这在客户端是可行的,但在链码内是否可能) 可以从链码中的正在进行的事务调用新事务吗? 想知道hyperledger Fabric中存储的数据的历史记录在哪里 我们可以根据链码中的transactionid进行查询吗? 在fabric链码中编写调度程序是

  • 问题内容: 我正在尝试创建一个程序,在该程序中,用户可以使用扫描仪将值输入到数组中。 但是,当程序要求学生的近亲时,它不会让用户输入任何内容而直接结束程序。 下面是我完成的代码: 我试过使用next(); 但只会使用用户输入的第一个单词,这不是我想要的。反正有解决这个问题的方法吗? 问题答案: 当您按Enter键(换行符)时,会出现问题。仅使用整数,但跳过换行符。要解决此问题,您可能需要在阅读后添

  • 我必须回到这个论坛寻求帮助,因为我不能仍然使‘承诺.所有’工作! 第一,我有这个函数,按说是回一个承诺: 其思想是上面的函数返回一个promise,其值一旦解析,就是json对象。我已经检查了json实际上是有效的。如果我用下面的行替换“return...”行,我实际上会得到一个有效的JSON: 第二,我有这个for循环,之后我希望有一系列承诺: 最终我执行以下代码: 我希望.then部分只在所有

  • null log4j2.xml将默认记录器根日志级别设置为info。但有时我需要指定debug。 在Windows PowerShell上执行上述命令行时出现错误 我尝试了-dlog4j.configurationfile=file://log4j.configurationfile=./log4j2.xml或-dlog4j.configurationfile=./log4j2.xml或-dlog

  • 比如现在有个接口,地址是/api/user/info 那么最终转发后的地址是 http://aaa.com/api/user/info 如果规则改成这样,在转发地址后加个/, 最终转发后的地址是: http://aaa.com/user/info 原因是什么呢?为什么转发地址后加/就会把/api给剃掉呢? 还有写成 /api 和 /api/ 好像效果是一样的,这两者的区别在哪呢?

  • 问题内容: 我正在尝试运行声纳运行器,我的项目目录中有蝙蝠文件,当我通过命令提示符导航至该文件并尝试运行它时,我收到一条错误消息,提示 错误:JAVA_HOME存在,但没有指向有效的Java主文件夹。在此找不到“ \ bin \ java.exe”文件。 如果我回显Java_Home的路径,它也指向 $ C:\ Program Files(x86)\ Java \ jdk1.7.0_15 \ bi

  • 我与一直存在权限问题。 我无法运行或。它给了我以下错误: AttributeError:“\u NamespacePath”对象没有“sort”属性 但是,将执行罚款。然后再次