文章目錄
- 前言
- 一、支持的數據庫
- 二、配置方法
- 三、屬性介紹
- 四、自定義 Mapper 方法中使用分頁
- 五、其他注意事項
- 六、Page 類
- 七、實戰
- 1. 配置類
- 2. 分頁類
- 3. 測試
- 總結
前言
MyBatis-Plus
的分頁插件 PaginationInnerInterceptor
提供了強大的分頁功能,支持多種數據庫,使得分頁查詢變得簡單高效。
一、支持的數據庫
PaginationInnerInterceptor
支持廣泛的數據庫,包括但不限于:
如果你需要支持的數據庫不在列表中,可以通過 Pull Request 請求添加。
覆蓋范圍很廣,已經支持了眾多國產數據庫。
二、配置方法
在 Spring Boot 項目中,你可以通過 Java 配置來添加分頁插件:
@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {/*** 添加分頁插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多個插件, 切記分頁最后添加// 如果有多數據源可以不配具體類型, 否則都建議配上具體的 DbTypereturn interceptor;}
}
三、屬性介紹
PaginationInnerInterceptor
提供了以下屬性來定制分頁行為:
屬性名 | 類型 | 默認值 | 描述 |
---|---|---|---|
overflow | boolean | false | 溢出總頁數后是否進行處理 |
maxLimit | Long | 單頁分頁條數限制 | |
dbType | DbType | 數據庫類型 | |
dialect | IDialect | 方言實現類 |
建議單一數據庫類型的均設置
dbType
四、自定義 Mapper 方法中使用分頁
你可以通過以下方式在 Mapper
方法中使用分頁:
IPage<UserVo> selectPageVo(IPage<?> page, Integer state);
// 或者自定義分頁類
MyPage selectPageVo(MyPage page);
// 或者返回 List
List<UserVo> selectPageVo(IPage<UserVo> page, Integer state);
對應的 XML 配置:
<select id="selectPageVo" resultType="xxx.xxx.xxx.UserVo">SELECT id,name FROM user WHERE state=#{state}
</select>
如果返回類型是 IPage,則入參的 IPage 不能為 null。如果想臨時不分頁,可以在初始化 IPage 時 size 參數傳入小于 0 的值。 如果返回類型是 List,則入參的 IPage 可以為 null,但需要手動設置入參的 IPage.setRecords(返回的 List)。 如果 XML 需要從 page 里取值,需要使用 page.屬性 獲取。
五、其他注意事項
- 生成 countSql 時,如果 left join 的表不參與 where 條件,會將其優化掉。建議在任何帶有 left join 的 SQL 中,都給表和字段加上別名。
- 在使用多個插件時,請將分頁插件放到插件執行鏈的最后面,以避免 COUNT SQL 執行不準確的問題。
六、Page 類
Page 類繼承了 IPage 類,實現了簡單分頁模型。如果你需要實現自己的分頁模型,可以繼承 Page 類或實現 IPage 類。
屬性名 | 類型 | 默認值 | 描述 |
---|---|---|---|
records | List | emptyList | 查詢數據列表 |
total | Long | 0 | 查詢列表總記錄數 |
size | Long | 10 | 每頁顯示條數,默認 10 |
current | Long | 1 | 當前頁 |
orders | List | emptyList | 排序字段信息 |
optimizeCountSql | boolean | true | 自動優化 COUNT SQL |
optimizeJoinOfCountSql | boolean | true | 自動優化 COUNT SQL 是否把 join 查詢部分移除 |
searchCount | boolean | true | 是否進行 count 查詢 |
maxLimit | Long | 單頁分頁條數限制 | |
countId | String | XML 自定義 count 查詢的 statementId |
七、實戰
1. 配置類
package org.example.springboot3.mybatisplus.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Create by zjg on 2024/7/7*/
@Configuration
public class MybatisPlusConfig {/*** 添加分頁插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多個插件, 切記分頁最后添加// 如果有多數據源可以不配具體類型, 否則都建議配上具體的 DbTypereturn interceptor;}
}
2. 分頁類
package org.example.springboot3.mybatisplus.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.example.springboot3.bigevent.entity.Result;
import org.example.springboot3.mybatisplus.model.User;
import org.example.springboot3.mybatisplus.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;/*** Create by zjg on 2024/7/7*/
@RestController
@RequestMapping("/page/")
public class PageController {@AutowiredUserService userService;@GetMappingResult<List<User>> page(@RequestParam Integer pageNum,@RequestParam Integer pageSize, String name) {// 假設有一個 QueryWrapper 對象,進行有條件的分頁查詢IPage<User> page = new Page<>(pageNum, pageSize);LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class);if(StringUtils.hasLength(name)){queryWrapper.eq(User::getName, name);}IPage<User> userPage = userService.page(page, queryWrapper); // 調用 page 方法List<User> userList = userPage.getRecords();long total = userPage.getTotal();System.out.println("Total users: " + total);return Result.success("請求成功",userList);}
}
3. 測試
總結
回到頂部
通過這些配置和使用方法,你可以輕松地在 MyBatis-Plus 中實現分頁查詢,提高應用的性能和用戶體驗。
更多插件內容請訪問官網