mybatis分页

关于 web 开发中的分页实现

在 web 开发中大体上有两套分页实现

  • 假分页

    先查询所有数据然后通过前端分页(数据量大

  • 真分页

    根据分页页数查询对应数据(数据量少

真分页

思路

Page 类的属性

  1. 当前页
  2. 每页数据量 = 30
  3. 总页数

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
{
if (Page.当前页 == null) {
Page.当前页 = 1;
else {
Page.当前页 = 当前页
}
总记录数 = 通过 count() 获取总记录;
Page.总页数 = (总记录数 % 30 == 0) ? 总记录数 / 30 : (总记录数 / 30) + 1;
查询起始条数 = (当前页 - 1) * 每页数据量;
查询结束记录 = 当前页 * 每页数据量;
最终的数据 = 在数据库中查询从起始条数 ~ 结束条数的记录
}

大体上就是这种思路
我们公司是用 Mybatis 拦截器来做的就是了 - 。-

利用 Mybatis 拦截器实现分页

Mybatis 拦截器实现使用的是 java 的动态代理(InvocationHandler)
Plugins 就是代理类对象,他实现了 InvocationHandler 接口。所以最后会执行 Plugins 的 invoke 方法;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 拦截 Excecutor 下的 query 方法
@Intercepts({@Signature(type = Executor.class, method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class PaginationInterceptor extends Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 拦截后程序的处理
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
// 确定拦截的对象
// 使用 Plugin 的 warp 方法将目标对象封装成 Plugin 的代理类实例
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}

先写这么多 )

0%