# mybatis-batch **Repository Path**: weixq709/mybatis-batch ## Basic Information - **Project Name**: mybatis-batch - **Description**: 一个基于mybatis的批处理工具,支持手动控制事务和提交批处理 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-05-22 - **Last Updated**: 2024-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: MyBatis, Spring, 批处理 ## README # mybatis-batch Mybatis-Batch是一个批处理工具,支持手动控制事务和提交批处理。 # 快速开始 1.添加镜像仓库 ```xml github-repo Github Maven Repository https://raw.githubusercontent.com/plato-wei/mvn-repo/main/ ``` 2.引入依赖 ```xml com.wxq.mybaits mybatis-batch 1.0.0 ``` 3.配置BatchExecutorFactory ``` import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.transaction.Transaction; import javax.sql.DataSource; import org.apache.ibatis.transaction.Transaction; @Configuration public SystemConfig { @Bean public BatchExecutorFacotry batchExecutorFactory(SqlSessionFactory sqlSessionFactory, DataSource dataSource, TransactionFactory transactionFactory) { return new BatchExecutorFacotry(sqlSessionFactory, dataSource, transactionFactory); } @Bean public TransactionFactory batchTransactionFactory() { return new MyBatisBatchTransactionFactory(); } } ``` 3.使用BatchExecutorFactory生成代理对象 ```java interface UserMapper{ @Insert("insert into user(username, password) values" + "" + "#{item.username},#{item.password}" + "" + ") int addUsers(List users); @Insert("insert into user(username, password) values(#{username}, #{password})") int addUser(Uesr user); int deleteUserByIds(@Param("ids") Collections ids); } ``` 1)当前线程已存在spring事务 ```java @Service public class UserService { @Autowired private BatchExecutorFacotry batchFactory; @Transactional public void addUsers() { // 已存在事务 // 省略其他数据库操作 // 实际可能来自其他数据库或前端数据 List users = new ArrayList(1000); BatchExecutor executor = batchFacotry.doBatch(UserMapper.class); int count = 0; for(User user: users) { executor.getMapper().addUser(user); if(count % 1000 == 0) { executor.executeBatch(); } count++; } } } ``` 2)当前线程不存在事务 ```java @Service public class UserService { @Autowired private BatchExecutorFacotry batchFactory; public void addUsers() { // 不已存在事务 // 省略其他数据库操作 // 实际可能来自其他数据库或前端数据 List users = new ArrayList(1000); BatchExecutor executor = batchFacotry.doBatch(UserMapper.class); int count = 0; try { for(User user: users) { executor.getMapper().addUser(user); if(count % 1000 == 0) { executor.executeBatch(); } count++; } } catch(Exception e) { executor.rollback(); } finally { executor.commit(); } } } ```