使用MyBatis的分頁時,一定要注意使用方法。
當表關系為一對多、多對多時,普通直接分頁是有問題的,例如:
一個老師有多個學生,假設每個老師有2個學生,一共有15名老師,此時分頁查詢老師,每頁顯示10條。然而查詢到的結果是:每頁老師只有5名,一共有3頁。
sql語句:
select * from Teacher t inner join Student s on t.id = s.teacher_id where t.clazz_id = ? limit 0,10
原因:由於老師與學生是一對多,那麼用join語句查詢老師時,記錄一共實際上是有30條的,每個老師會重復兩遍(而學生的數據是不同的),那麼分頁雖然出來的是10條,然而有一半老師數據是重復的,經mybatis轉化成對象後,就是有5個老師(每個老師裡有2個學生,共10個學生)。總數由於是30條,那麼總頁數自然也會算成3頁了。
那麼遇到這種情況怎麼辦呢?
正確的做法是:分成2條sql語句
sql語句一:select t.id from Teacher t inner join Student s on t.id = s.teacher_id where t.clazz_id = ? group by t.id limit 0,10
sql語句二:select * from Teacher t inner join Student s on t.id = s.teacher_id where t.id in (?,?,?,?,?,?,?,?,?,?)
第一個sql語句的目的是根據查詢條件進行分頁查詢,通過group by語句對老師進行分組排重。
第二個sql語句的目的是關聯查詢出滿足分頁條件的老師id的所有老師及學生的信息。
總結:造成MyBatis分頁錯誤的原因是join的表是多的一端,但由於查詢條件中可能會有多的一端的條件,又不得不join關聯,因此必須采用group by語句排重,但我們希望通過mybatis將所有對象關系的信息都返回,因此還要發條sql語句關聯查詢出所有表的信息。
MyBatis 的詳細介紹:請點這裡
MyBatis 的下載地址:請點這裡
Java實戰應用:Mybatis實現單表的增刪改 http://www.linuxidc.com/Linux/2014-06/103456.htm
[Java][Mybatis]物理分頁實現 http://www.linuxidc.com/Linux/2014-04/99889.htm
Mybatis快速入門教程 http://www.linuxidc.com/Linux/2013-06/85762.htm
Mybatis的關於批量數據操作的測試 http://www.linuxidc.com/Linux/2012-05/60863.htm
Mybatis中對List<Object> 對象List的批處理插入操作 http://www.linuxidc.com/Linux/2014-02/96916.htm