1  Mybatis-plus 根据 ID列表查询数据

MybatisPlus批量操作的坑_sql

      查询结果返回的List 和传入的id列表的顺序不一致  是乱序的。开始我以为是mybatis-plus的坑 于是我用自己写sql的方式试了一下:

   测试结果如下:

MybatisPlus批量操作的坑_sql_02

      发现错怪了Plus,原来是mybatis原生的问题,估计是利用的主键的B+树索引的自然排序 输出的结果。这是本人的猜测,因此具体原因还是不太清楚  没有追进mybatis源码一看究竟,但是我想到了怎么去解决的办法:

MybatisPlus批量操作的坑_sql_03

     因此我们在特定的对查询结果排序有要求的场景下,在Mybatis中需要自己写MAPPER.XML文件来手动的编写动态查询SQL(利用foreach标签遍历主键id)。

2  mybatis-plus基础serivce的savebatch和saveOrUpdateBatch

      先来看坑比较多的saveOrUpdateBatch,从方法名表面来看是想根据查询结果来更新或者插入数据的,结果你传的list的对象里面如果有主键为空的对象的时候会报错,详见源码截图:

MybatisPlus批量操作的坑_sql_04

    因此如果你还是要区分 是否有ID的数据,如果ID为NULL的话需要用savebatch。但是savebatch也有问题,就是如果数据量比较大的话会执行的比较慢,因为他用了for循环,当满足我们设定的条数后会调用sqlSession.flushStatements()这个方法进行插入,具体代码如下:

MybatisPlus批量操作的坑_主键_05

       接下来我们继续看一个问题,如果你的代码中有其他数据库操作和savebatch一起执行的时候,代码如下:

MybatisPlus批量操作的坑_主键_06

   如果在执行saveBatch的时候出现异常,则该assignRoleMenu 方法所有的表操作都会rollback。原因如下,正是因为@Transactional 的嵌套事务的原因, 我们再来看一下saveBatch的接口方法入口,也加了@Transactional  注解:

MybatisPlus批量操作的坑_主键_07

如果某个特殊的场景,我们希望saveBatch的执行结果不影响其他操作的执行结果,我们应该如何处理呢,在外层加try-catch?显然是不行的,因为我们还是希望saveBatch需要回滚的。那么我们的解决办法是修改外层方法的事务传播机制或者自己写编程式事务来实现部分回滚。

MybatisPlus批量操作的坑_主键_08