GVKun编程网logo

如何使用mybatis分页插件PageHelper(mybatis分页插件-pagehelper)

12

对于想了解如何使用mybatis分页插件PageHelper的读者,本文将是一篇不可错过的文章,我们将详细介绍mybatis分页插件-pagehelper,并且为您提供关于MyBaties分页插件Pa

对于想了解如何使用mybatis分页插件PageHelper的读者,本文将是一篇不可错过的文章,我们将详细介绍mybatis分页插件-pagehelper,并且为您提供关于MyBaties分页插件PageHelper的简单使用、mybatis pagehelper分页插件使用、MyBatis 分页插件 PageHelper、Mybatis 分页插件 PageHelper 使用的有价值信息。

本文目录一览:

如何使用mybatis分页插件PageHelper(mybatis分页插件-pagehelper)

如何使用mybatis分页插件PageHelper(mybatis分页插件-pagehelper)

官方文档

PageHelper官方文档

1在pom文件中添加依赖

<dependency>
    <groupId>com.github.pageHelper</groupId>
    <artifactId>pageHelper</artifactId>
    <version>5.1.2</version>
    <!--      <version>最新版本</version>-->
</dependency>

2在mybatis的全局配置文件中配置pageHelper分页插件

   <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
<!--    分页插件的配置-->
    <plugins>
        <plugin interceptor="com.github.pageHelper.PageInterceptor"></plugin>
    </plugins>
</configuration>

3使用

 /**
     * @param pageNum   第几页
     * @param pageSize  每页多少条记录
     * @return
     */
    @RequestMapping("/pageInfo")
    @ResponseBody
    public PageInfo<ProductInfo> getPageInfo(int pageNum, int pageSize){
        //1.通过调用pageHelper的静态方法开始获取分页数据
        //指定当前是第几页, 以及每页显示的记录条数
        pageHelper.startPage(pageNum,pageSize);
        //2.获得所有的商品记录
        List<ProductInfo> list = productInfoService.getAll();
        //3.获得当前分页对象
        PageInfo<ProductInfo> pageInfo = new PageInfo<ProductInfo>(list);

        return pageInfo;
    }

说明:数据库还是查询全部,把全部数据提取出来后在有插件去处理出要显示的数据

MyBaties分页插件PageHelper的简单使用

MyBaties分页插件PageHelper的简单使用

 

抛出问题:

如果想要将现有的select语句改为支持分页功能的查询语句该怎么做呢?
最简单的一种做法就是将所有的select语句都加上limit来实现分页,这种做法有什么问题呢?

有没有一种简便方法实现呢?
Mybatis提供了plugin机制,允许我们在Mybatis的原有处理流程上加入自己逻辑,所有我们就可以使用这种逻辑加上我们的分页逻辑,也就是实现拦截器。
Mybatis支持的拦截的接口有4个,Executor、ParameterHandler、ResultSetHandler、StatementHandler。关于分页拦截器的配置和使用后期我会更新。
 

一、PageHelper的介绍和使用

Mybatis的一个插件,PageHelper,非常方便mybatis分页查询。国内牛人的一个开源项目,有兴趣的可以去看源码。在github上仓库地址为:Mybatis-PageHelper。它支持基本主流与常用的数据库,这可以在它的文档上看到。这里记录一下使用的基本方法。PageHelpe开源地址:
github项目地址:https://github.com/pagehelper/Mybatis-PageHelper
码云 项目地址:http://git.oschina.net/free/Mybatis_PageHelper

 

二、项目配置

首先引入jar包依赖
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.1.4</version>
</dependency>

 

在mybatis的全局配置文件SqlMapConfig.xml中配置该插件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置分页插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->        
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>
</configuration>

 

三、基本使用

dao层:

public List<User> queryUserListLikeName(@Param("name") String name);

mapper.xml:

<select id="queryUserListLikeName" parameterType="String" resultType="User">
    SELECT * FROM tb_user WHERE name LIKE ''%${name}%''
</select>

service.java
 

public PageInfo<User> testQueryUserListLikeName() {
    //设置分页条件,Parameters:pageNum 页码pageSize 每页显示数量count 是否进行count查询
    PageHelper.startPage(1, 3, true);
    List<User> users = this.userMapper.queryUserListLikeName(null);
    //取分页后结果
    PageInfo<User> pageInfo = new PageInfo<User>(users);
   
    //打印分页信息
    System.out.println("数据总数:" + pageInfo.getTotal());
    System.out.println("数据总页数:" + pageInfo.getPages());
    System.out.println("最后一页:" + pageInfo.getLastPage());
    
    return pageInfo;
}

