mybatis + PageHelper 实现分页

如果你也在使用Mybatis,建议尝试PageHelper插件,这个一定是最方便使用的分页插件。
该插件目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库分页。
PageHelper分页插件项目中的正式代码一共有个5个Java文件,这5个文件的说明如下:

?

1:  Page<E>[必须]:分页参数类,该类继承ArrayList,虽然分页查询返回的结果实际类型是Page<E>,但是可以完全不出现所有的代码中,可以直接当成List使用。返回值不建议使用Page,建议仍然用List。如果需要用到分页信息,使用下面的PageInfo类对List进行包装即可。

2:  PageHelper[必须]:分页插件拦截器类,对Mybatis的拦截在这个类中实现。

3:  PageInfo[可选]:Page<E>的包装类,包含了全面的分页属性信息。

4: SqlParser[可选]:提供高效的count查询sql。主要是智能替换原sql语句为count(*),去除不带参数的order by语句。需要jsqlparser-0.9.1.jar支持。

5: SqlUtil[必须]:分页插件工具类,分页插件逻辑类,分页插件的主要实现方法都在这个类中

使用maven

添加如下依赖:

<dependency>

    <groupId>com.github.pagehelper</groupId>

    <artifactId>pagehelper</artifactId>

    <version>3.4.2</version>

</dependency>

<dependency>

    <groupId>com.github.jsqlparser</groupId>

    <artifactId>jsqlparser</artifactId>

    <version>0.9.1</version>

</dependency>

在Mybatis配置xml中配置拦截器插件:

<!--

    plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:

    properties?, settings?,

    typeAliases?, typeHandlers?,

    objectFactory?,objectWrapperFactory?,

    plugins?,

    environments?, databaseIdProvider?, mappers?

-->

<plugins>

    <!-- com.github.pagehelper为PageHelper类所在包名 -->

    <plugin interceptor="com.github.pagehelper.PageHelper">

        <property name="dialect" value="mysql"/>

        <!-- 该参数默认为false -->

        <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->

        <!-- 和startPage中的pageNum效果一样-->

        <property name="offsetAsPageNum" value="true"/>

        <!-- 该参数默认为false -->

        <!-- 设置为true时,使用RowBounds分页会进行count查询 -->

        <property name="rowBoundsWithCount" value="true"/>

        <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->

        <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->

        <property name="pageSizeZero" value="true"/>

        <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->

        <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->

        <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->

        <property name="reasonable" value="true"/>

    </plugin>

</plugins>

其他五个参数说明:

    1. 增加dialect属性,使用时必须指定该属性,可选值为oracle,mysql,mariadb,sqlite,hsqldb,postgresql,没有默认值,必须指定该属性
    2. 增加offsetAsPageNum属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,使用RowBounds分页时,会将offset参数当成pageNum使用,可以用页码和页面大小两个参数进行分页。
    3. 增加rowBoundsWithCount属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,使用RowBounds分页会进行count查询。
    4. 增加pageSizeZero属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)。
    5. 增加reasonable属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。具体作用请看上面配置文件中的注释内容。

MyBatis框架

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行了封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如驱动,创建connection,创建statement,手动设置参数,结果集检索等jdbc繁杂的过程代码

Mybatis通过xml或注解的方式要执行statement配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

?

这就是mybatis执行情况,那么mybatis的插件作用在哪一环节呢?它主要作用在Executor执行器与mappedeStatement之间,也就是说mybatis可以在插件中获得要执行的sql语句,在sql语句中添加limit语句,然后再去对sql进行封装,从而可以实现分页处理。

配置插件:

现在开始在mybatis的全局配置文件SqlMapConfig.xml中配置插件

?

引用配置

?

在sql查询语句之前添加一行代码:

PageHelper.startPage(page, rows);

page为显示第几页,rows为一页显示多少条数据。

就可以查询分页信息。

举个栗子:

?

?

PageHelper.startPage(page, rows); 是一个静态的方法,在PageHelper源码:

?

欢迎关注公众号

?

原文地址:https://www.cnblogs.com/zhaixingzhu/p/12569232.html

时间: 2024-08-30 13:38:50

mybatis + PageHelper 实现分页的相关文章

Python分页转Mybatis pagehelper格式分页

