官方文档:https://github.com/pagehelper/pagehelper-spring-boot

1、引入包,测试过以下版本兼容性还是比较好的

    <!--Mybatis-SpringBoot集成-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!--mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.3-beta1</version>
</dependency>

2、配置插件,直接贴application.yml 文件内容:

spring:
datasource:
name: mydb
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/mar?useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
minIdle: 1
maxActive: 20
initialSize: 1
timeBetweenEvictionRunsMillis: 3000
minEvictableIdleTimeMillis: 300000 mybatis:
#mapper 的地址
mapperLocations: classpath*:mapper/*.xml
type-aliases-package: tk.mybatis.springboot.model mapper:
not-empty: false
#数据库类型
identity: MYSQL
#分页插件配置
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql

3、配置完成已经可以使用了:

  //设置好分页信息
PageHelper.startPage(1, 2);
//查询用户列表
users = userService.listUser();
//用PageInfo对结果进行包装
page = new PageInfo(users);

4、至于listUser()这个方法的sql,什么都不用做,因为PageHelper采用的是拦截器方式实现的分页:

  <select id="listUser"  resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
</select>

5、Demo下载地址:https://download.csdn.net/download/the_fool_/10958436

6、SSM框架的配置:

7、实现原理:

8、高效分页demo(转载,版本要5.0.0)https://blog.csdn.net/weixin_36666151/article/details/80471767

摘抄了部分关键代码,主要是对单表查询,多表查询原作者没写, 但是还是有一定的参考价值的:

   接下来我们来修改mybatis分页插件的拼接limit语句的逻辑代码,方法非常简单,新建一个这样的类,下面的的代码全部不要改,包名,类名都不能改。其目的就是利用Java类加载机制,替代其原来jar包里面有的这个对象,因为这个对象已经存在了,Java就不会再去加载其原来插件里面的这个对象了,从而巧妙的修改了其源码。

package com.github.pagehelper.dialect.helper;

import org.apache.ibatis.cache.CacheKey;

import com.github.pagehelper.Page;
import com.github.pagehelper.dialect.AbstractHelperDialect; public class MySqlDialect extends AbstractHelperDialect {     @Override
    public String getPageSql(String sql, Page page, CacheKey pageKey) {
        StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
        
        sql= sql.toLowerCase();//全部转换成小写形式
        
        if (page.getStartRow() == 0) {
        sqlBuilder.append(sql);
            sqlBuilder.append(" LIMIT ");
            sqlBuilder.append(page.getPageSize());
        } 
        
        else if(page.getStartRow()>10000&&this.inSingletonTable(sql)){//判断是否是大页码并且单表查询         String[] tables = this.getTableName(sql);
       
        String sql1 =sql.split(tables[0])[0];
       
        sqlBuilder.append(sql1);
       
        sqlBuilder.append(" (Select id as id2,(@rowNum:=@rowNum+1) as rowNo From ");
        sqlBuilder.append(tables[0]);
        sqlBuilder.append(",(Select (@rowNum :=0) ) b) r ,");
        sqlBuilder.append(tables[0]);
        sqlBuilder.append(" ");
        sqlBuilder.append(tables[1]!=null?tables[1]:" ");
        sqlBuilder.append(" where r.id2= ");
        sqlBuilder.append(tables[1]!=null?tables[1]:tables[0]);
        sqlBuilder.append(".id ");
        sqlBuilder.append(" and r.rowNo> ");
        sqlBuilder.append(page.getStartRow());
       
        if (sql.contains("where")) {//拼接原来SQL语句中的where语句后面的语句
        sqlBuilder.append(" and ");
        sqlBuilder.append(sql.split("where")[1]);
}else {
       
        //拼接原有的SQL表名后面的一段后面
        if (tables[1]!=null) {//表有别名
        String[] sql2 =sql.split(tables[1]);
        sqlBuilder.append(" ");
        sqlBuilder.append(sql2.length>1?sql2[1]:" ");
}else {
String[] sql2 =sql.split(tables[0]);
sqlBuilder.append(" ");
        sqlBuilder.append(sql2.length>1?sql2[1]:" ");
}
       
}
        sqlBuilder.append(" LIMIT ");
             sqlBuilder.append(page.getPageSize());         }else{
        sqlBuilder.append(sql);
            sqlBuilder.append(" LIMIT ");
            sqlBuilder.append(page.getStartRow());
            sqlBuilder.append(",");
            sqlBuilder.append(page.getPageSize());
            pageKey.update(page.getStartRow()); 
        }
        pageKey.update(page.getPageSize());
        return sqlBuilder.toString();
    }
    
    private boolean inSingletonTable(String sql) {
   
    if (sql.contains("join")||sql.contains("JOIN")) {
return false;
}
   
    if (sql.contains("where")) {
    if (sql.contains("from")) {
    String tables= sql.split("from")[1].split("where")[0];
    if (tables.contains(",")) {
    return false;
}
   
}
     
}
   
return true; }
    
    
    
private String[] getTableName(String sql) { String[] tables = new String[2];
if (sql.contains("where")) { String tablenames = sql.split("from")[1].split("where")[0]; tablenames = this.removekg(tablenames);//删除表名前后的空格 if (tablenames.contains(" ")) {
tables=tablenames.split(" ");
return tables; }else {
tables[0]=tablenames;
return tables;
} } else if (sql.contains("group")&&!sql.contains("order")) {        String tablenames = sql.split("from")[1].split("group")[0]; tablenames = this.removekg(tablenames);//删除表名前后的空格 if (tablenames.contains(" ")) {
tables=tablenames.split(" ");
return tables; }else {
tables[0]=tablenames;
return tables;
} } else if (sql.contains("order")&&!sql.contains("group")) {
String tablenames = sql.split("from")[1].split("order")[0]; tablenames = this.removekg(tablenames);//删除表名前后的空格 if (tablenames.contains(" ")) {
tables=tablenames.split(" ");
return tables; }else {
tables[0]=tablenames;
return tables;
} } else if (sql.contains("order")&&sql.contains("group")) { int orderIndex =sql.indexOf("order");
int groupIndex =sql.indexOf("group");
 
if (orderIndex<groupIndex) {
String tablenames = sql.split("from")[1].split("order")[0]; tablenames = this.removekg(tablenames);//删除表名前后的空格 if (tablenames.contains(" ")) {
tables=tablenames.split(" ");
return tables; }else {
tables[0]=tablenames;
return tables;
} }else { String tablenames = sql.split("from")[1].split("group")[0]; tablenames = this.removekg(tablenames);//删除表名前后的空格 if (tablenames.contains(" ")) {
tables=tablenames.split(" ");
return tables; }else {
tables[0]=tablenames;
return tables;
} }
 
 
}else if (!sql.contains("where")&&!sql.contains("order")&&!sql.contains("group")) {
String tablenames = sql.split("from")[1];
tablenames = this.removekg(tablenames);//删除表名前后的空格
if (tablenames.contains(" ")) {
tables=tablenames.split(" ");
return tables; }else {
tables[0]=tablenames;
return tables;
}
}  return tables; 
}
     //删除字符串两头的空格
private String removekg(String textContent) { textContent = textContent.trim();
while (textContent.startsWith(" ")) {//这里判断是不是全角空格
textContent = textContent.substring(1, textContent.length()).trim();
}
while (textContent.endsWith(" ")) {
textContent = textContent.substring(0, textContent.length() - 1).trim();
}
return textContent;
} }

【分页工具-spring boot】Mybatis PageHelper 集成Spring boot的更多相关文章

  1. spring boot rest 接口集成 spring security(2) - JWT配置

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  2. spring boot rest 接口集成 spring security(1) - 最简配置

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  3. Spring MVC 学习总结(十)——Spring+Spring MVC+MyBatis框架集成(IntelliJ IDEA SSM集成)

    与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...

  4. Spring+SpringMvc+Mybatis框架集成搭建教程

    一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...

  5. 【Spring】关于Boot应用中集成Spring Security你必须了解的那些事

    Spring Security Spring Security是Spring社区的一个顶级项目,也是Spring Boot官方推荐使用的Security框架.除了常规的Authentication和A ...

  6. 关于Boot应用中集成Spring Security你必须了解的那些事

    Spring Security Spring Security是Spring社区的一个顶级项目,也是Spring Boot官方推荐使用的Security框架.除了常规的Authentication和A ...

  7. (通用Mapper、分页,批量插入,一分钟接入)spring mvc+mybatis+maven集成tkmapper+pagehelper

    <!-- maven tkmapper引入--> <dependency> <groupId>tk.mybatis</groupId> <arti ...

  8. spring mvc+mybatis+maven集成tkmapper+pagehelper

    <!-- maven tkmapper引入--> <dependency> <groupId>tk.mybatis</groupId> <arti ...

  9. Spring MVC 学习总结(六)——Spring+Spring MVC+MyBatis框架集成

    与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...

随机推荐

  1. 使用WPF创建画图箭头

    原文:使用WPF创建画图箭头 今天要给leader line画个箭头,所以就google一下,找到下面的文章,写的不错,可以实现我的需求,所以就摘录下来. 我把源代码中的arraw.cs加入到我的工程 ...

  2. theano 安装杂记

    0. MinGW MinGW:Windows 下的 g++等linux 下的编译工具: Anaconda 下 MinGW 的安装(进行 windows cmd 界面):conda install mi ...

  3. 【Java】【Flume】Flume-NG阅读源代码AvroSink

    org.apache.flume.sink.AvroSink是用来通过网络来数据传输的.能够将event发送到RPCserver(比方AvroSource),使用AvroSink和AvroSource ...

  4. ADT eclipse的几个快捷键

    智能内容感知 Alt+/ ,该快捷键可以方便的匹配我们使用的类信息,/ 在键盘上和?是同一个按键. ctrl+.及ctrl+1:下一个错误及快速修改 ctrl+.将光标移动至当前文件中的下一个报错处或 ...

  5. WPF中TextBlock文本换行与行间距

    原文:WPF中TextBlock文本换行与行间距 换行符: C#代码中:\r\n 或  \r 或 \n XAML中: 或 注:\r 回车 (carriage return 缩写),\n 新行 (new ...

  6. QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)

    原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(1) 提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一 ...

  7. WPF RenderTransform的使用

    呈现变形的元素并没有改变位置,只是呈现在不同的位置而已,所以动画要用呈现变形 好处:为了效率,如果改变位置的话,需要重新测量,布局 <Window x:Class="wpf180709 ...

  8. Qt 显示 GIF

    Qt 中,静态图片 PNG,JPG 等可以用其创建 QPixmap,调用 QLabel::setPixmap() 来显示,但是能够具有动画的 GIF 却不能这么做,要在 QLabel 上显示 GIF, ...

  9. MeasureOverride 和 ArrangeOverride

    原文:MeasureOverride 和 ArrangeOverride FrameworkElement.MeasureOverride方法实现当在派生类中重写时,测量子元素在布局中所需的大小,然后 ...

  10. 完美实现鼠标拖拽事件,解决各种小bug,基于jquery

    鼠标拖拽事件是web中使用频率极高的事件,之前写过的代码包括网上的代码,总存在各种各样的问题,包括拖拽体验差,松开鼠标后拖拽效果仍存在以及代码冗余过大等 本次我才用jQuery实现一个尽可能高效的拖拽 ...