关注spring boot微信公众号,第一时间了解最新的spring boot动态,当前已经更新到:《184. Spring Boot 2.0终于正式发布》 、《185.Spring Boot使用FastJson解析JSON数据:中文乱码》
需求缘起:
在之前的文章中我们介绍了mybatis的自定义插件以及原理,我们最终的目的是要分析下分页插件的原理。
一、PageHelper是如何在mybatis中工作
PageHelper是如何在mybatis中工作呢,是通过mybatis的pulgin实现了Interceptor接口。这个部分在之前的文章中花了不少篇幅进行介绍了,PageHelper也不另外,如下源码(版本:pagehelper-4.2.1):
@SuppressWarnings("rawtypes") @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})) public class PageHelper extends BasePageHelper implements Interceptor { private final SqlUtil sqlUtil = new SqlUtil(); @Override public Object intercept(Invocation invocation) throws Throwable { return sqlUtil.intercept(invocation); } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { sqlUtil.setProperties(properties); } }
这里就不过多在进行阐述。这里PageHelper有一个地方就是如何进行分页参数的传递的。
二、PageHelper使用原理
PageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句,所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句。看源码:
找到startPage代码:
public static <E> Page<E> startPage(int pageNum, int pageSize) { return startPage(pageNum, pageSize, true); }
最终是执行到代码:
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) { Page<E> page = new Page<E>(pageNum, pageSize, count); page.setReasonable(reasonable); page.setPageSizeZero(pageSizeZero); //当已经执行过orderBy的时候 Page<E> oldPage = SqlUtil.getLocalPage(); if (oldPage != null && oldPage.isOrderByOnly()) { page.setOrderBy(oldPage.getOrderBy()); } SqlUtil.setLocalPage(page); return page; }
这里有定义了一个Page对象,如下源码:
public class Page<E> extends ArrayList<E> { private static final long serialVersionUID = 1L; /** * 页码,从1开始 */ private int pageNum; /** * 页面大小 */ private int pageSize; /** * 起始行 */ private int startRow; /** * 末行 */ private int endRow; /** * 总数 */ private long total; /** * 总页数 */ private int pages; //摘取部分源码… }
这里重要的代码:SqlUtil.setLocalPage(page):
public static void setLocalPage(Page page) { LOCAL_PAGE.set(page); }
那么LOCAL_PAGE是什么呢?
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
所以PageHelper就是使用ThreadLocal存储了Page对象,在这个对象中有我们设置的pageNum、pageSize,也会查询返回的pages、total。
好了,就说这么多吧,更深入的东西还需要靠自己去摸索。
关注spring boot微信公众号,第一时间了解最新的spring boot动态,当前已经更新到:《185. Spring Boot 2.0终于正式发布》
———— 微信公众号 ————
提供Spring Boot资讯、技术文章,具体关注方式:
搜索springboot或者扫描以下二维码即可关注
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr
相关推荐
Spring Boot集成MyBatis与分页插件
spring boot mybatis oracle 例子 1. 排序条件带上 2.分页语句下面连着查询语句 PageHelper.startPage(1, 2, "RECORD_DATE desc"); 实现分页,包已经导入了
# Spring Boot 集成 MyBatis, 分页插件 PageHelper, 通用 Mapper ## 项目依赖 ```xml <!--mybatis--> <groupId>org.mybatis.spring.boot <artifactId>mybatis-spring-boot-starter <version>1.1.1 <!...
spring+mybatis实现了物理分页的
Spring boot,Mybatis的整合总是很麻烦,在此提供一个已经整合好三大框架的包,可以直接下载导入Myeclipse使用,项目基于Maven做依赖管理。项目基于Mysql自带的Sakila数据库实现了MIS系统中常用的多个功能,运行前请...
Spring boot +mybatis + layui简单demo,实现数据增删改查,附带sql文件,实现分页、模糊查询等
主要为大家详细介绍了spring boot和mybatis集成分页插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Spring Boot 集成 MyBatis, 分页插件 PageHelper, 通用 Mapper Spring Boot 1.5.1.RELEASE MyBatis的弹簧引导起动 映射器弹簧引导起动 pagehelper弹簧引导起动
写了个spring-boot框架搭建的demo,spring-boot中集成MyBatis与分页插件,代码都封装好了
JAVA Maven3.5.2 Spring Boot1.3.0 Mybatis3.2.8 bootstrap3.3.7 Mysql5.1.4 pageHelp4.1.6增删改查分页实战
MyBatis基于Spring-boot集成通用Mapper以及pagehelper分页插件,含单元测试、SQL脚本;减少Mybatis SQL的编写
SpringBoot中mybatis分页插件的使用--【pagehelper组件】 本系列校训 用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干! 只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知! 详情看同名博客
主要介绍了Spring Mybatis分页插件使用教程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
spring boot+mybatis+layui实现的项目基本框架,里面包含用户管理,商品管理,登录,可用作项目的基本搭建,直接在 次基础上开发,里面包含数据库文件
基于Spring Boot和Mybatis,添加分页相关功能,免配置即可用 依赖 spring boot:1.5.6 mybatis-spring-boot-starter:1.3.1 cluster-common:1.2.2-RC 快速开始 添加依赖 <groupId>com.zerostech</groupId> ...
Spring Boot Mybatis 多数据源配置、Mybatis通用插件、MyBatis分页插件配置。
使用maven和jdk1.8 项目导入直接更改数据库连接即可使用
前端html分页逻辑是手写的,用的是Thymeleaf模板引擎,后端用的是mybatis plus的内置分页功能
1、项目实现Spring boot+Mybatis的整合 2、项目基于Maven做依赖管理 3、后台的分页使用Mybatis的插件pagehelper实现 5.添加定时任务:不再使用作业自动调度框架Quartz实现作业调度,使用spring框架自带的调度器进行...
Java Spring boot框架下mybatis +分页的简单接口demo 数据库为mysql 数据库 表 user 字段userId userName password phone