分页对象Page

本文介绍了一种基于Java的分页查询实现方案,通过自定义Page类管理分页信息,并提供了一系列方法来处理分页逻辑,如获取当前页、总页数等。此外,还详细解释了如何计算每页显示的记录数以及如何获取特定页面的数据。
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
 * 分页信息 第一页从1开始
 * 
 */
public class Page<T> implements Serializable, Iterable<T> {

	protected List<T> result;

	protected int pageSize=10;

	protected int pageNumber=1;

	/**
	 * 总记录数
	 */
	protected long totalCount = 0;
	
	protected boolean isPagination = true;
	
	private int pageNum;//总页数

	private int startIndex;

	private int limit;

	public int getPageNum() {
	    int  totalPageNum = (int) ((totalCount % pageSize == 0) ? totalCount / pageSize : totalCount / pageSize + 1);
		return totalPageNum;
	}
	
	public Page() {

	}

	public Page(int pageNumber, int pageSize, long totalCount) {
		this(pageNumber, pageSize, totalCount, new ArrayList(0));
	}

	public Page(int pageNumber, int pageSize, long totalCount, List<T> result) {
		if (pageSize <= 0)
			throw new IllegalArgumentException("[pageSize] must great than zero");
		this.pageSize = pageSize;
		this.pageNumber = PageUtils.computePageNumber(pageNumber, pageSize, totalCount);
		this.totalCount = totalCount;
		setResult(result);
	}

	public void setResult(List<T> elements) {
		if (elements == null)
			throw new IllegalArgumentException("'result' must be not null");
		this.result = elements;
	}

	/**
	 * 当前页包含的数据
	 * 
	 * @return 当前页数据源
	 */
	public List<T> getResult() {
		return result;
	}

	/**
	 * 是否是首页(第一页),第一页页码为1
	 * 
	 * @return 首页标识
	 */
	public boolean isFirstPage() {
		return getThisPageNumber() == 1;
	}

	/**
	 * 是否是最后一页
	 * 
	 * @return 末页标识
	 */
	public boolean isLastPage() {
		return getThisPageNumber() >= getLastPageNumber();
	}

	/**
	 * 是否有下一页
	 * 
	 * @return 下一页标识
	 */
	public boolean isHasNextPage() {
		return getLastPageNumber() > getThisPageNumber();
	}

	/**
	 * 是否有上一页
	 * 
	 * @return 上一页标识
	 */
	public boolean isHasPreviousPage() {
		return getThisPageNumber() > 1;
	}

	/**
	 * 获取最后一页页码,也就是总页数
	 * 
	 * @return 最后一页页码
	 */
	public int getLastPageNumber() {
		return PageUtils.computeLastPageNumber(totalCount, pageSize);
	}

	/**
	 * 总的数据条目数量,0表示没有数据
	 * 
	 * @return 总数量
	 */
	public long getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(long totalCount) {
		this.totalCount = totalCount;
	}

	/**
	 * 获取当前页的首条数据的行编码
	 * 
	 * @return 当前页的首条数据的行编码
	 */
	public int getThisPageFirstElementNumber() {
		return (getThisPageNumber() - 1) * getPageSize() + 1;
	}

	/**
	 * 获取当前页的末条数据的行编码
	 * 
	 * @return 当前页的末条数据的行编码
	 */
	public long getThisPageLastElementNumber() {
		int fullPage = getThisPageFirstElementNumber() + getPageSize() - 1;
		return getTotalCount() < fullPage ? getTotalCount() : fullPage;
	}

	/**
	 * 获取下一页编码
	 * 
	 * @return 下一页编码
	 */
	public int getNextPageNumber() {
		return getThisPageNumber() + 1;
	}

	/**
	 * 获取上一页编码
	 * 
	 * @return 上一页编码
	 */
	public int getPreviousPageNumber() {
		return getThisPageNumber() - 1;
	}

	/**
	 * 每一页显示的条目数
	 * 
	 * @return 每一页显示的条目数
	 */
	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 当前页的页码
	 * 
	 * @return 当前页的页码
	 */
	public int getThisPageNumber() {
		return pageNumber;
	}

	public void setPageNumber(int pageNumber) {
		this.pageNumber = pageNumber;
	}

	/**
	 * 得到用于多页跳转的页码
	 * 
	 * @return
	 */
	public List<Integer> getLinkPageNumbers() {
		return PageUtils.generateLinkPageNumbers(getThisPageNumber(), getLastPageNumber(), 10);
	}

	/**
	 * 得到数据库的第一条记录号
	 * 
	 * @return
	 */
	public int getFirstResult() {
		return PageUtils.getFirstResult(pageNumber, pageSize);
	}

	public Iterator<T> iterator() {
		return (Iterator<T>) (result == null ? Collections.emptyList().iterator() : result.iterator());
	}

	public boolean isPagination() {
		return isPagination;
	}

	public void setPagination(boolean isPagination) {
		this.isPagination = isPagination;
	}
}

import java.util.List;

public class PageUtils {

	private PageUtils() {
	}

	public static int getFirstResult(int pageNumber, int pageSize) {
		if (pageSize <= 0)
			throw new IllegalArgumentException("[pageSize] must great than zero");
		return (pageNumber - 1) * pageSize;
	}

	public static List<Integer> generateLinkPageNumbers(int currentPageNumber, int lastPageNumber, int count) {
		int avg = count / 2;

		int startPageNumber = currentPageNumber - avg;
		if (startPageNumber <= 0) {
			startPageNumber = 1;
		}

		int endPageNumber = startPageNumber + count - 1;
		if (endPageNumber > lastPageNumber) {
			endPageNumber = lastPageNumber;
		}

		if (endPageNumber - startPageNumber < count) {
			startPageNumber = endPageNumber - count;
			if (startPageNumber <= 0) {
				startPageNumber = 1;
			}
		}

		java.util.List<Integer> result = new java.util.ArrayList();
		for (int i = startPageNumber; i <= endPageNumber; i++) {
			result.add(new Integer(i));
		}
		return result;
	}

	public static int computeLastPageNumber(long totalElements, int pageSize) {
		int result = (int) (totalElements % pageSize == 0 ? totalElements / pageSize : totalElements / pageSize + 1);
		if (result <= 1)
			result = 1;
		return result;
	}

	public static int computePageNumber(int pageNumber, int pageSize, long totalElements) {
		if (pageNumber <= 1) {
			return 1;
		}
		if (Integer.MAX_VALUE == pageNumber || pageNumber > computeLastPageNumber(totalElements, pageSize)) { // last page
			return computeLastPageNumber(totalElements, pageSize);
		}
		return pageNumber;
	}
}


