当前位置:   article > 正文

Mybatis实现批量更新操作 三种方式_mybatis批量更新

mybatis批量更新

Mybatis实现批量更新操作
方式一:

  1. <update id="updateBatch"  parameterType="java.util.List">  
  2.     <foreach collection="list" item="item" index="index" open="" close="" separator=";">
  3.         update tableName
  4.         <set>
  5.             name=${item.name},
  6.             name2=${item.name2}
  7.         </set>
  8.         where id = ${item.id}
  9.     </foreach>      
  10. </update>


但Mybatis映射文件中的sql语句默认是不支持以" ; " 结尾的,也就是不支持多条sql语句的执行。所以需要在连接mysql的url上加 &allowMultiQueries=true 这个才可以执行。
方式二:

  1. <update id="updateBatch" parameterType="java.util.List">
  2.         update tableName
  3.         <trim prefix="set" suffixOverrides=",">
  4.             <trim prefix="c_name =case" suffix="end,">
  5.                 <foreach collection="list" item="cus">
  6.                     <if test="cus.name!=null">
  7.                         when id=#{cus.id} then #{cus.name}
  8.                     </if>
  9.                 </foreach>
  10.             </trim>
  11.             <trim prefix="c_age =case" suffix="end,">
  12.                 <foreach collection="list" item="cus">
  13.                     <if test="cus.age!=null">
  14.                         when id=#{cus.id} then #{cus.age}
  15.                     </if>
  16.                 </foreach>
  17.             </trim>
  18.         </trim>
  19.         <where>
  20.             <foreach collection="list" separator="or" item="cus">
  21.                 id = #{cus.id}
  22.             </foreach>
  23.         </where>
  24. </update>


这种方式貌似效率不高,但是可以实现,而且不用改动mysql连接
效率参考文章:https://blog.csdn.net/xu1916659422/article/details/77971696/
方式三:
临时改表sqlSessionFactory的属性,实现批量提交的java,但无法返回受影响数量。

  1. public int updateBatch(List<Object> list){
  2.         if(list ==null || list.size() <= 0){
  3.             return -1;
  4.         }
  5.         SqlSessionFactory sqlSessionFactory = SpringContextUtil.getBean("sqlSessionFactory");
  6.         SqlSession sqlSession = null;
  7.         try {
  8.             sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
  9.             Mapper mapper = sqlSession.getMapper(Mapper.class);
  10.             int batchCount = 1000;//提交数量,到达这个数量就提交
  11.             for (int index = 0; index < list.size(); index++) {
  12.                 Object obj = list.get(index);
  13.                 mapper.updateInfo(obj);
  14.                 if(index != 0 && index%batchCount == 0){
  15.                     sqlSession.commit();
  16.                 }                    
  17.             }
  18.             sqlSession.commit();
  19.             return 0;
  20.         }catch (Exception e){
  21.             sqlSession.rollback();
  22.             return -2;
  23.         }finally {
  24.             if(sqlSession != null){
  25.                 sqlSession.close();
  26.             }
  27.         }
  28.         
  29. }


其中 SpringContextUtil 是自己定义的工具类 用来获取spring加载的bean对象,其中getBean() 获得的是想要得到的sqlSessionFactory。Mapper 是自己的更具业务需求的Mapper接口类,Object是对象。
总结
方式一 需要修改mysql的连接url,让全局支持多sql执行,不太安全
方式二 当数据量大的时候 ,效率明显降低
方式三 需要自己控制,自己处理,一些隐藏的问题无法发现。

附件:SpringContextUtil.java

  1. @Component
  2. public class SpringContextUtil implements ApplicationContextAware{
  3.     private static ApplicationContext applicationContext;
  4.     @Override
  5.     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  6.         SpringContextUtil.applicationContext = applicationContext;
  7.     }
  8.     public static ApplicationContext getApplicationContext(){
  9.         return applicationContext;
  10.     }
  11.     public static Object getBean(Class T){
  12.         try {
  13.             return applicationContext.getBean(T);
  14.         }catch (BeansException e){
  15.             return null;
  16.         }
  17.     }
  18.     public static Object getBean(String name){
  19.         try {
  20.             return applicationContext.getBean(name);
  21.         }catch (BeansException e){
  22.             return null;
  23.         }
  24.     }
  25. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/468688
推荐阅读
相关标签
  

闽ICP备14008679号