Skip to content

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,再进行批处理。

Released under the MIT License.