zoukankan      html  css  js  c++  java
  • mybatis批量保存的两种方式(高效插入)

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

              1.使用mybatis foreach标签

              2.mybatis ExecutorType.BATCH

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

    一:使用mybatis foreach标签

    具体用法如下:

      <!-- 批量保存(foreach插入多条数据两种方法)
           int addEmpsBatch(@Param("emps") List<Employee> emps); -->
         <!-- MySQL下批量保存,可以foreach遍历 mysql支持values(),(),()语法 --> //推荐使用
         <insert id="addEmpsBatch">
          INSERT INTO emp(ename,gender,email,did)
          VALUES
          <foreach collection="emps" item="emp" separator=",">
          (#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
          </foreach>
         </insert>
        
         <!-- 这种方式需要数据库连接属性allowMutiQueries=true的支持 -->  //在jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true
        <!--  <insert id="addEmpsBatch">                                                                                                                 后加上allowMultiQueries=true
           <foreach collection="emps" item="emp" separator=";">                                                                        表示可以多次执行insert into语句,中间;不会错
             INSERT INTO emp(ename,gender,email,did)
             VALUES(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
          </foreach>
         </insert> -->

    二: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);

        }

    <mapper namespace="com.agesun.mybatis.dao.EmployeeMapper"
         <!--批量保存员工 -->
        <insert id="addEmp">
            insert into employee(lastName,email,gender)
            values(#{lastName},#{email},#{gender})
        </insert>
    </mapper>

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

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

        <!-- 配置一个可以批量执行的sqlSession -->
            <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
                <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
                 <constructor-arg name="executorType" value="BATCH"></constructor-arg>
             </bean>

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

      

  • 相关阅读:
    Lua 学习之基础篇七<Lua Module,Package介绍>
    Lua 学习之基础篇六<Lua IO 库>
    Lua 学习之基础篇五<Lua OS 库>
    Lua 学习之基础篇四<Lua table(表)>
    Lua 学习之基础篇三<Lua 字符串操作>
    时空穿梭
    【集训队作业】line
    动态几何问题
    博弈论与概率统计
    wombats
  • 原文地址:https://www.cnblogs.com/shuaifing/p/9327465.html
Copyright © 2011-2022 走看看