官方文档: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绘制自定义窗口 WPF是制作界面的一大利器,下面就用WPF模拟一下360的软件管理界面,360软件管理界面如下: 界面不难,主要有如下几个要素: 窗体的圆角 自定义标题栏及按钮 自定义状态 ...

  2. .NET Core 3.0 Preview 5 亮点之一:发布单文件可执行程序

    在阅读 Announcing .NET Core 3.0 Preview 5 时发现了 .NET Core 3.0 Preview 5 的一个新特性 —— Publishing Single EXEs ...

  3. MEF 插件式开发 - 小试牛刀

    原文:MEF 插件式开发 - 小试牛刀 目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Fra ...

  4. Post ,Get 请求

    http://blog.csdn.net/pan_junbiao/article/details/9155497

  5. nodejs dateformat date-utils

    https://www.npmjs.org/package/dateformat https://www.npmjs.org/package/date-utils 来自为知笔记(Wiz)

  6. 【C#】WindowsAPICodePack-Shell使用教程

    原文:[C#]WindowsAPICodePack-Shell使用教程 1.首先在项目中添加WindowsAPICodePack的Nuget包.   点击安装即可. 2.获取<我的电脑>的 ...

  7. Motion Paths in WPF 4 using Expression Blend 4

    原文 Motion Paths in WPF 4 using Expression Blend 4 Posted by: Pravinkumar Dabade , on 3/19/2011, in C ...

  8. wpf屏蔽快捷键alt+space,alt+F4

    /// <summary>        /// 阻止 alt+f4和alt+space 按键        /// </summary>        /// <par ...

  9. IE的BHO通过IHTMLDocument2接口获得网页源代码

    参考了凤之焚的专栏:http://blog.csdn.net/lion_wing/article/details/769742 但是他的源码有些问题,即IHTMLElementCollection接口 ...

  10. SqlServer删除复制监视器中无效的发布名称

    原文:SqlServer删除复制监视器中无效的发布名称 在服务器复制监视器中有一个发布名称,因为该发布订阅已经删除. ReportServerTempDB只有一个发布,已无效,打算删除. --直接删除 ...