里面的iPageHandle(list.getTotal(), list.getCurrent(), list.getSize(), list.getRecords());我怎么知道用这个方法?怎么用
public PageResult<ActivityDetailVo> getByNamePage(Integer pageNum, Integer pageSize, String name) {
Page<ActivityDetailVo> page = new Page<>(pageNum, pageSize);
IPage<ActivityDetailVo> list = baseMapper.getByNamePage(page, name);
return PageResult.iPageHandle(list.getTotal(), list.getCurrent(), list.getSize(), list.getRecords());
}里面的iPageHandle(list.getTotal(), list.getCurrent(), list.getSize(), list.getRecords());我怎么知道用这个方法?怎么用?什么时候用?是什么?
# PageResult.iPageHandle() 方法详解
这个方法是一个**分页结果转换工具方法**,用于将 MyBatis-Plus 的 `IPage` 对象转换为自定义的 `PageResult` 对象。
## 1. iPageHandle 方法的作用
### 功能:
将 MyBatis-Plus 的分页结果 `IPage` 转换为项目自定义的分页结果 `PageResult`
### 转换关系:
```java
IPage<ActivityDetailVo> (MyBatis-Plus分页对象)
↓ iPageHandle()
PageResult<ActivityDetailVo> (项目自定义分页对象)
```
## 2. 为什么需要这个方法?
### MyBatis-Plus 的 IPage 对象:
```java
IPage<ActivityDetailVo> pageResult = baseMapper.getByNamePage(page, name);
// IPage 包含的字段:
pageResult.getTotal(); // 总记录数
pageResult.getCurrent(); // 当前页码
pageResult.getSize(); // 每页大小
pageResult.getRecords(); // 当前页数据列表
pageResult.getPages(); // 总页数
```
### 项目自定义的 PageResult 对象:
通常项目会定义自己的分页响应格式,比如:
```java
public class PageResult<T> {
private Long total; // 总记录数
private Integer pageNo; // 当前页码
private Integer pageSize; // 每页大小
private List<T> lists; // 数据列表
private Integer pages; // 总页数
private Object extend; // 扩展字段
}
```
## 3. iPageHandle 方法的典型实现
### 在 PageResult 类中的定义:
```java
public class PageResult<T> {
private Long total;
private Integer pageNo;
private Integer pageSize;
private List<T> lists;
private Integer pages;
private Object extend;
// 静态工厂方法:从 IPage 转换
public static <T> PageResult<T> iPageHandle(long total, long current, long size, List<T> records) {
PageResult<T> result = new PageResult<>();
result.setTotal(total);
result.setPageNo((int) current);
result.setPageSize((int) size);
result.setLists(records);
result.setPages((int) Math.ceil((double) total / size));
return result;
}
// 或者更完整的版本
public static <T> PageResult<T> iPageHandle(IPage<T> page) {
PageResult<T> result = new PageResult<>();
result.setTotal(page.getTotal());
result.setPageNo((int) page.getCurrent());
result.setPageSize((int) page.getSize());
result.setLists(page.getRecords());
result.setPages((int) page.getPages());
return result;
}
// getter/setter...
}
```
## 4. 完整的使用流程
### Service 层:
```java
@Service
public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity>
implements ActivityService {
@Override
public PageResult<ActivityDetailVo> getByNamePage(Integer pageNum, Integer pageSize, String name) {
// 1. 创建 MyBatis-Plus 分页对象
Page<ActivityDetailVo> page = new Page<>(pageNum, pageSize);
// 2. 执行分页查询(返回 IPage)
IPage<ActivityDetailVo> iPageResult = baseMapper.getByNamePage(page, name);
// 3. 转换为项目自定义的分页结果
return PageResult.iPageHandle(
iPageResult.getTotal(),
iPageResult.getCurrent(),
iPageResult.getSize(),
iPageResult.getRecords()
);
}
}
```
### 更简洁的写法(如果支持):
```java
public PageResult<ActivityDetailVo> getByNamePage(Integer pageNum, Integer pageSize, String name) {
Page<ActivityDetailVo> page = new Page<>(pageNum, pageSize);
IPage<ActivityDetailVo> iPageResult = baseMapper.getByNamePage(page, name);
// 如果 iPageHandle 支持直接传入 IPage 参数
return PageResult.iPageHandle(iPageResult);
}
```
## 5. 如何知道使用这个方法?
### 查看项目文档或代码:
1. **查看 PageResult 类**:看有哪些静态工厂方法
2. **查看其他Service**:参考其他分页方法的使用方式
3. **查看项目规范**:是否有统一的分页结果处理规范
### 常见的命名约定:
- `iPageHandle()`
- `of()`
- `fromIPage()`
- `buildFromIPage()`
- `convertFromIPage()`
## 6. 什么时候使用这个方法?
### 使用场景:
```java
// 场景1:分页查询Service方法
public PageResult<UserVO> getUserPage(PageQuery query) {
Page<UserVO> page = new Page<>(query.getPageNum(), query.getPageSize());
IPage<UserVO> iPage = userMapper.selectUserPage(page, query);
return PageResult.iPageHandle(iPage);
}
// 场景2:条件分页查询
public PageResult<OrderVO> getOrderPage(OrderQuery query) {
Page<OrderVO> page = new Page<>(query.getPageNo(), query.getPageSize());
IPage<OrderVO> iPage = orderMapper.selectOrderPage(page, query);
return PageResult.iPageHandle(iPage);
}
// 场景3:关联查询分页
public PageResult<ProductDetailVO> getProductPage(ProductQuery query) {
Page<ProductDetailVO> page = new Page<>(query.getPage(), query.getSize());
IPage<ProductDetailVO> iPage = productMapper.selectProductDetailPage(page, query);
return PageResult.iPageHandle(iPage);
}
```
## 7. 如果没有 iPageHandle 方法怎么办?
### 方案1:手动创建 PageResult
```java
public PageResult<ActivityDetailVo> getByNamePage(Integer pageNum, Integer pageSize, String name) {
Page<ActivityDetailVo> page = new Page<>(pageNum, pageSize);
IPage<ActivityDetailVo> iPageResult = baseMapper.getByNamePage(page, name);
// 手动创建 PageResult
PageResult<ActivityDetailVo> result = new PageResult<>();
result.setTotal(iPageResult.getTotal());
result.setPageNo((int) iPageResult.getCurrent());
result.setPageSize((int) iPageResult.getSize());
result.setLists(iPageResult.getRecords());
result.setPages((int) iPageResult.getPages());
return result;
}
```
### 方案2:创建工具类
```java
public class PageUtils {
public static <T> PageResult<T> convertFromIPage(IPage<T> iPage) {
PageResult<T> result = new PageResult<>();
result.setTotal(iPage.getTotal());
result.setPageNo((int) iPage.getCurrent());
result.setPageSize((int) iPage.getSize());
result.setLists(iPage.getRecords());
result.setPages((int) iPage.getPages());
return result;
}
}
// 使用
return PageUtils.convertFromIPage(iPageResult);
```
## 8. 完整的项目实战示例
### Controller 层:
```java
@RestController
@RequestMapping("/activity")
public class ActivityController {
@Autowired
private ActivityService activityService;
@GetMapping("/page")
public AjaxResult<PageResult<ActivityDetailVo>> getPage(
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize,
@RequestParam(required = false) String name) {
PageResult<ActivityDetailVo> pageResult =
activityService.getByNamePage(pageNum, pageSize, name);
return AjaxResult.success(pageResult);
}
}
```
### Service 层:
```java
@Service
public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity>
implements ActivityService {
@Override
public PageResult<ActivityDetailVo> getByNamePage(Integer pageNum, Integer pageSize, String name) {
// 1. 创建分页对象
Page<ActivityDetailVo> page = new Page<>(pageNum, pageSize);
// 2. 执行分页查询
IPage<ActivityDetailVo> iPageResult = baseMapper.getByNamePage(page, name);
// 3. 转换为自定义分页结果
return PageResult.iPageHandle(iPageResult);
}
}
```
### Mapper 层:
```java
public interface ActivityMapper extends BaseMapper<Activity> {
/**
* 根据名称分页查询活动
*/
IPage<ActivityDetailVo> getByNamePage(
@Param("page") Page<ActivityDetailVo> page,
@Param("name") String name
);
}
```
## 9. 总结
**iPageHandle 方法的作用**:
- 🔄 **格式转换**:将 MyBatis-Plus 的 IPage 转换为项目自定义的 PageResult
- 🎯 **统一规范**:保证所有分页接口返回格式一致
- 🔧 **便捷使用**:简化分页结果的处理代码
**使用时机**:
- ✅ **所有分页查询**:需要返回统一分页格式时
- ✅ **Service层方法**:处理完分页查询后
- ✅ **需要自定义分页字段**:项目有特殊的分页需求时
**如何知道使用**:
1. 📖 **查看项目文档**:了解分页规范
2. 🔍 **查看现有代码**:参考其他Service的实现
3. 🛠️ **查看PageResult类**:了解可用的工厂方法
这个方法体现了良好的架构设计思想:**框架适配层**,将第三方框架的结果适配为项目内部统一的格式!
更多推荐


所有评论(0)