随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

一、批量操作

  默认的 openSession() 方法没有参数,它会创建有如下特性的

1
2
3
4
会开启一个事务(也就是不自动提交)
连接对象会从由活动环境配置的数据源实例得到
事务隔离级别将会使用驱动或数据源的默认设置
预处理语句不会被复用,也不会批量处理更新

  

  openSession 方法的 ExecutorType 类型的参数,枚举类型:

1
2
3
ExecutorType.SIMPLE: 这个执行器类型不做特殊的事情(这是默认装配的)。它为每个语句的执行创建一个新的预处理语句。
ExecutorType.REUSE: 这个执行器类型会复用预处理语句。
ExecutorType.BATCH: 这个执行器会批量执行所有更新语句

  

 

批量操作我们是使用MyBatis提供的BatchExecutor进行的,他的底层就是通过jdbc攒sql的方式进行的。我们可以让他攒够一定数量后发给数据库一次。

 

二、开启批量操作

  在 MyBatis 的全局配置文件 settings 中有一项来设置MyBatis的执行处理器类型。

 

   其中的默认是 SIMPLE 类型,这个处理器不做特殊的事情。

  如果想要使用批量处理器 BATCH,这样后面所有的 SQL都会执行批量的。

  如果我们只想在执行某一个SQL的时候批量执行,可以在获取 sqlsession 的时候传入类型处理器。

复制代码
   @Test
     public void testBatch() throws IOException {
          //1、获取 sqlSessionFactory
          SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();

          //2、获取 sqlSession 实例,获取批量执行器
          SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
          long start = System.currentTimeMillis();
          try {
               //3、获取接口的实现类对象
               EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

               for (int i = 0; i < 1000; i++) {
                    employeeMapper.addEmp(new Employee(null, UUID.randomUUID().toString().substring(0, 5), "1", "c"));
               }

               sqlSession.commit();
               long end = System.currentTimeMillis();

               //批量:[预编译SQL一次==> 设置参数(一万次)==>执行(一次)]  耗时4598
               //非批量:(预编译SQL==>设置参数==>执行) 三个步骤执行一万次 耗时10200
               System.out.println("执行时长:" + (end-start));
          } finally {
               sqlSession.close();
          }
     }
复制代码

 

 

三、批量操作与 Spring 整合

  与Spring整合中,我们推荐,额外的配置一个可以专门用来执行批量操作的sqlSession。

 

   需要用到批量操作的时候,我们可以注入配置的这个批量SqlSession。通过他获取到mapper映射器进行操作。

  例如:

复制代码
    @Autowired
    private SqlSession sqlSession;

    @Override
    public void saveEmp(Employee employee) {
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        for (int i = 0; i < 10; i++) {
            mapper.addEmp(employee);
        }
    }
复制代码

 

   注意

    1、批量操作是在session.commit()以后才发送sql语句给数据库进行执行的;

    2、如果我们想让其提前执行,以方便后续可能的查询操作获取数据,我们可以使用sqlSession.flushStatements()方法,让其直接冲刷到数据库进行执行。

 

posted on   格物致知_Tony  阅读(534)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
历史上的今天:
2019-09-19 数组模拟队列
2019-09-19 队列
点击右上角即可分享
微信分享提示

目录导航