问题如下:本人现在有三张表,这三张表是有关系的,必须保证数据的完整性,所以在此处需要同时操作三张表,通过事务一次提交到数据库,如果有一个表写入出错需要数据回滚数据。现贴出代码,此代码只能写入最后一条数据,前面数据都是无法写入,希望大家给点办法。
- 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就行了