java逻辑自动分页功能

该博客介绍了一种通过MyBatis拦截器实现逻辑分页的方法。首先创建了PageData、PageNav、PageRequest和PageInterceptor四个类,分别用于存储分页信息、分页导航、分页请求和拦截SQL进行分页处理。PageInterceptor拦截以'page'结尾的SQL,计算总页数和当前页数据。然后通过配置拦截器并修改SQL的id为以page结尾,实现自动分页功能。
摘要由CSDN通过智能技术生成

原理:通过拦截器,在mybatis执行sql语句前,对sql语句进行处理,最后获得所需的所有分页数据。

步骤:

1.需要创建四个类:PageData,PageNav,PageRequest,PageInterceptor,ReflectHelper

2.其作用:

PageData:用于包含分页的所有信息

PageNav:分页导航信息

PageRequest:分页请求对象,用于进行分页时传入的参数

PageInterceptor:分页用到的拦截器

ReflectHelper:用于反射执行的对象或方法。

3.用法:

1)配置拦截器:

<configuration>
<plugins>
<plugin interceptor="拦截器包路径">
<property name="dialect" value="mysql(指对应的数据库类型)" />
<property name="pageSqlId" value=".*page(拦截器拦截的规则,要求执行的sql方法要以page结尾)" />
</plugin>
</plugins>

</configuration>

2)mybatis的sql类型中的select元素中id的值要以page结尾

<select id="hahapage" resultMap="BaseResultMap">
select *  from user
</select>

3.代码如下:

PageData代码:

public class PageData<T> {
protected final int pageSize;
protected final int firstIndex;
protected final int lastIndex;
protected final List<T> items;
protected final int totalItems;
protected final int totalPages;
protected int currentPage;
protected final int pageItemsCount;


public int getPageSize() {
return this.pageSize;
}


public int getFirstIndex() {
return this.firstIndex;
}


public int getLastIndex() {
return this.lastIndex;
}


public List<T> getItems() {
return this.items;
}


public int getTotalItems() {
return this.totalItems;
}


public int getTotalPages() {
return this.totalPages;
}


public int getCurrentPage() {
return this.currentPage;
}


public int getPageItemsCount() {
return this.pageItemsCount;
}


public PageData() {
this(1, 0, PageRequest.defaultPageSize, (List) null);
}


public PageData(int page, int size) {
this(page, size, PageRequest.defaultPageSize, (List) null);
}


public PageData(int page, int size, int pageSize) {
this(page, size, pageSize, (List) null);
}


public PageData(PageRequest req, int size, List<T> items) {
this(req.getPage(), size, req.getSize(), items);
}


public PageData(int page, int size, int pageSize, List<T> items) {
if (pageSize <= 0) {
pageSize = PageRequest.defaultPageSize;
}


this.pageSize = pageSize;
this.totalItems = size;
this.items = items;
this.totalPages = this.totalItems % pageSize == 0 ? this.totalItems / pageSize : this.totalItems / pageSize + 1;
if (page < 1) {
page = 1;
}


if (page > this.totalPages) {
page = this.totalPages;
}


this.currentPage = page;
this.firstIndex = calcFirstItemIndexOfPage(page, pageSize, size);
int last = this.isLastPage() ? this.totalItems - 1 : this.firstIndex + pageSize - 1;
int itemsPerPage = last - this.firstIndex + 1;
if (last < 0) {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值