当前位置: 代码迷 >> Java Web开发 >> 求java PreparedStatement多条sql解决方法
  详细解决方案

求java PreparedStatement多条sql解决方法

热度:202   发布时间:2016-04-17 00:50:34.0
求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就行了
  相关解决方案