@Component
public class ExecutorBatch {
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
/**
* 使用mybatis的BATCH模式批量新增和修改
* 需要注意的是分批次入库操作,关闭自动提交。
* @param mapperClazz 继承Mapper接口的类
* @param operationList 操作的List
* @param isUpdate 是否为更新
* @param operationDbNumber 操作数据库条数
* @param <T> T
* @param <I> I
*/
public <T, I extends Mapper> void executorTypeBatch(Class<I> mapperClazz, List<T> operationList, boolean isUpdate, int operationDbNumber){
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(
ExecutorType.BATCH, false);
I mapper = session.getMapper(mapperClazz);
try {
for (int i = 1;i <= operationList.size(); i++) {
if (isUpdate) {
mapper.updateByPrimaryKeySelective(operationList.get(i-1));
} else {
mapper.insert(operationList.get(i-1));
}
if (i / operationDbNumber == 1 || i == operationList.size()) {
session.commit();
//清理缓存,防止溢出
session.clearCache();
}
}
} catch (Exception e) {
session.rollback();
} finally {
session.close();
}
}
/**
* 使用mybatis的BATCH模式批量删除
* 需要注意的是分批次入库操作,关闭自动提交。
* @param mapperClazz 继承Mapper接口的类
* @param operationList 操作的List
* @param operationDbNumber 操作数据库条数
* @param <T> T
* @param <I> I
*/
public <T, I extends Mapper> void executorTypeBatchDelete(Class<I> mapperClazz, List<T> operationList, int operationDbNumber){
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(
ExecutorType.BATCH, false);
I mapper = session.getMapper(mapperClazz);
try {
for (int i = 1;i <= operationList.size(); i++) {
mapper.delete(operationList.get(i-1));
if (i / operationDbNumber == 1 || i == operationList.size()) {
session.commit();
//清理缓存,防止溢出
session.clearCache();
}
}
} catch (Exception e) {
session.rollback();
} finally {
session.close();
}
}
}
测试类
@Before
public void getList() {
long start = System.currentTimeMillis();
Users user;
for (int i = 1; i <=50000 ; i++) {
user = new Users();
user.setId(i);
user.setName("java");
user.setAge(200);
user.setManagerId(222);
list.add(user);
}
System.out.println("拼装数据 耗时:"+(System.currentTimeMillis()-start));
System.out.println(list.size());
}
@Test
public void batchInsert() {
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
System.out.println("batchInsert 插入开始========");
long start = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
mapper.insert(list.get(i));
if (i%5000==4999) {
sqlSession.flushStatements();
// sqlSession.commit();
// sqlSession.clearCache();
}
}
// sqlSession.commit();
// sqlSession.clearCache();
sqlSession.flushStatements();
System.out.println("SqlSession 批量插入耗时:"+(System.currentTimeMillis()-start));
}
版权声明:本文为weixin_47252341原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。