Spring + MyBatis 处理大数据量的insert方案

我这里的需求是通过自己的逻辑将得到的所有数据(万级以上)依次插入到指定的表中,在这种在同一事务范围的情况下,我采取的是分批次(insertBatch)插入,主要思路是先将需要插入的数据依次放到一个list集合中,然后调用MyBatis下SqlSession.openSession(ExecutorType execType, boolean autoCommit)方法来实现批量处理和手动提交,第一的参数ExecutorType处理器类型有三种,分别是:

  • ExecutorType.SIMPLE: 这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。
  • ExecutorType.REUSE: 这个执行器类型会复用预处理语句。
  • ExecutorType.BATCH:这个执行器会批量执行所有更新语句,如果 SELECT 在它们中间执行还会标定它们是 必须的,来保证一个简单并易于理解的行为。 第二个参数autoCommit,true或者不写表示自动提交,false表示手动提交,调用如下:
DefaultSqlSessionFactory sqlSessionFactoryBean = SpringUtils.getBean("sqlSessionFactory");
SqlSession batchSqlSession = sqlSessionFactoryBean.openSession(ExecutorType.BATCH,false);

我所使用的主要源码是:

public static void insertDbDataBaseCheck(List<DbDatabaseCheck> dbList){
SqlSession batchSqlSession = null;
try {
	DefaultSqlSessionFactory sqlSessionFactoryBean = SpringUtils.getBean("sqlSessionFactory");
	batchSqlSession = sqlSessionFactoryBean.openSession(ExecutorType.BATCH,false);
	int batchCount = 100;// 每批commit的个数
	int batchLastIndex = batchCount;// 每批最后一个的下标
	if(dbList.size() > 100) {
		for (int index = 0; index < dbList.size();) {
			if(batchLastIndex > dbList.size()){
				Static.dbDatabaseCheckDao.insertBatch(dbList.subList(index, batchLastIndex));
				batchSqlSession.commit();
				System.out.println("index:" + index+ " batchLastIndex:" + batchLastIndex);
				break;// 数据插入完毕,退出循环
			}else {
				Static.dbDatabaseCheckDao.insertBatch(dbList.subList(index, batchLastIndex));
				batchSqlSession.commit();
				System.out.println("index:" + index+ " batchLastIndex:" + batchLastIndex);
				index = batchLastIndex;// 设置下一批下标
				batchLastIndex = index + (batchCount - 1);
			}
		}
		 batchSqlSession.commit();
	 }else {
       	Static.dbDatabaseCheckDao.insertBatch(dbList);
       	batchSqlSession.commit();
	 }
 } catch (Exception e) {
	// TODO: handle exception
}finally {
	 batchSqlSession.close();
}
	}

转载于:https://my.oschina.net/u/3354389/blog/2979904

SpringMyBatis是两个非常常见的Java开发框架。Spring是一个轻级的依赖注入和面向切面编程容器,而MyBatis是一个数据访问框。当我们需要在项目中使用MyBatis时,可以选择将其与Spring进行整合,以便更好地管理和维护这些框架。 在SpringMyBatis整合的过程中,可以使用注解来简化配置,并提高代码的可读性和可维护性。以下是一些常见的注解的使用方式: 1. @MapperScan:在Spring配置类上使用此注解,可以自动扫描指定包下的Mapper接口,并注册到Spring容器中。例如:@MapperScan("com.example.mapper")。 2. @Repository:将数据访问层的实现类标记为Spring的bean,并作为数据访问层的组件。例如:@Repository。 3. @Autowired:使用此注解将Mapper接口或服务类注入到需要使用它的地方。例如:@Autowired private UserMapper userMapper。 4. @Transactional:使用此注解将方法标记为事务处理方法。例如:@Transactional。 5. @Select:在Mapper接口的方法上使用此注解,可以指定SQL查询语句。例如:@Select("SELECT * FROM users")。 6. @Insert:在Mapper接口的方法上使用此注解,可以指定插入数据的SQL语句。例如:@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")。 7. @Update:在Mapper接口的方法上使用此注解,可以指定更新数据的SQL语句。例如:@Update("UPDATE users SET name = #{name} WHERE id = #{id}")。 通过使用这些注解,可以避免繁琐的XML配置文件,并且能够更好地将代码逻辑组织和维护。同时,整合注解还能提高代码的可读性和可维护性,使得开发人员更容易理解和修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值