public class SqlBatchExecutor {
@Autowired
private SqlSessionFactory sqlSessionFactory;
/**
* 批量处理sql(此方法适用只涉及一个mapper的场景)
*
* @param mapperClass mapper对应的class
* @param action 具体批量处理行为,和mapper绑定
* @param <T> mapper的范型
*/
public <T> void batchExecute(Class<T> mapperClass, MapperAction<T> action) {
SqlSession batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
// 获取批量操作的新的map
T mapper = batchSqlSession.getMapper(mapperClass);
// mapper sql 预处理,不提交
action.executeWithSessionNotCommit(mapper);
// session 提交
batchSqlSession.commit();
} finally {
// session 关闭
batchSqlSession.close();
}
}
/**
* 和mapper绑定的批量处理行为
*
* @param <T>
*/
public static interface MapperAction<T> {
/**
* 本方法中,session中的sql只预处理,不提交
*
* @param mapper sql mapper
*/
void executeWithSessionNotCommit(T mapper);
}
}
调用
sqlBatchExecutor.batchExecute(实体类.class, mapper -> {
entityList.forEach(entity -> {
mapper.insertSelective(entity );
});
});