溫故而知新,這里記錄一下
一、引言
????????分頁查詢每個(gè)人程序猿幾乎都使用過,但是有部分同學(xué)不懂什么是物理分頁和邏輯分頁。
????????物理分頁:
????????相當(dāng)于執(zhí)行了limit分頁語句,返回部分?jǐn)?shù)據(jù)。物理分頁只返回部分?jǐn)?shù)據(jù)占用內(nèi)存小,能夠獲取數(shù)據(jù)庫最新的狀態(tài),實(shí)施性比較強(qiáng),一般適用于數(shù)據(jù)量比較大,數(shù)據(jù)更新比較頻繁的場景。
????????邏輯分頁:
????????一次性把全部的數(shù)據(jù)取出來,通過程序進(jìn)行篩選數(shù)據(jù)。如果數(shù)據(jù)量大的情況下會消耗大量的內(nèi)存,由于邏輯分頁只需要讀取數(shù)據(jù)庫一次,不能獲取數(shù)據(jù)庫最新狀態(tài),實(shí)施性比較差,適用于數(shù)據(jù)量小,數(shù)據(jù)穩(wěn)定的場合。
二、分頁處理方式
2.1、MybatisPageHelper組件
????????常用的分頁組件有MybatisPageHelper等,分頁原理為先執(zhí)行原SQL+limit語句,再執(zhí)行select count(*) from xxx where xxx語句。
????????一共執(zhí)行了兩次,進(jìn)行了兩次數(shù)據(jù)的篩選和過濾。
2.1.1、MybatisPlusConfig配置
創(chuàng)建MybatisPlusConfig配置類,需要配置分頁插件,小編使用的Spring boot配置方式。
/**
?* @Auther: IT賤男
?* @Date: 2019/6/12 15:06
?* @Description: MybatisPlus配置類
?*/
@Configuration
public class MyBatisPlusConfig {
?
? ? /**
? ? ?* 分頁插件
? ? ?* @return
? ? ?*/
? ? @Bean
? ? public PaginationInterceptor paginationInterceptor() {
? ? ? ? return new PaginationInterceptor();
? ? }
}
2.1.2、具體分頁實(shí)現(xiàn)
MP的Wrapper提供了兩種分頁查詢的方式,源碼如下:
/**
? ? ?* 根據(jù) entity 條件,查詢?nèi)坑涗洠ú⒎摚?? ? ?*
? ? ?* @param page ? ? ? ? 分頁查詢條件(可以為 RowBounds.DEFAULT)
? ? ?* @param queryWrapper 實(shí)體對象封裝操作類(可以為 null)
? ? ?*/
? ? IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
?
? ? /**
? ? ?* 根據(jù) Wrapper 條件,查詢?nèi)坑涗洠ú⒎摚?? ? ?*
? ? ?* @param page ? ? ? ? 分頁查詢條件
? ? ?* @param queryWrapper 實(shí)體對象封裝操作類
? ? ?*/
? ? IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
可見兩個(gè)分頁方法參數(shù)都是一致的,只是返回參數(shù)略有不同,具體選擇根據(jù)實(shí)際業(yè)務(wù)為準(zhǔn)。
? /**
? ? ?* 分頁查詢
? ? ?*/
? ? @Test
? ? public void selectByPage() {
? ? ? ? QueryWrapper<User> wrapper = new QueryWrapper();
? ? ? ? wrapper.like("name", "雨").lt("age", 40);
?
? ? ? ? Page<User> page = new Page<>(1,2);
?
? ? ? ? //IPage<User> userIPage = userMapper.selectPage(page, wrapper);
?
? ? ? ? IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, wrapper);
?
?
? ? ? ? System.out.println("總頁數(shù)"+mapIPage.getPages());
? ? ? ? System.out.println("總記錄數(shù)"+mapIPage.getTotal());
? ? ? ? List<Map<String, Object>> records = mapIPage.getRecords();
? ? ? ? records.forEach(System.out::println);
? ? }
以上分頁查詢執(zhí)行sql如下,先是查詢了一次總記錄數(shù),然后在查詢的數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-818164.html
DEBUG==> ?Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ??
DEBUG==> Parameters: %雨%(String), 40(Integer)
TRACE<== ? ?Columns: COUNT(1)
TRACE<== ? ? ? ?Row: 2
DEBUG==> ?Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,??
DEBUG==> Parameters: %雨%(String), 40(Integer), 0(Long), 2(Long)
TRACE<== ? ?Columns: id, name, age, email, manager_id, create_time
TRACE<== ? ? ? ?Row: 2, 張雨琪, 31, zjq@baomidou.com, 1088248166370832385, 2019-01-14 09:15:15
TRACE<== ? ? ? ?Row: 3, 劉紅雨, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16
DEBUG<== ? ? ?Total: 2
總頁數(shù)1
總記錄數(shù)2
可以看出,質(zhì)量量兩條查詢語句:文章來源地址http://www.zghlxwxcb.cn/news/detail-818164.html
- SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ?
- SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,?
2.2、PageHelper組件
2.2.1. 添加 Maven 依賴
1 2 3 4 5 6 |
到了這里,關(guān)于mybatis&Mysql分頁查詢,以及SQL_CALC_FOUND_ROWS與count(*) 性能對比的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!