歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> MyBatis分頁返回數據不對問題

MyBatis分頁返回數據不對問題

日期:2017/3/1 9:41:22   编辑:Linux編程

使用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

Copyright © Linux教程網 All Rights Reserved