本系列博客其他文章請點擊下方鏈接查看
【Mybatis-Plus學習筆記】目錄
Mybatis分頁
Mybatis的RowBounds就可以實現分頁,但是這是一種內存分頁,他的原理是把符合邏輯的內存全部查出,然后展示需要的數據。如果數據量小的時候,完全可以使用,但是當數據量大的時候,就是對內存的一種浪費。
MP分頁插件
MP分頁插件可以實現物理分頁,不僅更方便,而且消耗的內存資源更少。
如果需要新建一個配置類,如下:
@Configuration
public class MybatisConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
之后就可以使用selectPage方法,傳入Page和QueryWrapper進行查詢。例子如下:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//實例化的兩個參數分別是當前頁和每頁數量
Page<User> page = new Page<>(1, 2);
IPage<User> ipage = userMapper.selectPage(page, queryWrapper);
//頁數
System.out.println(ipage.getPages());
//總數
System.out.println(ipage.getTotal());
//獲得查詢的記錄
List<User> records = ipage.getRecords();
records.forEach(m-> System.out.println(m));
相當於
''DEBUG==> Preparing: SELECT id,name,age,email,manager_id,create_time FROM user LIMIT ?,?
''DEBUG==> Parameters: 0(Long), 2(Long)
還有一種分頁查詢,selectMapsPage(),與上述方法不同的是返回值是一個Map的集合,通過key-value的形式存儲值。如何抉擇取決於你的需求。
實際上,如果你使用Page,MybatisPlus會默認使用SELECT COUNT(1) FROM user
語句來查找總數量,當你不需要總數量的時候,可以在構造page的時候多加一個Boolean參數,true為查找總數,false相反。如下
Page<User> page = new Page<>(1, 2,false);
多表分頁查詢
如果是多表連接查詢,上述兩種方法,均不可行。但是如果你仍然不想在Sql語句中添加Limit,可以使用Xml文件結合MP分頁插件來完成。
首先,聲明一個方法,這個方法需要兩個參數Page和Wrapper。
IPage<User> selectUserPage(Page<User> page, @Param(Constants.WRAPPER) Wrapper<User> wrapper);
編寫XML
<select id="selectUserPage" resultType="com.fang.entity.User">
select *
from user ${ew.customSqlSegment};
# 可以添加你想要的連表查詢
</select>
最后,把selectPage換成你自定義的selectUserPage即可。
但是多表查詢還是建議自己寫SQL,因為大家要知道無論是Mybatis還是MP,他們都只是一個工具,讓我們的代碼書寫起來更加方便,更加優雅。而真正的SQL語句才是本質,如果盲目的追求工具的使用,就有些本末倒置了。所以在這些工具還是不夠智能的情況下,建議多表查詢的時候還是使用原生SQL比較好。