对于想了解如何使用mybatis分页插件PageHelper的读者,本文将是一篇不可错过的文章,我们将详细介绍mybatis分页插件-pagehelper,并且为您提供关于MyBaties分页插件Pa
对于想了解如何使用mybatis分页插件PageHelper的读者,本文将是一篇不可错过的文章,我们将详细介绍mybatis分页插件-pagehelper,并且为您提供关于MyBaties分页插件PageHelper的简单使用、mybatis pagehelper分页插件使用、MyBatis 分页插件 PageHelper、Mybatis 分页插件 PageHelper 使用的有价值信息。
本文目录一览:- 如何使用mybatis分页插件PageHelper(mybatis分页插件-pagehelper)
- MyBaties分页插件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的简单使用
抛出问题:
如果想要将现有的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的人都知道,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
插件官网
简介:
支持常见的 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 中我们需要实现分页功能,如果我们连接的是 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分页插件PageHelper和mybatis分页插件-pagehelper的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于MyBaties分页插件PageHelper的简单使用、mybatis pagehelper分页插件使用、MyBatis 分页插件 PageHelper、Mybatis 分页插件 PageHelper 使用等相关知识的信息别忘了在本站进行查找喔。
本文标签: