mybatis批量保存的两种方式(高效插入)

您所在的位置:网站首页 mybaits批量insert mybatis批量保存的两种方式(高效插入)

mybatis批量保存的两种方式(高效插入)

#mybatis批量保存的两种方式(高效插入)| 来源: 网络整理| 查看: 265

知识点:mybatis中,批量保存的两种方式

          1.使用mybatis foreach标签

          2.mybatis ExecutorType.BATCH

参考博客:https://www.jb51.net/article/91951.htm

 

一:使用mybatis foreach标签

具体用法如下:

 

       //推荐使用           INSERT INTO emp(ename,gender,email,did)      VALUES            (#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})                       //在jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true    

 

二:mybatis ExecutorType.BATCH

Mybatis内置的ExecutorType有3种,默认为simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的

 

具体用法如下:

  @Test  //批量保存方法测试    public void testBatch() throws IOException{        SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();        //可以执行批量操作的sqlSession        SqlSession openSession=sqlSessionFactory.openSession(ExecutorType.BATCH);                //批量保存执行前时间        long start=System.currentTimeMillis();        try{        EmployeeMapper mapper=    openSession.getMapper(EmployeeMapper.class);        for (int i = 0; i < 1000; i++) {            mapper.addEmp(new Employee(UUID.randomUUID().toString().substring(0,5),"b","1"));        }                     openSession.commit();        long end=  System.currentTimeMillis();        //批量保存执行后的时间        System.out.println("执行时长"+(end-start));        //批量 预编译sql一次==》设置参数==》10000次==》执行1次   677        //非批量  (预编译=设置参数=执行 )==》10000次   1121                }finally{            openSession.close();        }    }

mapper和mapper.xml如下:

    public interface EmployeeMapper {        //批量保存员工    public Long addEmp(Employee employee);

    }

                                         

 

 

(2)在serviceImpl中加入

     @Autowired    private SqlSession sqlSession;

 

  //批量保存员工    @Override    public Integer batchEmp() {        // TODO Auto-generated method stub                //批量保存执行前时间            long start=System.currentTimeMillis();                EmployeeMapper mapper=    sqlSession.getMapper(EmployeeMapper.class);            for (int i = 0; i < 10000; i++) {                mapper.addEmp(new Employee(UUID.randomUUID().toString().substring(0,5),"b","1"));                }            long end=  System.currentTimeMillis();            long time2= end-start;            //批量保存执行后的时间            System.out.println("执行时长"+time2);                               return (int) time2;            }

 

  

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3