MyBatis进行批次操作

文章目录


在项目中,遇到这样一种情况,需要批量插入一些数据。在XML中配置的基本sql如下:

<insert id="addMenuRole">
	insert into fyk_role_menu
	  (role_id, menu_id)
	values
	  (#{roleId}, #{menuId})
</insert>

很显然,只要重复调用addMenuRole方法,就可以了,但是这样会有性能问题(每执行一次,就会和数据库交互一次)。
所以最好的方式就是将这些操作打个批次 ,一次性提交到数据库。(当然,可以使用foreach元素来循环集合,但是这个会基于不同的数据库,导致这个sql不一样:比如mysql和oracle中的批量插入方式就不一样)

批次操作

核心代码如下:

@Autowired
private SqlSessionFactory sqlSessionFactory;

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public Boolean addMenuRole(String roleId, List<String> menuIds) {
	try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
		RoleDao batchRoleDao = sqlSession.getMapper(RoleDao.class);
		for (String menuId : menuIds) {
			batchRoleDao.addMenuRole(roleId, menuId);
		}
		sqlSession.flushStatements();
	}
	return Boolean.TRUE;
}

大致的意思就是:通过openSession方法,打开session,然后依次调用addMenuRole方法,只是这里并没有把该操作提交到数据库,而是在sqlSession.flushStatements()执行,才是将这些操作,一次性提交到数据库。
这里需要提醒两点:

  • 批次是不包含事务的。例如:这个批次会执行10条语句,前5条成功执行,第6条出错,前5条并不会回滚。所以,应该用事务进行处理,这里使用了@Transactional注解;
  • SqlSession 在使用完了,一定要关闭,这里使用了带资源的try语句。当然也可以使用sqlSession.close()语句来手动关闭。

补充

以下介绍几个在Mybatis中很重要的对象:

  • SqlSessionFactoryBuilder:可以在任何时候被实例化、使用和销毁。一旦创造了SqlSessionFactory就不需要再保留它了。所以它的最好的作用域是方法体内(即一个本地方法变量)。可以重用SqlSessionFactoryBuilder创建多个SqlSessionFactory实例,但最好不要把时间、资源放在解析XML文件上,而是要从中解放出来做最重要的事情。
  • SqlSessionFactory一旦创建,将会存在于应用程序的整个运行生命周期中。很少或根本没有理由去销毁它或重建它。最佳实践是不要在一个应用中多次创建SqlSessionFactory。所以SqlSessionFactory最好的作用域范围是一个应用的生命周期范围。
  • SqlSession:是与Mybatis一起工作的基本java接口。通过这个接口,你可以执行命令、获得映射和管理事务。每个线程都有一个SqlSession实例,SqlSession实例是不被共享的,并且不是线程安全的。因此最好的作用域是request或者method。决不要用一个静态字段或者一个类的实例字段来保存SqlSession实例引用,也不要用任何一个管理作用域,来保存SqlSession的引用。注意:如果是自己打开了SqlSession,则在使用完之后要记得关闭
  • Mapper实例:Mapper是创建来绑定映射语句的接口,该Mapper实例是从SqlSession得到的。因此所有的Mapper实例的作用域跟它创建它的SqlSession一样,但是Mapper最好的作用域是method,也就是他们应该在方法内被调用,使用完即被销毁。并且Mapper实例不用显示地被关闭
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-plus提供了方便的批量操作功能,可以减少编写大量重复代码的工作。通过使用Mybatis-plus的批量新增和批量修改方法,您可以很方便地实现对数据库的批量操作。然而,官方提供的批量修改和批量新增方法都是根据id来进行操作的,如果您需要对其他字段进行操作,就需要进行一些自定义修改。 如果您想要进行批量修改,可以参考以下步骤: 1. 创建一个工具类,例如MybatisBatchUtils,并添加相应的注解@Component。 2. 在工具类中,设置批量操作时的每批次大小,可以根据需求自行调整。 3. 使用@Autowired注解将SqlSessionFactory注入到工具类中,以便获取SqlSession。 4. 创建一个批量修改的方法batchUpdateOrInsert,该方法接受一个数据列表data、一个Mapper类mapperClass和一个函数function作为参数。 5. 在方法中,通过sqlSessionFactory.openSession(ExecutorType.BATCH)创建一个批量操作的SqlSession。 6. 使用data.size()获取数据列表的大小,并使用for循环遍历数据列表。 7. 在循环中,通过function.apply(element, mapper)来进行具体的批量修改操作。 8. 判断是否达到每批次大小的限制,如果达到则调用batchSqlSession.flushStatements()刷新批量操作的语句。 9. 在循环结束后,根据事务的情况调用batchSqlSession.commit()提交事务。 10. 最后,关闭批量操作的SqlSession。 需要注意的是,在使用Mybatis-plus的批量操作时,如果项目中没有引用Mybatis-plus,但仍想进行批量操作,可以参考上述工具类的编写方式,在mybatis环境下进行批量操作。 通过以上步骤,您就可以使用Mybatis-plus进行批量操作了。这样可以大大减少编写重复代码的工作量,提高代码的可读性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值