zoukankan      html  css  js  c++  java
  • MyBatis(十一)扩展:批量操作

    一、批量操作

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

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

      

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

    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()方法,让其直接冲刷到数据库进行执行。

  • 相关阅读:
    预习原码补码
    C语言I作业12-学期总结
    C语言I博客作业11
    C语言I博客作业10
    C语言I博客作业09
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I作业004
  • 原文地址:https://www.cnblogs.com/niujifei/p/15312247.html
Copyright © 2011-2022 走看看