pageInfo.java


public class PageInfo<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;
 
    //由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"
 
    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;
 
    //前一页
    private int prePage;
    //下一页
    private int nextPage;
 
    //是否为第一页
    private boolean isFirstPage = false;
    //是否为最后一页
    private boolean isLastPage = false;
    //是否有前一页
    private boolean hasPreviousPage = false;
    //是否有下一页
    private boolean hasNextPage = false;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;
    //导航条上的第一页
    private int navigateFirstPage;
    //导航条上的最后一页
    private int navigateLastPage;
 
    public PageInfo() {
    }
 
    /**
     * 包装Page对象
     *
     * @param list
     */
    public PageInfo(List<T> list) {
        this(list, 8);
    }
 
    /**
     * 包装Page对象
     *
     * @param list          page结果
     * @param navigatePages 页码数量
     */
    public PageInfo(List<T> list, int navigatePages) {
        if (list instanceof Page) {
            Page page = (Page) list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();
 
            this.pages = page.getPages();
            this.list = page;
            this.size = page.size();
            this.total = page.getTotal();
            //由于结果是>startRow的,所以实际的需要+1
            if (this.size == 0) {
                this.startRow = 0;
                this.endRow = 0;
            } else {
                this.startRow = page.getStartRow() + 1;
                //计算实际的endRow(最后一页的时候特殊)
                this.endRow = this.startRow - 1 + this.size;
            }
        } else if (list instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = list.size();
 
            this.pages = this.pageSize > 0 ? 1 : 0;
            this.list = list;
            this.size = list.size();
            this.total = list.size();
            this.startRow = 0;
            this.endRow = list.size() > 0 ? list.size() - 1 : 0;
        }
        if (list instanceof Collection) {
            this.navigatePages = navigatePages;
            //计算导航页
            calcNavigatepageNums();
            //计算前后页,第一页,最后一页
            calcPage();
            //判断页面边界
            judgePageBoudary();
        }
    }
 
 
.......
}

注意:

PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。如果代码在进入 Executor 前发生异常,就会导致线程不可用,这属于人为的 Bug(例如接口方法和 XML 中的不匹配,导致找不到 MappedStatement 时), 这种情况由于线程不可用,也不会导致 ThreadLocal 参数被错误的使用。
但是如果你写出下面这样的代码,就是不安全的用法:
PageHelper.startPage(1, 10);
List<Country> list;
if(param1 != null){
    list = countryMapper.selectIf(param1);
} else {
    list = new ArrayList<Country>();
}
这种情况下由于 param1 存在 null 的情况,就会导致 PageHelper 生产了一个分页参数,但是没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。上面这个代码,应该写成下面这个样子:
List<Country> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    list = countryMapper.selectIf(param1);
} else {
    list = new ArrayList<Country>();
}
这种写法就能保证安全。
如果你对此不放心,你可以手动清理 ThreadLocal 存储的分页参数,可以像下面这样使用:

List<Country> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    try{
        list = countryMapper.selectAll();
    } finally {
        PageHelper.clearPage();
    }
} else {
    list = new ArrayList<Country>();
}

以上就是PageHelper的基本使用,简单方便的分页插件。

mybatis pagehelper分页插件使用

mybatis pagehelper分页插件使用

使用过mybatis的人都知道,mybatis本身就很小且简单,sql写在xml里,统一管理和优化。缺点当然也有,比如我们使用过程中,要使用到分页,如果用最原始的方式的话,1.查询分页数据,2.获取分页长度,也就是说要使用到两个方法才能完成分页。有没有更更好的分页方式的,pagehelper分页插件因此而诞生,他的原理是利用mybatis拦截器,在查询数据库的时候,拦截下SQL,然后进行修改,从而实现分页(如果你硬是想知道原理,mybatis拦截器,学习过后你就知道什么回事了)。

这篇博客先向大家展示怎么使用,过后有时间再讲他的实现原理。

1.添加maven依赖

1 <dependency>
2   <groupId>com.github.pagehelper</groupId>
3   <artifactId>pagehelper</artifactId>
4   <version>5.0.0</version>
5 </dependency>

2.在 Spring 配置文件中配置拦截器插件,也可以在mybatis的xml里面配置,但是两种配置不能同时出现,否则容易出现com.github.pagehelper.PageInterceptor插件出现空指针问题

