IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 自定义的一款MyBatis的分页插件 -> 正文阅读

[Java知识库]自定义的一款MyBatis的分页插件

源码地址:
github:https://github.com/verygoodwlk/ken-page-pom
gitee:https://gitee.com/wlkken/ken-page-pom

一、ken-page

1、一款基于Mybatis的分页插件
2、可以兼容原生MyBatis、tk-Mybatis以及Mybatis-Plus等主流框架
3、解决复杂关联查询导致分页错误的问题
4、配合Web层拦截,实现无侵入式分页

二、SQL执行监控功能

插件自带SQL执行记录以及耗时监控功能,所有运行的sql语句以及相关参数还有耗时时间都将被日志记录

[SQL] executor - [select * from test where id = ?]
[SQL] params[0] - [id:5]
[SQL] take up time - [0.013s]

关闭SQL执行监控,只需要在application.yml配置即可

#关闭SQL记录,默认开启
kenplugin:
 execsql:
  enable: false

三、分页基本使用

添加依赖

<dependency> 
   <groupId>io.github.verygoodwlk</groupId>
   <artifactId>ken-page-boot-starter</artifactId>
   <version>1.1</version>
</dependency>

开启分页 - 在业务合适的地方,调用以下代码开启分页

//pageNum - 当前页码
//pageSize - 每页显示多少条
//注意:这行代码后,当前业务的所有数据库查询操作都将自动实现分页效果
KenPages.setPage(new Page(pageNum, pageSize));

查询后获取分页信息(总条数、总页码等数据)

//分页的相关信息
Page page = KenPages.getPage();
int count = page.getCount(); //获得总记录数
int totle = page.getTotle(); //总页数

注意:因为分页插件的无侵入设计,可以随时停止所有分页的功能。只需在application.yml中配置即可

#关闭分页功能 - 分页的业务会自动变成查询全部,默认开启
kenplugin:
 page:
  enable: false

四、复杂业务定制化分页

在一些复杂的业务中,可能存在多个子业务,有些子业务可能需要分页,有些子业务不需要,则可以使用定制化分页的功能

开启分页定制化

//参数二:表示开启定制化分页,默认关闭
KenPages.setPage(new Page(pageNum, pageSize), true);

标记分页注解 - 通常在子业务方法或者mapper接口方法上标记

主业务方法(){
   //开启分页
   KenPages.setPage(new Page(pageNum, pageSize), true);
   //子业务1方法
   //子业务2方法
   //子业务3方法
   //子业务4方法
}

子业务1方法(){
}

@Paging
子业务2方法(){
}

子业务3方法(){
}

@Paging
子业务4方法(){
}

当前模式下,只有标注了@Paging注解的业务,才会受到分页的影响
@Paging注解可以直接标记在Mapper接口的方法上

五、多表关联SQL分页

实际开发过程中,SQL可能会关联多张表查询,导致查出来的分页结果会存在数量不足的问题,比如

select * from 
    table1 t join table2 t2 on t1.id = t2.tid

以上这条SQL,本意是讲table1作为主表,关联查询出table2的结果,table2的结果作为子集放入到table1对应的记录中。
此时,如果要分页,应该是对table1表进行分页,但是因为关联的存在,实际table1查询出来的记录,并不会满足当前页的记录数。

解决方案

我们需要调整下SQL的结构

select * from
  (@{select * from table1 limit ?}) t join table2 t2 on t.id = t2.tid 

table1作为主表,我们可以人为将主表的查询部分独立出来,然后在主表查询前后加上@{},
插件会自动判别到该部分为主表查询,会先对该部分分页,再将分页出来的结果去关联其他表,
这样就会得到正确的分页结果。实际情况可能比这个复杂的多,所以需要开发者根据实际的业务去动态调整SQL语句的结构。

注意:@{}在Mybatis的映射文件中可能会报错,那是因为@{}被MyBatis的dtd约束文件判定为不合法的字符,这里开发者无需在意,
该错误并不影响SQL的执行

六、Web层自动化兼容分页

开启Web层分页兼容配置(默认关闭)

#开启web层分页兼容配置
kenplugin:
 page:
  webconfig:
   enable: true

客户端传递分页参数

#pageNum - 当前页
#pageSize - 每页显示多少条
http://server.com/xxxx?pageNum=1&pageSize=5

开启web层兼容分页后,只需要客户端传递分页参数,后续业务会自动化完成分页,
无需再使用KenPages.setPage(new Page(pageNum, pageSize));方法来开启分页。

业务复杂的情况下,仍然可以使用@Paging注解实现定制化分页

定制分页参数名称

当不想使用pageNum和pageSize作为参数名称时,可以定制名称

kenplugin:
 page:
  key:
   #定制当前页的参数名称
   num: pageNo
   #定制每页条数的参数名称
   size: pageS

返回分页信息给客户端

Web层(Controller方法)返回的对象必须继承BaseResult类,比如

class OutPut<T> extends BaseResult{
    Integer code;
    String msg;
    T datas;
}

@RequestMapping("/xxx/xxx")
public OutPut<List<A>> xxxx(){
}

客户端会收到如下的结果数据:

{
    //分页信息
    "page": {
        "pageNum": 1,
        "pageSize": 2,
        "count": 25,
        "totle": 13
    },
    "code": 200,
    "message": "请求成功",
    "data": [
        {
            //数据部分....
        }
    ]
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:03:50  更:2021-08-04 11:04:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 8:49:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码