某天寫了一段CRUD,提測給QA,後來想起來忘記按規則排序了,而後修改了代碼提交,這個時候QA扔給我一條狗,不,是一個BUG。mybatis
心裏一片憂傷,CRUD也有BUG啊,怎麼辦怎麼辦,趕忙看看去。測試
BUG描述:分頁查詢出來的數據有重複和遺漏。這個地方用一個測試表來描述吧。spa
CREATE TABLE `product_info` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵', `partner_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '供應商ID', `poi_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '門店ID', `product_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品ID', `quantity` decimal(18,6) NOT NULL DEFAULT '0.000000' COMMENT '數量', `created_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '建立時間', `modify_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '修改時間', PRIMARY KEY (`id`), UNIQUE KEY `uk_partner_poi_product` (`partner_id`,`poi_id`,`product_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='商品表'
數據表product_info中共有8條數據。3d
分頁查詢第一頁:code
分頁查詢第二頁:blog
結論:從圖上咱們能夠看到 id in(10,40)的數據出現了2次,id in(7,8)的數據沒有被查出來。數據確實出現了重複和遺漏。我以前對於mybatis的理解是它會默認按照ID進行排序的,產生了懷疑。排序
第一頁看起來是排序是亂的,其實並非,這個順序是我寫入數據的順序(10,2,3,40,5,63,7,8 故意把ID弄亂了)。第二頁看起來是按照id進行排序的。ci
也就是說兩次查詢感受用了不同的排序方式?其實不是的。真是狀況是,它用了堆排序。it
那麼不是默認按照ID排序的嗎?其實在非limit的狀況下,默認真的是按照ID排序的。不信,你看!class
那麼面對這種狀況要怎麼解決分頁查詢的遺漏和重複呢?--增長排序字段
但是你看,加了排序字段後仍是漏了一條 id in (3)的數據。這又是爲何呢?
咱們先看看這幾個數據有什麼問題呢,能夠看到這個排序字段對應的值都是同樣的。我懷疑它排序的時候,相同值的排列方式也是堆排序,沒有求證,哪位知道的小哥哥小姐姐求指正。
因此第二頁limit的時候這幾天記錄排序不同,可是從第6條開始取值,就漏掉了3,重複了10。
那麼這到底要怎麼辦?--仍是那句話增長排序字段!
增長一個ID字段進行排序,這樣就能夠把BUG關閉了,否則真的要改行了。