最近工作里遇到一个需求要把之前用Java写的一个http接口替换成用Python写的,出参是带了mybatis pageHelper中PageInfo信息的一个JSON串,而Python这边分页不会涉及到数据库查询,属于直接对list进行分页..然后就有了下面的对开源Python分页模块的一个改写(模块地址:https://github.com/Pylons/paginate).至于改动~~emmm~具体来说,就是加了个元类,给原先的Page类动态加了个返回Java格式的JSON字符串的方法,至

SpringBoot 使用yml配置 mybatis+pagehelper+druid+freemarker实例

SpringBoot 使用yml配置 mybatis+pagehelper+druid+freemarker实例 这是一个简单的SpringBoot整合实例 这里是项目的结构目录 首先是pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="h

Spring boot入门(三):SpringBoot集成结合AdminLTE(Freemarker),利用generate自动生成代码,利用DataTable和PageHelper进行分页显示

关于SpringBoot和PageHelper,前篇博客已经介绍过Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件,前篇博客大致讲述了SpringBoot如何集成Mybatis和Pagehelper,但是没有做出实际的范例,本篇博客是连接上一篇写的.通过AdminLTE前端框架,利用DataTable和PageHelper进行分页显示,通过对用户列表的增删改查操作,演示DataTable和PageHelper的使用. (1)Admi

springboot+mybatis+pagehelper

springboot+mybatis+pagehelper整合 springboot   版本2.1.2.RELEASE mybatis  版本3.5 pagehelper 版本5.18 支持在mapper接口上直接写sql语句,支持在xml文件里写sql语句,支持分页查询,支持自定义sql语句 注意在生成mybatisGenerator文件时,可能在xml文件中生成了多个selectByExampleWithRowbounds语句,保留一个即可. 项目结构 application.proper

PageHelper实现分页

PageHelper实现分页 如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件.分页插件支持任何复杂的单表.多表分页.--PageHelper官网. 后端实现 ? 引入依赖 使用PageHelper之前,我们要先引入其依赖文件,或者jar包.这里使用maven项目演示,所以需要先引入依赖文件. <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pa

Mybatis Generator实现分页功能

Mybatis Generator实现分页功能 分类: IBATIS2013-07-17 17:03 882人阅读 评论(1) 收藏 举报 mybatisibatisgeneratorpage分页 众所周知,Mybatis本身没有提供基于数据库方言的分页功能,而是基于JDBC的游标分页,很容易出现性能问题.网上有很多分页的解决方案,不外乎是基于Mybatis本机的插件机制,通过拦截Sql做分页.但是在像Oracle这样的数据库上,拦截器生成的Sql语句没有变量绑定,而且每次语句的都要去拦截,感觉

Mybatis使用之分页

Mybatis使用之分页 一:简介 注:示例基于mysql数据库.Oracle可以自行测试.   使用Mybatis分页主要有两种方式.一种是将分页参数传递到配置文件中.在写sql的时候就做分页.另一种是使用Mybatis的拦截器拦截需要分页的sql语句.重新组装成具有分页功能的sql语句. 分页查询的关键在于查询时需要告诉数据库从第几条开始取.取多少条记录.也就是常用到Page对象(一般是方便传递参数.自己构建的实体类)的pageNumer.pageSize两个主要参数.至于Page对象的总记

Mybatis最入门---分页查询(拦截器分页原理及实现)

[一步是咫尺,一步即天涯] 前文,我们演示了物理分页的Sql实现方式,这种方式使得我们每次在编写查询服务时,不断的重复造轮子.这样的代码实现方式就显得十分的笨拙了.本文是Mybatis分页查询的最后一片内容,我们将介绍基于拦截器的,精巧的实现方式.在阅读这篇文章之前,强烈建议各位看官能够先阅读上文.这样就能对下文我们提及的各种对象及他们之间的关系有一个清晰的关系.好了,废话不多讲,开始我们的正文部分吧. 准备工作: a.操作系统 :win7 x64 b.基本软件:MySQL,Mybatis,SQ

使用PageHelper插件分页结合mybatis返回的列表个数不对问题解决

问题描述:spring mvc+mybatis项目中,当使用PageHelper插件进行分页查询时,查到的总数据量值是正确的,但是查询当前页返回的列表个数不对.比如每页查询10条,返回2条或者3条.resultMap使用了association返回复杂属性. 格式如下: <resultMap type="orgDetail" id="porgDetailMap">        <result property="" colum