java中PreparedStatement的批处理问题

我是使用pstmt = conn.prepareStatement(sql);得到PreparedStatement类后

通过pstmt.setString(1, "eaa");等代码补充sql语句

         多次使用pstmt.addBatch();增加预编译

最后执行pstmt.executeBatch();执行所有预编译过的sql语句

通过conn.commit();提交到mysql数据库中。

例子如下:

Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection("jdbc:mysql://" + "localhost" + ":3306/" + "test" + "?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&autoReconnect=true", "root", "mysql");
            conn.setAutoCommit(false);


            String sql = "REPLACE INTO type_id(type) VALUES(?)";
            pstmt = conn.prepareStatement(sql);


            pstmt.setString(1, "eaASaa");
            pstmt.addBatch();
            pstmt.setString(1, "a");
            pstmt.addBatch();
            pstmt.setString(1, "b");
            pstmt.addBatch();
            pstmt.setString(1, "c");
            pstmt.addBatch();
            pstmt.setString(1, "a");
            pstmt.addBatch();
            pstmt.setString(1, "eaa");
            pstmt.addBatch();
             pstmt.setString(1, "d");
            pstmt.addBatch();
            
            int[] sss = pstmt.executeBatch();
            conn.commit();
            System.out.println("sss.length=" + sss.length);


        } catch (Exception ex) {
            Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
            try {
               
pstmt.setString(1, "g");
                pstmt.addBatch();
                 pstmt.setString(1, "l");
                pstmt.addBatch();
                int[] sss = pstmt.executeBatch();
            conn.commit();
            } catch (SQLException ex1) {
                Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex1);
            }
            
        } finally {
            if (pstmt != null) {
                try {
                    pstmt.close();
                } catch (SQLException ex) {
                    Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }


    }


但是当我预编译的sql有错误,会出现什么情况呢?

通过实验得到以下结论:

批处理执行(pstmt.executeBatch();)时是根据添加预编译的顺序来执行的,如果是第一条错了那么所有的sql都不会执行;

如果是中间或者后面的sql错了,第一个错误之前的所有sql都会成功执行,当批处理运行到错误的sql时,直接跳到catch中,如果在catch中commit会发现数据库中成功插入了一些数据。ps:如果想要把批处理中所有正确的sql都成功插入,那么可以INSERT IGNORE INTO来插入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值