数据库进行批量更新的时候,如果我们是通过普通的方式进行insert和update的话,执行效率比较低,而且如果涉及到大量的更新操作的时候,每个操作都会开启一个新的事务。而且若果执行过程中出现错误的话,很容易导致脏数据的出现,不易回滚。
为了提高大量数据的更新效率问题,引入了批处理的概念。
批处理就是ibatis通过把多个对数据库的操作,让数据库驱动以压缩的方式去批量执行更新命令,不需要每个都分开执行,提高执行的效率。
批处理解决了数据库的效率问题,但是还没有解决回滚和脏数据等问题,因为批处理执行的过程中,每执行一条更新语句,都会进行一次提交,这样子的话,如果其中的部分更新语句执行失败,那么就会产生脏数据的问题。并且,每条语句都提交一次的话,也比较损耗数据库的性能。
为了解决数据的脏数据和进一步提高批量执行的效率,需要引入开启事务来处理这个问题
开启事务的话,数据库的批处理如果有语句出错的话,可以有机会对整个事务进行回滚,不用为脏数据问题担忧。回滚类似于oracle每个客户端的rollback一样的效果。其实我们在事务没有提交之前,更新的是内存中的数据,并不是数据库的磁盘上面的数据。
整体语句可以参考下面的:
public void saveOrder (SqlMapClient sqlMapClient, Order order)
throws SQLException {
<span style="white-space:pre"> </span><span style="color:#000099;">sqlMapClient. startTransaction();</span>
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>if (null == order.getOrderId()) {
<span style="white-space:pre"> </span>sqlMapClient. insert ("Order. insert", order);
<span style="white-space:pre"> </span>}
<span style="white-space: pre;"> </span>else {
<span style="white-space:pre"> </span>sqlMapClient. update ("Order.update", order);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span><span style="color:#ff0000;">sqlMapClient. startBatch() ; </span>
<span style="white-space:pre"> </span>sqlMapClient .delete ("Order .deleteDetails", order);
<span style="white-space:pre"> </span>for (int i=O;i<order.getOrderItems() .size();i++){
<span style="white-space:pre"> </span>OrderItem oi = (OrderItem) 0玄der.getOrderrtems () . get (i) ;
<span style="white-space:pre"> </span>oi. setOrderld (order .getOrderId () ) ;
<span style="white-space:pre"> </span>sqlMapClient.insert ("OrderItem. insert", oi);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span><span style="color:#ff0000;">sqlMapClient .executeBatch () ; </span>
<span style="white-space:pre"> </span><span style="background-color: rgb(0, 0, 153);">sqlMapClient .commitTransaction () ; </span>
} finally {
<span style="color:#000066;">sqlMapClienc. endTransaction () ; </span>
}
}
上面代码中,红色是批处理代码块,蓝色是事务代码块。
注:java代码中,批处理中间的代码块只是用来构造执行的语句,并不会执行,只有最后的executeBatch才会开始执行生成的语句。