1? Mybatis-plus 根據(jù) ID列表查詢數(shù)據(jù)
? ? ? 查詢結(jié)果返回的List 和傳入的id列表的順序不一致? 是亂序的锉矢。開始我以為是mybatis-plus的坑 于是我用自己寫sql的方式試了一下:
? ?測試結(jié)果如下:
? ? ? 發(fā)現(xiàn)錯怪了Plus,原來是mybatis原生的問題,估計(jì)是利用的主鍵的B+樹索引的自然排序 輸出的結(jié)果。這是本人的猜測,因此具體原因還是不太清楚? 沒有追進(jìn)mybatis源碼一看究竟否灾,但是我想到了怎么去解決的辦法:
? ? ?因此我們在特定的對查詢結(jié)果排序有要求的場景下,在Mybatis中需要自己寫MAPPER.XML文件來手動的編寫動態(tài)查詢SQL(利用foreach標(biāo)簽遍歷主鍵id)鸣奔。
2? mybatis-plus基礎(chǔ)serivce的savebatch和saveOrUpdateBatch
? ? ? 先來看坑比較多的saveOrUpdateBatch墨技,從方法名表面來看是想根據(jù)查詢結(jié)果來更新或者插入數(shù)據(jù)的,結(jié)果你傳的list的對象里面如果有主鍵為空的對象的時候會報(bào)錯挎狸,詳見源碼截圖:
? ? 因此如果你還是要區(qū)分 是否有ID的數(shù)據(jù)扣汪,如果ID為NULL的話需要用savebatch。但是savebatch也有問題锨匆,就是如果數(shù)據(jù)量比較大的話會執(zhí)行的比較慢崭别,因?yàn)樗昧薴or循環(huán)去調(diào)用sqlSession.flushStatements()這個方法進(jìn)行插入,具體代碼如下:這個方法進(jìn)行插入恐锣,具體代碼如下:
? ? ? ?接下來我們繼續(xù)看一個問題茅主,如果你的代碼中有其他數(shù)據(jù)庫操作和savebatch一起執(zhí)行的時候,代碼如下:
? ? 如果在執(zhí)行saveBatch的時候出現(xiàn)異常土榴,則該assignRoleMenu?方法所有的表操作都會rollback诀姚。原因如下,正是因?yàn)锧Transactional 的嵌套事務(wù)的原因玷禽, 我們再來看一下saveBatch的接口方法入口学搜,也加了@Transactional? 注解:
? ?如果某個特殊的場景娃善,我們希望saveBatch的執(zhí)行結(jié)果不影響其他操作的執(zhí)行結(jié)果,我們應(yīng)該如何處理呢瑞佩,在外層加try-catch聚磺?顯然是不行的,因?yàn)槲覀冞€是希望saveBatch需要回滾的炬丸。那么我們的解決辦法是修改外層方法的事務(wù)傳播機(jī)制或者自己寫編程式事務(wù)來實(shí)現(xiàn)部分回滾瘫寝。