Java中的addBatch()执行

Java中的addBatch()执行,java,jdbc,Java,Jdbc,下面代码的问题是,假设queries[]数组中的一个特定查询包含一个错误,则语句查询将执行,并引发带有错误的查询的异常,如果两个查询都没有错误,则我希望执行两个查询,否则不应执行任何查询,我应该如何处理下面的代码以获得所需的结果?请帮忙 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { int rw = j

下面代码的问题是,假设queries[]数组中的一个特定查询包含一个错误,则语句查询将执行,并引发带有错误的查询的异常,如果两个查询都没有错误,则我希望执行两个查询,否则不应执行任何查询,我应该如何处理下面的代码以获得所需的结果?请帮忙

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        int rw = jTable1.getRowCount();
        int col = jTable1.getColumnCount();
        System.out.println("RC" + rw);
        System.out.println("Col" + col);
        String queries[] = new String[rw];
        Object o[][] = new Object[rw][col];
        String poid = jComboBox10.getSelectedItem().toString();
        java.sql.Date xdate = null;
        Connection con=null;
        Statement st=null;
       String cc = ims.MainWindow.cc;
        try {
            for (int i = 0; i < rw; i++) {
                for (int j = 0; j < col; j++) {
                    o[i][j] = jTable1.getValueAt(i, j);
                    System.out.println("imj" + i + "," + j + "=" + o[i][j]);
                }
                if (String.valueOf(o[i][5]) == "") {
                    xdate=null;
                }
                else {
                                        xdate = new java.sql.Date(df.parse(String.valueOf(o[i][5])).getTime());

                }
                queries[i] = "insert into po_items values('" + poid + "','" + cc + "','" + o[i][1] + "'," + o[i][2] + "," + o[i][4] + ",'" + xdate + "','" + o[i][7] + "'," + o[i][8] + ")";
            }

            for (int k = 0; k < rw; k++) {
                System.out.println(queries[k]);
            }
            String query = "insert into tablex values('xx','yy')";
            con=CPool.getConnection();
            st=con.createStatement();
                con.setAutoCommit(false);
                for(int l=0;l<rw;l++)
                {
                    st.addBatch(queries[l]);
                }
                st.addBatch(query);
                st.executeBatch();
                con.commit();
            System.out.println(query);
        } catch (Exception x) {
            System.out.println(x.getMessage());
        }
        finally {
              CPool.closeConnection(con);
              CPool.closeStatement(st);
        }

    }         
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){
int rw=jTable1.getRowCount();
int col=jTable1.getColumnCount();
系统输出打印项次(“RC”+rw);
系统输出打印项次(“列”+列);
字符串查询[]=新字符串[rw];
对象o[][]=新对象[rw][col];
字符串poid=JCombox10.getSelectedItem().toString();
java.sql.Date xdate=null;
连接con=null;
语句st=null;
字符串cc=ims.MainWindow.cc;
试一试{
对于(int i=0;i对于(int l=0;l,除非执行/触发查询,否则您不知道查询是否会出错


但是,您可以在数据库事务中对查询进行分组,如果所有查询都正常,则执行提交,如果任何查询失败,则执行回滚。您可以使用try-catch块来实现这一点(在异常时执行回滚;否则执行提交).

如果发生异常,则在关闭连接之前既不执行
回滚
也不执行
提交
,这将导致未指定的行为。每当
try
块未正常完成时,必须执行
回滚


另一方面,只有将JDBC批处理API与
PreparedStatement
结合使用,批处理条目仅在同一语句的参数中变化,使用JDBC批处理API才能带来性能。正如其他地方所建议的那样,
PreparedStatement
是一种方法,无论您是否希望免受SQL注入攻击。

警告:您的代码易受攻击。要避免此漏洞(并获得一些附加好处),使用准备好的语句并使用
set*
方法设置参数。我想补充一点,他已经这样做了,不是吗?如果execBatch抛出SQLException,con.commit将不会执行。或者我遗漏了什么…@Fildor我没有看到他做回滚,这对于模拟没有执行e查询。答案也是为了强调,不执行查询就很难判断查询是否会失败。另外一个注意事项:批处理只会增加性能(over
PreparedStatement
)如果数据库实际上支持批处理,否则驱动程序将只模拟批处理。然而,在支持批处理的数据库上,即使使用正常的
语句
,它实际上也可能带来较小的性能好处,因为驱动程序可能一次发送所有查询:而不是
nx的开销(发送查询,接收查询结果)
,它变成
发送(nx查询),接收(nx查询结果)
@MarkrotVeel+1我还认为,如果你一直使用结构相同的语句,即使该语句没有准备好,你也可能会经历加速。一如既往,取决于特定的驱动因素。不过,我不想淡化我的主要观点,因此我避免在回答中包含这些微妙之处。