一个通用的分页实体对象的思考

本文介绍了Java中一个常用的分页实体类`PageEntity`,它提供了处理分页数据的构造方法和基于内存的分页功能。开发者需注意,虽然这是一种抽象思路,但需谨慎使用,可能需要根据具体需求进行调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

用得非常多的一个分页实体对象

说明

只是一种抽象的思路, 可能不一定能够直接使用, 慎用.
只是一种抽象的思路, 可能不一定能够直接使用, 慎用.
只是一种抽象的思路, 可能不一定能够直接使用, 慎用.

分页实体

@Data
public class PageEntity<T> {

    /**
     * 分页后的结果
     */
    private List<T> entityList;

    /**
     * 总计行数
     */
    private long totalSize;

    /**
     * 有参构造
     *
     * @param entityList 数据集合
     * @param totalSize 总数
     */
    public PageEntity(List<T> entityList, long totalSize) {
        this.entityList = entityList;
        this.totalSize = totalSize;
    }

    /**
     * 带分页参数的PageEntity构造器
     *
     * @param entityList 待分页数据
     * @param offset 偏移量
     * @param rows 页大小
     */
    public PageEntity(List<T> entityList, int offset, int rows) {
        offset = Math.max(offset, 0);
        rows = Math.min(rows, entityList.size());
        this.entityList = entityList.stream().skip(offset).limit(rows).collect(Collectors.toList());
        this.totalSize = entityList.size();
    }

    /**
     * 无参构造
     */
    public PageEntity() {
        this.entityList = new ArrayList<>();
        this.totalSize = 0;
    }

    /**
     * 基于内存的分页
     *
     * @param entityList 带分页的集合
     * @param pageSize 页容量
     * @param currnetPage 当前页
     * @return 分页后的实体对象
     * @param <T> 对象实体泛型
     */
    public static <T> PageEntity<T> page(List<T> entityList, int pageSize, int currnetPage) {
        if (pageSize < 1 || currnetPage < 1) {
            throw new IllegalArgumentException("currentPage or pageSize can`t less than 1");
        }

        // 分页
        int beginIndex = (currnetPage - 1) * pageSize;
        int totalSize = entityList.size();

        if (beginIndex < 0) {
            beginIndex = 0;
        } else if (beginIndex >= totalSize) {
            // 规避如下情况: 一开始有那么多数据, 在用户正在查看的时候正好没有了, 那么这时跳转到最后一页
            beginIndex = (totalSize - pageSize > 0 ? (totalSize - totalSize % pageSize) : 0);
        }

        int endIndex = Math.max(beginIndex + pageSize, totalSize);
        // 防止 endIndex 过大变为负数
        endIndex = Math.max(endIndex, 0);

        List<T> data = entityList.subList(beginIndex, endIndex);
        return new PageEntity<>(data, totalSize);
    }
}
### 关于 MyBatisPlus 通用分页实体类的使用 MyBatis-Plus 提供了一套便捷的方法用于处理分页逻辑,这使得开发人员可以更专注于业务逻辑而不是底层的数据访问细节。为了实现分页查询的功能,通常会定义一个泛型化的分页对象 `Page<T>` 来封装分页参数和结果集。 #### 创建分页请求实体类 当涉及到分页时,可以通过创建自定义的分页请求实体类来传递分页所需的参数给服务层或 DAO 层。下面是一个简单的例子展示如何构建这样的实体: ```java import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.Data; @Data public class PageQuery { private Long current = 1L; // 当前页码,默认第一页 private Long size = 10L; // 每页显示条数,默认每页十条记录 /** * 将当前分页条件转换成 MyBatis Plus 的 Page 对象 */ public <T> Page<T> toMpPage() { return new Page<>(current, size); } } ``` 此代码片段展示了怎样建立一个基本的分页查询模型[^2]。`toMpPage()` 方法允许将该实体轻松转化为 MyBatis-Plus 所需的标准形式以便后续调用其内置方法执行分页操作。 #### Mapper 接口编写 由于所有的 mapper 都应该继承 BaseMapper 接口,在这里假设有一个 User 表对应的映射接口如下所示: ```java import org.apache.ibatis.annotations.Mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.User; @Mapper public interface UserMapper extends BaseMapper<User> {} ``` 这段代码表明任何实现了上述接口的对象都可以直接利用由 MyBatis-Plus 自动注入的基础 CRUD 和分页能力[^3]。 #### Service 实现分页查询 最后一步是在 service 层完成具体的分页查询逻辑。例如,如果要获取用户的列表并按照指定页面大小返回,则可以在 UserServiceImpl 中这样写: ```java @Service public class UserServiceImpl implements IUserService { @Autowired private UserMapper userMapper; @Override public IPage<User> getUserList(PageQuery pageQuery) { // 调用 toMpPage 方法得到标准 MP 分页对象 Page<User> mpPage = pageQuery.toMpPage(); // 使用 selectPage 进行分页查询 return userMapper.selectPage(mpPage, null); } } ``` 在这个例子中,`selectPage` 函数接收两个参数:一个是前面提到过的 `Page<T>` 类型变量代表分页设置;另一个则是 Wrapper 查询条件构造器(本例为空),最终返回的是带有总数量信息的结果集合 `IPage<User>`[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值