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

知识点: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);

    }

    
    
        insert into employee(lastName,email,gender)
        values(#{lastName},#{email},#{gender})
    

 

三:补充:mybatis ExecutorType.BATCH 在SSM框架中的用法

  (1)在全局配置文件applcationContext.xml中加入

   
        sqlSession
" class="org.mybatis.spring.SqlSessionTemplate">
           
             BATCH">
        

 

 

(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;
        
    }

 

  

 

转载于:https://www.cnblogs.com/shuaifing/p/9327465.html

你可能感兴趣的:(mybatis批量保存的两种方式(高效插入))