14.批量操作
使用 pageHelper
分页查询的环境进行演示。
1.方法接口
java
@Insert("insert into blog values(#{id}, #{title}, #{author}, #{createTime}, #{views})")
void save(Blog blog);
2.测试用例
java
package org.hong.test;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.hong.mapper.BlogMapper;
import org.hong.pojo.Blog;
import org.hong.util.MyBatisUtil;
import org.junit.Test;
import java.sql.Date;
import java.time.LocalDate;
public class BatchTest {
@Test
public void testBatch(){
SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
// 调用openSession时传入ExecutorType枚举类的对象, 指明执行类型
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
long start = System.currentTimeMillis();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
for (int i = 1; i <= 100000; i++) {
Blog blog = new Blog();
blog.setId("00" + i);
blog.setTitle("测试Batch" + "-" + i);
blog.setAuthor("谢禹宏");
blog.setCreateTime(Date.valueOf(LocalDate.now()));
blog.setViews(i);
mapper.save(blog);
if(i % 500 == 0){
//手动每500条提交一次, 提交后无法回滚
sqlSession.commit();
//清理缓存, 防止溢出
sqlSession.clearCache();
}
}
sqlSession.commit();
long end = System.currentTimeMillis();
System.out.println(end - start);
} catch (Exception e){
sqlSession.rollback();
} finally {
sqlSession.close();
}
}
}
3.MyBatis-Spring 整合配置
在 Spring
配置文件中配置一个独立的 SqlSession
对象,将这个对象设置为批处理模式。
xml
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
<constructor-arg name="executorType" value="BATCH"/>
</bean>
在 service
层自动装配这个对象,使用时 getMapper
获取需要的 Mapper
,再进行批处理。