官方文档: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. C++学习笔记26,虚函数

    在C++里面,虚拟功能是功能的一类重要!不同目的可以通过在不同的虚拟功能来达到同样的动作被定义. 举一个简单的例子: #include <iostream> #include <st ...

  2. c#如何获得ModelVisual3D中MeshGeometry3D对象

    原文:c#如何获得ModelVisual3D中MeshGeometry3D对象 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671 ...

  3. cocos2dx 2.2.3 xcode5.0,新mac项目错误

    cocos2dx 2.2.3 xcode5.0,新建mac项目报错 Undefined symbols for architecture x86_64:   "cocos2d::extens ...

  4. 怎么快速构建自己的C/C++程序?——有关编译、静态链接和SCons

    怎么快速构建自己的C/C++程序?--有关编译.静态链接和SCons 1. 写在前面 最初写C++是在Visual Studio这个IDE里,那时我并没有makefile的概念,对程序的编译和链接的一 ...

  5. React学习(3)——ref,key,PureComponent,bindActionCreator

    ref 如果在html里设置ref那么它就指向这个真实的DOM节点. 如果在组件里设置ref,那么它就指向这个组件实例的引用,和组件里面的this互等. 我们经常在表单input,select里使用, ...

  6. SendMessage函数与MSDN系统预定义消息

    SendMessage function https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29. ...

  7. EntityFrameworkCore 单表树状结构配置

    数据结构 public class TreeNode { [Key] public long Id { get; set; } public string NodeName { get; set; } ...

  8. AngularJS table循环数据

    <div ng-app="CycleTableApp" ng-controller="CycleTableContrl as vm"> <h1 ...

  9. WPF数据模板的数据触发器的使用

    <Window x:Class="CollectionBinding.MainWindow"        xmlns="http://schemas.micros ...

  10. .Net 开源服务 and Net站点

    小泥鳅博客系统也是一个.NET平台的开源免费博客系统,创建于2008年夏天,基于.Net平台开发,拥有完整的文章发布,评论,订阅,标签等功能,满足个人/团队信息发布需求,可作为Blog,CMS,甚至建 ...