博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis批量保存的两种方式(高效插入)
阅读量:6975 次
发布时间:2019-06-27

本文共 2999 字,大约阅读时间需要 9 分钟。

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

 

  

 

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

你可能感兴趣的文章
虚拟化--015 配置VMware View Event database失败:
查看>>
docker的网络架构配置
查看>>
spring data jpa 详解
查看>>
自定义windows下自动清除文件夹或者文件的只读属性的脚本
查看>>
sudo配置文件详解及实战
查看>>
密码学研究-数字签名
查看>>
一些常用工具地址,随时更新中~
查看>>
直接可以拿去用的正则验证表达式
查看>>
11月18日珠三角城市人口迁徙可视化(和弦图)
查看>>
态势“知”多少,点开就知道
查看>>
spring+ (activeMQ) 实现queue与topic
查看>>
oracle汉化包下载地址
查看>>
Java解压zip文件(文本)压缩包
查看>>
技术栈
查看>>
checkbox点击切换选中状态
查看>>
2019,商业智能的10大未来趋势
查看>>
将ubuntu系统设置静态ip及ssh
查看>>
云原生应用的10大关键属性
查看>>
Android 在运行时请求权限
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>