## 分頁查詢 **分析:** * 分析文檔要求 * 查看前端傳遞給後臺的參數 * 分析參數進行編碼 * 後臺返回給前端的數據 **思路** 瀏覽器 - > Controller層 - > Service層 - > Mapper層 - > 資料庫 ### **設置分頁攔截器** ```java @C ...
分頁查詢
分析:
-
分析文檔要求
-
查看前端傳遞給後臺的參數
-
分析參數進行編碼
-
後臺返回給前端的數據
思路
瀏覽器 - > Controller層 - > Service層 - > Mapper層 - > 資料庫
設置分頁攔截器
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 創建MybatisPlusInterceptor攔截器對象
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
// 添加分頁攔截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mpInterceptor;
}
}
IPage分頁對象的常用調用方法
IPage內部原理是基於攔截去,攔截的是方法以及方法中的參數,會判斷是否查詢操作。如果是查詢操作,才會進入分頁的邏輯處理。進入分頁的邏輯處理後,攔截器會通過反射獲取該方法的參數進行判斷是否存在IPage對象的實體類。如果不存在就不進行分頁,存在則將該參數賦值給IPage對象。再進行拼接sql處理完成IPage對象。
void selectPage() {
// 1 為當前頁碼 2 為每頁的記錄數
IPage<User> page=new Page<>(1,3);
userDao.selectPage(page,null);
System.out.println("當前頁碼值:"+page.getCurrent());
System.out.println("每頁顯示數:"+page.getSize());
System.out.println("一共多少頁:"+page.getPages());
System.out.println("一共多少條數據:"+page.getTotal());
System.out.println("數據:"+page.getRecords());
}
流程
Controller層
@RestController
@RequestMapping("/emps")
public class EmpController {
@Autowired
private EmpService empService;
// @RequestParam使用defaultValue屬性設置預設值
// @GetMapping請求映射的地址
@GetMapping
public Result selectLimit(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer pageSize) {
// 調用業務層進行查詢
PageBean pageBean = empService.selectLimit(page, pageSize);
// 返回打包封裝後的數據
return Result.success(pageBean);
}
}
Service層
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean selectLimit(Integer page, Integer pageSize) {
// 定義Emp實體對象封裝操作類
QueryWrapper<Emp> queryWrapper = new QueryWrapper<>();
// 進行分頁查詢
IPage<Emp> iPage = new Page<>(page, pageSize);
iPage = empMapper.selectPage(iPage, queryWrapper);
//封裝返回值 返回
return new PageBean(iPage.getTotal(), iPage.getRecords());
}
}
Mapper層
@Mapper
public interface EmpMapper extends BaseMapper<Emp> {
}
條件分頁查詢
Controller 層
- 接受參數(分頁參數, 查詢條件)
- 調用service進行條件分頁查詢, 獲取pagebean
- 響應
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
@Autowired
private EmpService empService;
// 此處為了方便測試,不整合
@GetMapping
public Result selectLimit(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer pageSize,
String name, Short gender,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
// log.info("數據:{},{},{},{},{},{}", page, pageSize, name, gender, begin, end);
PageBean pageBean = empService.selectLimit(page, pageSize, name, gender, begin, end);
return Result.success(pageBean);
}
}
Service 層
LambdaQueryWrapper
和 QueryWrapper
都是 Mybatis Plus 中的查詢條件封裝類,這裡使用的是LambdaQueryWrapper
,它和QueryWrapper
的區別是列名匹配的是Lambda的語法,偏向於對象,而QueryWrapper
列名匹配使用使用的是“資料庫中的欄位名”
優點: 更加簡便的查詢語法,避免了SQL註入的風險,避免運行時出現類型錯誤,編譯時能捕獲到類型錯誤
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean selectLimit(Integer page, Integer pageSize,
String name, Short gender,
LocalDate begin, LocalDate end) {
// 創建LamdbaQueryWrapper對象
LambdaQueryWrapper<Emp> queryWrapper = new LambdaQueryWrapper<>(Emp.class);
// 判斷是否為空條件,LambdaQueryWrapper提供的方法添加條件
if(name != null && name != "") {
queryWrapper.like(Emp::getName, name);
}
if(gender != null) {
queryWrapper.eq(Emp::getGender, gender);
}
if(begin != null)
queryWrapper.eq(Emp::getEntrydate, begin);
if(end != null)
queryWrapper.eq(Emp::getCreateTime, end);
// 定義分頁對象
IPage<Emp> iPage = new Page<>(page, pageSize);
// 根據分頁對象執行資料庫查詢
iPage = empMapper.selectPage(iPage, queryWrapper);
//封裝返回值 返回
return new PageBean(iPage.getTotal(), iPage.getRecords());
}
}
借閱:MyBatis-Plus分頁插件IPage的使用展示------分頁查詢_mybatisplus ipage_星域_03zhan的博客-CSDN博客