日期:2014-05-17  浏览次数:20671 次

求java PreparedStatement多条sql解决办法
问题如下:本人现在有三张表,这三张表是有关系的,必须保证数据的完整性,所以在此处需要同时操作三张表,通过事务一次提交到数据库,如果有一个表写入出错需要数据回滚数据。现贴出代码,此代码只能写入最后一条数据,前面数据都是无法写入,希望大家给点办法。
Java code

protected void executeBatchUpdate(List<String> sqList,List<Object[]> parasList){
            try {
                for(int i=0;i<sqList.size();i++){
                    prstmt = conn.prepareStatement(sqList.get(i));
                    if(parasList != null){
                        int length = parasList.get(i).length > 0? parasList.get(i).length:0;
                        for(int j=0;j<length;++j){
                                prstmt.setObject(j+1, parasList.get(i)[j]);
                        }
                    }
                    prstmt.addBatch();
                }
                prstmt.executeBatch();
                conn.commit();
            } catch (Exception e) {
                e.printStackTrace();
                try {
                    conn.rollback();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }finally{
                closePrstmt();
            }        
    }




------解决方案--------------------
恩, 你的意思是,重点在于事务的控制吗? 如果你希望是这么做的话,分层原理啊。 在服务层的一个方法体内进行三次 业务sql操作, 在Dao层 有3个方法体来执行sqlDDL操作。 管理事务在service就好了,即使出现错误也会回滚的。
------解决方案--------------------
那你尝试每读取一条sql就执行一次,不要使用addBatch。另外,你得在for循环外层执行一个conn.setAutoCommit(false);
------解决方案--------------------
PreparedStatement的批量操作两种用法
1.addBatch()参数为空,这种用法是同一个sql语句,然后有几组参数,常见用于批量新增
sql="insert into tablea values(?,?)";
String[][] params=new Strng[][]{{1,2},{3,4}};
2.addBatch(sql)参数为sql,这个sql是一个完整的sql,即已经拼接好了的
addBatch("insert into tablea values(1,2)");
addBatch("insert into tablea values(3,4)");


你这里PreparedStatement是在for循环里面创建的,完全不需要batch,在for循环里面exceuteUpdate就行了