JDBC - PreparedStatement executeUpdate() 返回 0

Posted

技术标签:

【中文标题】JDBC - PreparedStatement executeUpdate() 返回 0【英文标题】:JDBC - PreparedStatement executeUpdate() returning 0 【发布时间】:2017-08-25 08:26:50 【问题描述】:
try
    Connection conn = getConnection();
    String strUpdateQuery = "update payment_table set  CREDIT_CARD_NO = ? where PAYMENT_KEY= ?";
    PreparedStatement ps =conn.prepareStatement(strUpdateQuery);
    for(int i=0;i<nodes.getLength();i++)
                ps.setString(1,"524364OQNBQQ4291");
                ps.setString(2,"20130215123757533280168");
                ps.executeUpdate();
                conn.commit();
    
catch(SQLException e)
    e.printStackTrace();

即使我检查了主键是否正确,也不会更新一行。

【问题讨论】:

您是否缺少 beginTransaction ? 另外,为什么是循环? 你想用你的标题表达什么?这似乎与您的实际问题无关。 请出示getConnection的代码、您的DDL和示例数据以重现此内容。还要指定您正在使用的数据库。 @ScaryWombat 事务在必要时在 JDBC 中隐式启动(例如,当执行语句并且没有事务处于活动状态时),并且鉴于他正在调用 commit(),我们可以假设禁用自动提交(否则调用 commit 应该抛出异常) 【参考方案1】:

尝试批量更新:

void batchUpdate() 
    String strUpdateQuery = "UPDATE payment_table " +
                            "SET CREDIT_CARD_NO = ? " +
                            "WHERE PAYMENT_KEY= ?";
    try (Connection conn = getConnection();
         PreparedStatement ps = conn.prepareStatement(strUpdateQuery)) 
        for (int i = 0; i < nodes.getLength(); i++) 
            ps.setString(1, "524364OQNBQQ4291");
            ps.setString(2, "20130215123757533280168");
            ps.addBatch();
        
        int[] updated = ps.executeBatch();
        // can log updated rows from "updated"
        // conn.commit(); in case autocommit set to false or used conn.setAutoCommit(false) somewhere
    
    catch (SQLException e) 
        e.printStackTrace();
    

【讨论】:

是的,我也尝试过批量更新。但也没有错误,没有运气。是的,我在我的代码中使用了 conn.setAutoCommit(false)。 此建议与所描述的问题并不真正相关。

以上是关于JDBC - PreparedStatement executeUpdate() 返回 0的主要内容,如果未能解决你的问题,请参考以下文章

JDBC - 语句、PreparedStatement、CallableStatement 和缓存

JDBC封装学习笔记---面向对象的JDBC,使用preparedStatement

JDBC深入理解Statement和PreparedStatement

jdbc防止sql注入-PreparedStatement

JDBC中的Statement和PreparedStatement的区别

关于JDBC预处理功能PreparedStatement