一、在mybatis中ExecutorType的使用
1、Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,
并且批量执行所有更新语句,显然batch性能将更优;
2、但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的;
一、代码实现
1、注入SqlSessionFactory
@Autowired private SqlSessionFactory sqlSessionFactory;
2、实现
try(SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);) { SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class); long start = System.currentTimeMillis(); list.stream().forEach(u->mapper.insertTest(u)); sqlSession.flushStatements(); sqlSession.commit(); long end = System.currentTimeMillis(); System.err.println((end-start)/1000); }
备注:sqlSession.flushStatements()方法的作用就是将前面所有执行过的INSERT、UPDATE、DELETE语句真正刷新到数据库中。底层调用了JDBC的statement.executeBatch
方法。
sqlSession.commit()方法提交事务