关于spring和mybatis集成后如何进行批处理总结

网上百度一下,发现各种各样的版本,真的是各种试,现在就来分享一下我运行过程中是如何处理的吧

 

1、首先一种基本的批处理是采用union all  拼接sql,导致问题sql过长,耗时,性能不好,且达到一定量会超出sql长度限制,简单的批处理可以应付。
 

insert into gdgk_test_user(id,name,password) (

select #{item.id,jdbcType=VARCHAR},#{item.name,jdbcType=VARCHAR},#{item.password,jdbcType=VARCHAR} from dual

)

一般20字段以内的表新增,数据2000条以内可用,经过测试,但是,这个是非常重要,对于数据表字段中存在大数据如:CLOB类型,就不能使用这种批量新增方法。
2、采用dao层循环,得到sqlsession  统一commit,这种方式几乎可以应付你所有的情况
@Autowired
private SqlSessionTemplate sqlSession;
public void saveBatch(List modelList) {
     SqlSession session =sqlSession.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
     try{
       //批量生成新闻主键
       for(TBsImpNews tBsImpNews : modelList){
         //批量生成新闻主键
         String impnewsId =String.valueOf(Long.valueOf(getSequenceNextId(SEQ_T_BS_IMP_NEWS)));
         tBsImpNews.setImpnewsId(impnewsId);
         sqlSession.insert("com.rocktrue.fastdev.wvsp.impnews.TBsImpNewsMapper.insertTBsImpNews", tBsImpNews);
         for(String url:tBsImpNews.getImgList()){
            //批量生成新闻图片主键
            String imniId =String.valueOf(Long.valueOf(getSequenceNextId(SEQ_T_BS_IMP_NEWS_IMG)));
            TBsImpNewsImg tBsImpNewsImg=new TBsImpNewsImg();
            tBsImpNewsImg.setImniId(imniId);
            tBsImpNewsImg.setImpnewsId(impnewsId);
            tBsImpNewsImg.setImniSrc(url);
            sqlSession.insert("com.rocktrue.fastdev.wvsp.impnews.TBsImpNewsImgMapper.insertTBsImpNewsImg", tBsImpNewsImg);
          }
        }
     session.commit();
     //清理缓存,防止溢出
     session.clearCache();
    }catch(Exception e){
       e.printStackTrace();
       session.rollback();
     }finally {
      session.close();
     }
  }
 

你可能感兴趣的:(aa)