1 Mybatis-plus 根据 ID列表查询数据
查询结果返回的List 和传入的id列表的顺序不一致 是乱序的。开始我以为是mybatis-plus的坑 于是我用自己写sql的方式试了一下:
测试结果如下:
发现错怪了Plus,原来是mybatis原生的问题,估计是利用的主键的B+树索引的自然排序 输出的结果。这是本人的猜测,因此具体原因还是不太清楚 没有追进mybatis源码一看究竟,但是我想到了怎么去解决的办法:
因此我们在特定的对查询结果排序有要求的场景下,在Mybatis中需要自己写MAPPER.XML文件来手动的编写动态查询SQL(利用foreach标签遍历主键id)。
2 mybatis-plus基础serivce的savebatch和saveOrUpdateBatch
先来看坑比较多的saveOrUpdateBatch,从方法名表面来看是想根据查询结果来更新或者插入数据的,结果你传的list的对象里面如果有主键为空的对象的时候会报错,详见源码截图:
因此如果你还是要区分 是否有ID的数据,如果ID为NULL的话需要用savebatch。但是savebatch也有问题,就是如果数据量比较大的话会执行的比较慢,因为他用了for循环去调用sqlSession.flushStatements()这个方法进行插入,具体代码如下:这个方法进行插入,具体代码如下:
接下来我们继续看一个问题,如果你的代码中有其他数据库操作和savebatch一起执行的时候,代码如下:
如果在执行saveBatch的时候出现异常,则该assignRoleMenu 方法所有的表操作都会rollback。原因如下,正是因为@Transactional 的嵌套事务的原因, 我们再来看一下saveBatch的接口方法入口,也加了@Transactional 注解:
如果某个特殊的场景,我们希望saveBatch的执行结果不影响其他操作的执行结果,我们应该如何处理呢,在外层加try-catch?显然是不行的,因为我们还是希望saveBatch需要回滚的。那么我们的解决办法是修改外层方法的事务传播机制或者自己写编程式事务来实现部分回滚。