mybati 批量操作的几种方式

来源:互联网 发布:英雄联盟上路小兵数据 编辑:程序博客网 时间:2024/05/29 01:52
有的时候,我们需要一次性插入很多的数据或者一次性更新、删除很多的数据,那么为了提高效率,我们需要使用批处理来完成。以下将讨论Mybatis+Spring如何使用批处理。

首先应该知道Mybatis是Ibatis的升级版,比Ibatis性能更好,这是我采用Mybatis的原因。

Ibatis是支持批处理的:

  1. public void batchAddExamlog(List examlogList) throws SQLException{                   
  2.     SqlMapClient smc=this.getSqlMapClient();                                           
  3.     try {                                                                              
  4.         smc.startTransaction();                                                          
  5.         smc.startBatch();                                                                                                                                                                                      
  6.         for (Iterator iter = examlogList.iterator(); iter.hasNext();) {  
  7.             Examlog log = (Examlog) iter.next();  
  8.             smc.update("insertExamlog", log);  
  9.         }                                                                              
  10.         smc.executeBatch();                                                              
  11.     }finally{                                                                          
  12.         smc.commitTransaction();                                                         
  13.         smc.endTransaction();                                                            
  14.     }                                                                                  
  15. }   


Mybatis接口实现批处理:

sessionFactory.openSession(ExecutorType.BATCH,true);//得到session,用于批量update


以上两种,他们都可以实现批处理。
但是当 Mybatis + Spring集成,且由Spring控制事务时,Mybatis这种批处理是不能使用的。
因为sessionFactory.openSession(ExecutorTypetype);方法会创建一个新的数据库连接,该连接不受Spring控制,将导致Spring的事务控制失效,它无法利用与当前线程绑定的session。

再看其他方式:

1、Mybatis主配置文件中,加入下面代码:
<configuration>
<settings>
<setting name="defaultExecutorType" value="BATCH"/>
</settings>
</configuration>
 -- 这是个总配置,所有操作都会生效,在任何一个事务中做的更改,在事务结束时提交,该事务内无法读取自己的操作结果。
 -- 它会导致所有方法 insert 无法返回id,update/delete 无法得到影响行数,所以、这个全局设置并不好。

2、配合(1)使用SqlSessionUtils.getSqlSession(sessionFactory).commit();

 -- 虽然数据在事务内提交了,但是依然无法获得自增id

3、mapper文件中使用foreach标签拼装语句

 -- 但是sql语句有长度限制,小数据量可以(当然也可以从数据库设置sql最长限制)。

4、获得当前连接,使用jdbc进行批处理操作。

 -- 这也不好,sql需要写在其他地方,不能写在Mapper文件中。

5、从Spring上下文中,实例化两个SqlSessionTemplate,一个使用批处理方式,一个不使用批处理,程序中适时而用。

 -- 无法获得自增id,且一个事务中不能同时使用两个SqlSessionTemplate。

6、从源代码,扩展自己的批处理实现。
1、BatchExecutor类的public List<BatchResult> doFlushStatements() throws SQLException方法最终执行批量操作,它将返回影响信息。
2、BatchExecutor.doFlushStatements() 方法在 Executor.commit() 方法中被调用。
3、Executor.commit() 在 SqlSession 中调用。
4、SqlSessionFactory 负责创建 SqlSession。

扩展SqlSessionFactory 创建我们定义的 MySqlSession,MySqlSession 最终可以调用到BatchExecutor.doFlushStatements() 获得影响结果

 -- 这种方式需要扩展源码。


总结了几种方式,大家在项目中看情况使用吧。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 汽车扣了50分怎么办 汽车扣了15分怎么办 汽车扣了27分怎么办 汽车扣了40分怎么办 行驶证掉了怎么办 异地 高速上没带驾驶证行驶证怎么办 身份证驾驶证行驶证都丢了怎么办 驾驶证年审过期一个月怎么办 柴油车辆年检尾气不合格怎么办 驾驶证过期了5天怎么办 过了审车时间怎么办 骑车没带行驶证怎么办 轿车行驶证丢了怎么办 车子没年检被扣怎么办 上海车辆年检过期了怎么办 行驶证过期十天怎么办 行驶证盖章满了怎么办 驾照c证扣12分怎么办 两年小车忘年审怎么办 4年车检过期了怎么办 车检过期了1周怎么办 超过检车几天了怎么办 驾驶证扣两个6分怎么办 行驶证检验有效期过期怎么办 驾驶证被扣26分怎么办 c1驾驶证扣26分怎么办 驾驶证被扣6分后怎么办 c1驾照年审过期一天怎么办 审驾照时间过了怎么办 b2驾驶证扣了分怎么办 a2驾照逾期未审怎么办 中学生只想打游戏不肯学习怎么办 汽车4年未年检怎么办 2年没有验车怎么办 驾驶证过期2年半怎么办 审车逾期一个月怎么办 摩托车驾驶证年审过期一个月怎么办 摩托车驾驶证记满12分怎么办 b2驾驶证扣2分该怎么办 b2扣6分以上怎么办 审驾照晚了3天怎么办