<think>好的,我现在要帮助用户理解MyBatis-Plus分页对象Page的属性及其含义。首先,我需要回忆一下用户之前的问题和之前的回答。用户之前询问了Java Stream API的常用操作,现在转向了MyBatis-Plus的分页功能,特别是Page对象的属性。 用户现在的问题是:“我想获取MyBatisPlus分页对象Page的所有属性及其意义”。根据用户提供的引用内容,引用[1]、[2]、[3]都涉及MyBatis Plus的分页实现,包括配置分页插件、封装分页方法以及分页信息的获取。用户可能已经按照这些引用配置了分页,现在需要更深入地了解Page对象的结构。 首先,我需要确认MyBatis-Plus中Page类的属性。根据官方文档,Page类继承自Pagination类,主要属性包括records(当前页数据列表)、total(总记录数)、size(每页显示条数)、current(当前页码)、orders(排序条件列表)等。此外,可能还有pages(总页数)等计算属性。需要注意的是,部分属性如pages可能是通过get方法计算的,而不是直接存储的字段。 接下来,我需要将这些属性逐一列出,并解释每个属性的含义和用途。例如,total表示数据库中的总记录数,size是每页的大小,current是当前页码。同时,orders用于排序条件,可以包含多个排序字段和顺序。 用户可能在分页查询后需要将这些信息返回给前端,因此了解每个属性的意义对于正确使用非常重要。例如,前端可能需要总页数来显示分页导航,而pages可以通过total和size计算得到。 此外,用户提供的引用[2]中提到了处理排序的情况,所以在解释orders属性时,需要强调其结构,比如OrderItem对象包含字段和排序方式(ASC/DESC)。用户可能在封装分页方法时已经处理了排序,因此明确orders的作用有助于他们进一步自定义排序逻辑。 还需要注意Page对象在MyBatis-Plus中的使用方式,比如在分页查询后,执行完selectPage方法后,Page对象会被填充这些属性。因此,确保用户了解如何正确执行查询以获取这些属性值。 最后,可能需要提醒用户一些常见问题,比如配置分页插件的重要性,否则分页查询不会生效。同时,分页参数的正确传递,比如pageNum和pageSize的处理,确保查询的是正确的页码和每页数量。 总结步骤: 1. 列出Page对象的各个属性。 2. 对每个属性进行详细解释,包括类型和用途。 3. 提供示例代码展示如何获取和使用这些属性。 4. 补充注意事项,如分页插件的配置和常见问题。 5. 生成相关问题,帮助用户进一步学习。 需要确保回答结构清晰,使用用户容易理解的语言,并参考之前的引用内容,但以用户当前的问题为主。同时,检查是否有遗漏的属性,确保信息的全面性。</think>### MyBatis-Plus分页对象 `Page<T>` 属性详解 以下是 `Page<T>` 类的主要属性及其含义,结合MyBatis-Plus源码及实际应用场景说明: --- #### **核心属性说明** | 属性名 | 类型 | 说明 | |-------------|------------------|--------------------------------------------------------------------| | `records` | `List<T>` | **当前页数据集合**<br>存储查询到的当前页数据列表,如:商品列表、用户列表等 | | `total` | `long` | **总记录数**<br>数据库中符合条件的所有记录总数(非当前页数量) | | `size` | `long` | **每页显示条数**<br>用户设置的每页数据量,如:`pageSize=10` 表示每页10条数据 | | `current` | `long` | **当前页码**<br>用户请求的页码,从1开始计数,如:`pageNum=2` 表示第二页 | | `orders` | `List<OrderItem>`| **排序条件集合**<br>支持多字段排序,每个`OrderItem`包含字段名和排序方式(ASC/DESC) | --- #### **计算属性说明**(通过`get`方法获取) | 属性名 | 获取方式 | 说明 | |-------------|---------------------|--------------------------------------------------------------------| | `pages` | `getPages()` | **总页数**<br>根据`total`和`size`自动计算得出,公式:`total/size`向上取整 | | `hasNext` | `hasNext()` | **是否有下一页**<br>`current < pages`时为`true` | | `hasPrevious` | `hasPrevious()` | **是否有上一页**<br>`current > 1`时为`true` | --- #### **使用示例** ```java // 分页查询商品 Page<Product> page = new Page<>(2, 10); // 第2页,每页10条 page.addOrder(OrderItem.asc("price")); // 按价格升序排列 productMapper.selectPage(page, queryWrapper); // 获取分页属性 List<Product> products = page.getRecords(); // 当前页数据 long totalItems = page.getTotal(); // 总商品数 int totalPages = page.getPages(); // 总页数 boolean hasNext = page.hasNext(); // 是否还有下一页 ``` --- #### **注意事项** 1. **分页插件必须配置** 需在配置类中添加分页拦截器(参考引用[3]),否则分页查询不会生效: ```java @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } ``` 2. **排序字段需合法** 使用`addOrder()`时,字段名需与数据库列名一致(或符合MyBatis-Plus的字段策略)[^2]。 3. **前端参数映射** 建议封装分页参数对象(如引用[2]所示),统一处理`pageNum`、`pageSize`和排序参数。 --- #### **扩展应用场景** - **定制分页响应**:将`Page`对象转换为前端需要的VO格式(保留`total`、`pages`等关键信息) - **多表联查分页**:通过自定义SQL实现复杂查询的分页支持 - **性能优化**:对大数据量分页使用`searchCount(false)`关闭总条数统计 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丵鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值