mybatis执行器
对数据库的批量操作, 是一个非常常见的操作, Mybatis提供了批量执行器, 来支持批量操作。常规对一条sql语句的执行需要经过编译,设置参数,执行SQL等三步,批量执行时,可以利用预编译方式来优化,可大大提高效率。
mybatis的执行器有三种
-
ExecutorType.SIMPLE:这个类型不做特殊的事情,它只为每个语句创建一个PreparedStatement;
-
ExecutorType.REUSE: REUSE 执行器会重用预处理语句;
-
ExecutorType.BATCH: 批量执行器, 对相同sql进行一次预编译, 然后设置参数, 最后统一执行操作;
public class TestStudentMapper {
// 批量保存方法
private void batchSave(StudentMapper mapper) {
// 初始化10000个对象
List<StudentPO> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
list.add(new StudentPO("zhangsan_" + i, "M",20 + i % 10, LocalDate.now()));
}
// 批量执行
long start = System.currentTimeMillis();
for (StudentPO studentPO : list) {
mapper.save(studentPO);
}
long end = System.currentTimeMillis();
// 输出执行耗时
System.out.println("耗时:" + (end - start) + " ms!");
}
// 每次执行前,请空表
@Before
public void setUp(){
StudentMapper studentMapper = SqlSessionUtil.getMapper(StudentMapper.class);
studentMapper.clear();
}
// 默认执行器,用时21575ms
@Test
public void test_SIMPLE(){
// 获取自动提交事务的Maper
StudentMapper mapper = SqlSessionUtil.getMapperAutoTx(StudentMapper.class);
// 执行批量保存
batchSave(mapper);
}
// 重用预编译执行器,用时19322ms
@Test
public void test_REUSE(){
// 获取批量保存sqlSession
SqlSession sqlSession = SqlSessionUtil.openSession(ExecutorType.REUSE, true);
// 获取Mapper 对象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
// 执行批量保存
batchSave(mapper);
}
// 批量执行器,用时835ms
@Test
public void test_BATCH(){
// 获取批量保存sqlSession
SqlSession sqlSession = SqlSessionUtil.openSession(ExecutorType.BATCH, true);
// 获取Mapper 对象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
// 执行批量保存
batchSave(mapper);
sqlSession.commit();
}
}