在spring.xml中定义:

 1 <!--配置SqlSessionFactory对象 -->
 2     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
 3         <property name="dataSource" ref="dataSource" />
 4         <property name="configLocation" value="classpath:mybatis-config.xml" />
 5         <property name="typeAliasesPackage" value="com.aoChine.model.entity" />
 6         <property name="mapperLocations" value="classpath:mapper/*.xml" />
 7 
 8         <!-- 配置mybatis分页插件PageHelper -->
 9         <property name="plugins">
10             <array>
11                 <bean class="com.github.pagehelper.PageInterceptor">
12                     <property name="properties">
13                         <!-- 什么都不配,使用默认的配置 -->
14                         <value></value>
15                     </property>
16                 </bean>
17             </array>
18         </property>
19     </bean>

在mybatis-config.xml中定义

<plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 使用MySQL方言的分页 -->
            <property name="helperDialect" value="sqlserver"/><!--如果使用mysql,这里value为mysql-->
            <property name="pageSizeZero" value="true"/>
        </plugin>
 </plugins>

3.使用

a)写正常查询语句的接口

接口:

b)在service层调用接口,实现分页。

分页插件使用这样就使用完毕了,博客只是介绍了最简单的使用方法,如果需要了解更多内容

这个是开源社区上面的插件库地址:
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md
---------------------
作者:我爱奔跑的浮云
来源:CSDN
原文:https://blog.csdn.net/qq_26790807/article/details/62429290

MyBatis 分页插件 PageHelper

MyBatis 分页插件 PageHelper

插件官网

简介:

  支持常见的 12 种数据库。Oracle,MySql,MariaDB,SQLite,DB2,PostgreSQL,SqlServer 等;

  支持常见的RowBounds(PageRowBounds),PageHelper.startPage 方法调用,Mapper 接口参数调用;

  

 

获取maven配置

示例:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

用法:

PageHelper.startPage(moiraiRole.getPage(), moiraiRole.getSize());

 

Mybatis 分页插件 PageHelper 使用

Mybatis 分页插件 PageHelper 使用

在 mybatis 中我们需要实现分页功能,如果我们连接的是 mysql 我们就要写 mysql 的分页 sql,连接 oracle 就要写 oracle 的 sql 语句,这是很不友好的,而我们针对各种不同的数据库的分页我们有一个插件 PageHelper

这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页。 支持常见的 12 种数据库。Oracle,MySql,MariaDB,SQLite,DB2, PostgreSQL,SqlServer 等

支持常见的 RowBounds (PageRowBounds), PageHelper.startPage 方法调用, Mapper 接口参数调用

更多用法参照请官方文档:https://pagehelper.github.io/docs/howtouse/

添加依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.1.6</version>
</dependency>
<!--由于使用了sql 解析工具-->
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>0.9.6</version>
</dependency>

在 mybatis-config.xml 中配置插件拦截器

<!-- 插件配置 -->
    <plugins>  
        <!-- com.github.pagehelper为PageHelper类所在包名 -->  
        <plugin interceptor="com.github.pagehelper.PageHelper">  
            <!-- 4.0.0以后版本可以不设置该参数 -->  
            <!-- <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"/>  
            <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->  
            <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->  
            <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->  
            <!-- 不理解该含义的前提下,不要随便复制该配置 -->  
            <property name="params" value="pageNum=start;pageSize=limit;"/>  
            <!-- 支持通过Mapper接口参数来传递分页参数 -->  
            <property name="supportMethodsArguments" value="true"/>  
            <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->  
            <property name="returnPageInfo" value="check"/>  
        </plugin>  
    </plugins>

使用方式非常简单,我们只需要在执行查询直接插入 PageHelper.startPage (当前页,每页多少数据) 就可以完成分页,必须在执行 mapper.findAll () 之前插入

 

public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        EmployeeMapper mapper = sqlSessionFactory.openSession().getMapper(EmployeeMapper.class);
        //设置分页参数
        PageHelper.startPage(0, 5);
        List<Employee> lists= mapper.findAll();
        //传入结果集获取分页数据
        PageInfo<Employee> info = new PageInfo<>(lists);
        System.out.println("总记录数:" + info.getTotal());
        System.out.println("当前页数:" + info.getPageNum());
        System.out.println("每页数:" + info.getPageSize());
        System.out.println("总页数:" + info.getPages());
        System.out.println("结果集:" + info.getList());
    }

 

关于如何使用mybatis分页插件PageHelpermybatis分页插件-pagehelper的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于MyBaties分页插件PageHelper的简单使用、mybatis pagehelper分页插件使用、MyBatis 分页插件 PageHelper、Mybatis 分页插件 PageHelper 使用等相关知识的信息别忘了在本站进行查找喔。

本文标签: