Mybatis分页插件PageHelper简单使⽤
1. 引⼊分页插件
引⼊分页插件有下⾯2种⽅式,推荐使⽤ Maven ⽅式。
1). 引⼊ Jar 包
你可以从下⾯的地址中下载最新版本的 jar 包
由于使⽤了sql 解析⼯具,你还需要下载 jsqlparr.jar:
2). 使⽤ Maven
在 l 中添加如下依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本</version>
</dependency>
最新版本号可以从⾸页查看。
2. 配置拦截器插件
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor。 com.github.pagehelper.PageHelper 现在是⼀个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的⽤法。
<!--
plugins在配置⽂件中的位置必须符合要求,否则会报错,顺序如下:
properties?, ttings?,
typeAlias?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使⽤下⾯的⽅式配置参数,后⾯会有所有的参数介绍 -->
<property name="param1" value="value1"/>
</plugin>
</plugins>
2. 在 Spring 配置⽂件中配置拦截器插件
使⽤ spring 的属性配置⽅式,可以使⽤ plugins 属性像下⾯这样配置:
<bean id="sqlSessionFactory" class="batis.spring.SqlSessionFactoryBean">
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使⽤下⾯的⽅式配置参数,⼀⾏配置⼀个 -->
<value>
params=value1
</value>
</property>
</bean>
</array>
</property>
</bean>
3. 分页插件参数介绍
分页插件提供了多个可选参数,这些参数使⽤时,按照上⾯两种配置⽅式中的⽰例配置即可。
分页插件可选参数如下:
dialect:默认情况下会使⽤ PageHelper ⽅式进⾏分页,如果想要实现⾃⼰的分页逻辑,可以实现 Dialect(com.github.pagehelper.Dialect) 接⼝,然后配置该属性为实现类的全限定名称。
下⾯⼏个参数都是针对默认 dialect 情况下的参数。使⽤⾃定义 dialect 实现时,下⾯的参数没有任何作⽤。
1. helperDialect:分页插件会⾃动检测当前的数据库链接,⾃动选择合适的分页⽅式。你可以配置helperDialect属性来指定分页插件使⽤哪种⽅⾔。配置时,可以
使⽤下⾯的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlrver,informix,h2,sqlrver2012,derby
特别注意:使⽤ SqlServer2012 数据库时,需要⼿动指定为 sqlrver2012,否则会使⽤ SqlServer2005 的⽅式进⾏分页。
你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使⽤⾃定义的实现⽅法。
2. offtAsPageNum:默认值为 fal,该参数对使⽤ RowBounds 作为分页参数时有效。当该参数设置为 true 时,会将 RowBounds 中的 offt 参数当
成 pageNum 使⽤,可以⽤页码和页⾯⼤⼩两个参数进⾏分页。
3. rowBoundsWithCount:默认值为fal,该参数对使⽤ RowBounds 作为分页参数时有效。当该参数设置为true时,使⽤ RowBounds 分页会进⾏ count 查询。
4. pageSizeZero:默认值为 fal,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执⾏分页查询,但是
返回结果仍然是 Page 类型)。
5. reasonable:分页合理化参数,默认值为fal。当该参数设置为 true 时,pageNum<=0 时会查询第⼀页, pageNum>pages(超过总数时),会查询最后⼀页。
默认fal 时,直接根据参数进⾏查询。
6. params:为了⽀持startPage(Object params)⽅法,增加了该参数来配置参数映射,⽤于从对象中根据属性名取值,可以配
置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的⽤默认值,默认值
为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
7. supportMethodsArguments:⽀持通过 Mapper 接⼝参数来传递分页参数,默认值fal,分页插件会从查询⽅法的参数值中,⾃动根据上⾯ params 配置的字段
中取值,查找到合适的值时就会⾃动分页。使⽤⽅法可以参考测试代码中的 com.st.basic 包下
的 ArgumentsMapTest 和 ArgumentsObjTest。
8. autoRuntimeDialect:默认值为 fal。设置为 true 时,允许在运⾏时根据多数据源⾃动识别对应⽅⾔的分页(不⽀持⾃动选择sqlrver2012,只能使
⽤sqlrver),⽤法和注意事项参考下⾯的场景五。
9. cloConn:默认值为 true。当使⽤运⾏时动态数据源或没有设置 helperDialect 属性⾃动获取数据库类型时,会⾃动获取⼀个数据库连接,通过该属性来设置是
否关闭获取的这个连接,默认true关闭,设置为 fal 后,不会关闭获取的连接,这个参数的设置要根据⾃⼰选择的数据源来决定。
重要提⽰:
当 offtAsPageNum=fal 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 fal。使⽤ PageHelper.startPage ⽅法不受影响。
---------------------Maven项⽬mysql数据库没有集成Spring的测试---------------
0.⽬录结构:
1.Exam在mysql表结构
2.Exam.java与ExamExample.java是mybatis逆向⼯程导出来的:
3.ExamMapper.java是在导出来的基础上加了⼀个⾃⼰写的⽅法,对应mapper的xml也加了⼀个⾃⼰的实现:
ExamMapper.java⾃⼰⼿动加的⼀个⽅法:
/**
* ⾃⼰⼿写的⼀个根据名字模糊查询考试
* @param name
* @return
*/
List<Exam> lectAllExamsByName(@Param("name")String name);
<!-- ⾃⼰⼿写的⼀个根据名字模糊查询考试 exam是扫描出来的别名 -->
<lect id="lectAllExamsByName" parameterType="string" resultType="exam">
lect * from exam where examName like '%${name}%'
</lect>
l配置:(注意plugins的配置)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-////DTD Config 3.0//EN"
"/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载属性⽂件 -->
<properties resource="db.properties">
<!--properties中还可以配置⼀些属性名和属性值 -->
<!-- <property name="jdbc.driver" value=""/> -->
</properties>
<!-- 全局配置参数,需要时再设置 -->
<!-- <ttings> </ttings> -->
<!-- 别名定义 -->
<typeAlias>
<!-- 针对单个别名定义 type:类型的路径 alias:别名 -->
<!-- <typeAlias type="batis.po.Ur" alias="ur"/> -->
<!-- 批量别名定义指定包名,mybatis⾃动扫描包中的po类,⾃动定义别名,别名就是类名(⾸字母⼤写或⼩写都可以) -->
<package name="am"/>
</typeAlias>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使⽤下⾯的⽅式配置参数,后⾯会有所有的参数介绍 -->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使⽤jdbc事务管理,事务控制由mybatis -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池,由mybatis管理 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="urname" value="${jdbc.urname}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射⽂件 -->
<mappers>
<!-- 批量加载mapper 指定mapper接⼝的包名,mybatis⾃动扫描包下边所有mapper接⼝进⾏加载遵
循⼀些规范:需要将mapper接⼝类名和l映射⽂件名称保持⼀致,且在⼀个中上边规范的前提是:使⽤的是mapper代理⽅法 -->
<package name="am.mapper"/>
</mappers>
</configuration>
l配置以及项⽬中的jar包:
<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.qlq</groupId>
<artifactId>MybatisPagerHelper</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<!-- 配置了很多插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.rvlet</groupId>
<artifactId>rvlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.rvlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- pageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.0</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId&batis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>
<!-- mysql连接驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
</dependencies>
</project>
最终的jar包:
6.测试代码:
am.daoTest;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.print.Doc;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.ssion.SqlSession;
import org.apache.ibatis.ssion.SqlSessionFactory;
import org.apache.ibatis.ssion.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
am.Exam;
am.ExamExample;
am.ExamMapper;
public class PageHelperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void tUp() throws IOException {
String resource = "l";
InputStream inputStream = ResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }
@Test
public void test1() {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建ExamMapper对象
ExamMapper examMapper = Mapper(ExamMapper.class);
ExamExample examExample = new ExamExample();
ExamExample.Criteria criteria = ateCriteria();
//只对紧邻的下⼀条lect语句进⾏分页查询,对之后的lect不起作⽤
PageHelper.startPage(1,8);
//上⾯pagehelper的设置对此查询有效,查到数据总共8条
List<Exam> exams = examMapper.lectByExample(examExample);
PageInfo<Exam> pageInfo = new PageInfo<>(exams);
System.out.println("第⼀次查询的exams的⼤⼩:"+exams.size());
for(Exam List()){
System.out.println(e);
}
System.out.println("分页⼯具类中数据量"+List().size());
System.out.println();
System.out.println("---------------华丽的分割线------------");
System.out.println();
//第⼆次进⾏查询:上⾯pagehelper的设置对此查询⽆效(查询所有的数据86条)
List<Exam> exams2 = examMapper.lectByExample(examExample);
//总共86条
System.out.println("第⼆次查询的exams2的⼤⼩"+exams2.size());
}
/
**
* 测试⾃⼰写的根据名称模糊查询考试
*/
@Test
public void test2() {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建examMapper对象
ExamMapper examMapper = Mapper(ExamMapper.class);
//只对紧邻的下⼀条lect语句进⾏分页查询,对之后的lect不起作⽤
PageHelper.startPage(1,6);
//上⾯pagehelper的设置对此查询有效,查到数据,总共6条
List<Exam> exams = examMapper.lectAllExamsByName("⼚级");
PageInfo<Exam> pageInfo = new PageInfo<>(exams);
System.out.println("第⼀次查询的exams的⼤⼩(受pageHelper影响):"+exams.size());
for(Exam List()){
System.out.println(e);
}
System.out.println("分页⼯具类中数据量"+List().size());
System.out.println();
System.out.println("---------------华丽的分割线------------");
System.out.println();
//第⼆次进⾏查询:上⾯pagehelper的设置对此查询⽆效(查询所有的数据34条)
List<Exam> exams2 = examMapper.lectAllExamsByName("⼚级");
System.out.println("第⼆次查询的exams2的⼤⼩(不受pageHelper影响)"+exams2.size()); }
}
运⾏结果:
test1:
test2: