官方文档: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. [LeetCode] Subsets [31]

    题目 Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must ...

  2. GoldenGate过程 abend,报错OGG-00868 ORA-02396: Exceeded Maximum Idle Time, Please Connect Again

    GoldenGate过程 abend,报错OGG-00868 ORA-02396: Exceeded Maximum Idle Time, Please Connect Again 参考原始: Gol ...

  3. Nginx之Eclipse开发环境配置

    C开发的IDE很多,为什么使用Eclipse?原因: 1. 历史原因:使用eclipse时间长,比较熟悉. 2. 功能原因:使用eclipse查看源码,可以在各个函数与头文件间直接跳转.这是所谓号称& ...

  4. 自定义 DependencyProperty 与 RoutedEvent

    原文:自定义 DependencyProperty 与 RoutedEvent //自定义依赖属性 class MyBook : DependencyObject//依赖属性必须派生自Dependen ...

  5. 基于IdentityServer4的单点登录——Api

    1.新建项目并添加引用 新建一个asp .net core 2.0的项目引用IdentityServer4.AccessTokenValidation 2.配置 将Api与IdentityServer ...

  6. 通通玩blend美工(8)——动态绘制路径动画,画出个萌妹子~

    原文:通通玩blend美工(8)--动态绘制路径动画,画出个萌妹子~ 2年前我在玩Flex的时候就一直有一个疑问,就是如何来实现一个蚊香慢慢烧完的Loading动画呢? 刚经历了某甲方高强度一个月的洗 ...

  7. jquery动态操作元素

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  8. Qt设置窗口的初始大小(使用sizeHint这个虚函数,或者在构造函数里使用resize函数)

    我们用qt创建一个窗口,先后显示它,代码如下: class Mywindow : public QMainWindow{ ..... } int main( int argc, char** argv ...

  9. Java FTP 基本操作

    最近工作中用到了 FTP 相关的操作,所以借此机会了解了下具体内容. FTP基础 关于 FTP 基础推荐阅读<使用 Socket 通信实现 FTP 客户端程序>,其中需要特别注意的是主动模 ...

  10. JQuery 判断checkbox是否选中,checkbox全选,获取checkbox选中值

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...