參考:https://blog.csdn.net/ckc_666/article/details/79257028
Mybatis的一個插件,PageHelper,非常方便mybatis分頁查詢,國內牛人的一個開源項目
github:https://github.com/pagehelper/Mybatis-PageHelper
使用文檔:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
結合example使用例子:
@Service public class BrandService { @Autowired private BrandMapper brandMapper; /** * 根據查詢條件分頁並排序查詢品牌信息 * @param key * @param page * @param rows * @param sortBy * @param desc * @return */ public PageResult<Brand> queryBrandsByPage(String key, Integer page, Integer rows, String sortBy, Boolean desc) { // 初始化example對象 Example example = new Example(Brand.class); Example.Criteria criteria = example.createCriteria(); // 根據name模糊查詢,或者根據首字母查詢 if (StringUtils.isNotBlank(key)) { criteria.andLike("name","%" + key + "%").orEqualTo("letter",key); } // 添加分頁條件 PageHelper.startPage(page,rows); // 添加排序條件 if (StringUtils.isNotBlank(sortBy)) { // 通過判斷desc是true還是false,確定升序還是降序 example.setOrderByClause(sortBy + " " + (desc ? "desc" : "asc")); // 相當於“id desc” } // 將查詢到的結果保存在Brand類型的list中 List<Brand> brands = this.brandMapper.selectByExample(example); // 包裝成pageInfo PageInfo<Brand> pageInfo = new PageInfo<>(brands); // 包裝成分頁的結果集返回 return new PageResult<>(pageInfo.getTotal(),pageInfo.getList()); } }
搬運文檔部分代碼:
PageHelper.startPage
靜態方法調用
除了 PageHelper.startPage
方法外,還提供了類似用法的 PageHelper.offsetPage
方法。
在你需要進行分頁的 MyBatis 查詢方法前調用 PageHelper.startPage
靜態方法即可,緊跟在這個方法后的第一個MyBatis 查詢方法會被進行分頁。
例一:
//獲取第1頁,10條內容,默認查詢總數count PageHelper.startPage(1, 10); //緊跟着的第一個select方法會被分頁 List<Country> list = countryMapper.selectIf(1); assertEquals(2, list.get(0).getId()); assertEquals(10, list.size()); //分頁時,實際返回的結果list類型是Page<E>,如果想取出分頁信息,需要強制轉換為Page<E> assertEquals(182, ((Page) list).getTotal());
例二:
//request: url?pageNum=1&pageSize=10 //支持 ServletRequest,Map,POJO 對象,需要配合 params 參數 PageHelper.startPage(request); //緊跟着的第一個select方法會被分頁 List<Country> list = countryMapper.selectIf(1); //后面的不會被分頁,除非再次調用PageHelper.startPage List<Country> list2 = countryMapper.selectIf(null); //list1 assertEquals(2, list.get(0).getId()); assertEquals(10, list.size()); //分頁時,實際返回的結果list類型是Page<E>,如果想取出分頁信息,需要強制轉換為Page<E>, //或者使用PageInfo類(下面的例子有介紹) assertEquals(182, ((Page) list).getTotal()); //list2 assertEquals(1, list2.get(0).getId()); assertEquals(182, list2.size());
例三,使用PageInfo
的用法:
//獲取第1頁,10條內容,默認查詢總數count PageHelper.startPage(1, 10); List<Country> list = countryMapper.selectAll(); //用PageInfo對結果進行包裝 PageInfo page = new PageInfo(list); //測試PageInfo全部屬性 //PageInfo包含了非常全面的分頁屬性 assertEquals(1, page.getPageNum()); assertEquals(10, page.getPageSize()); assertEquals(1, page.getStartRow()); assertEquals(10, page.getEndRow()); assertEquals(183, page.getTotal()); assertEquals(19, page.getPages()); assertEquals(1, page.getFirstPage()); assertEquals(8, page.getLastPage()); assertEquals(true, page.isFirstPage()); assertEquals(false, page.isLastPage()); assertEquals(false, page.isHasPreviousPage()); assertEquals(true, page.isHasNextPage());
使用參數方式:
想要使用參數方式,需要配置 supportMethodsArguments
參數為 true
,同時要配置 params
參數。 例如下面的配置:
<plugins> <!-- com.github.pagehelper為PageHelper類所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 使用下面的方式配置參數,后面會有所有的參數介紹 --> <property name="supportMethodsArguments" value="true"/> <property name="params" value="pageNum=pageNumKey;pageSize=pageSizeKey;"/> </plugin> </plugins>
在 MyBatis 方法中:
List<Country> selectByPageNumSize( @Param("user") User user, @Param("pageNumKey") int pageNum, @Param("pageSizeKey") int pageSize);
當調用這個方法時,由於同時發現了 pageNumKey
和 pageSizeKey
參數,這個方法就會被分頁。params 提供的幾個參數都可以這樣使用。
除了上面這種方式外,如果 User 對象中包含這兩個參數值,也可以有下面的方法:
List<Country> selectByPageNumSize(User user);
當從 User 中同時發現了 pageNumKey
和 pageSizeKey
參數,這個方法就會被分頁。
注意:pageNum
和 pageSize
兩個屬性同時存在才會觸發分頁操作,在這個前提下,其他的分頁參數才會生效。