在使用pagehelper插件,核心就是利用sql语句中的limit对数据进行范围的查找显示,下面我们来看如何实现插件,我们通过一个小demo来看一下原理
应用的场景:
查询一个部门下员工的所有信息,利用分页显示,一页4条记录,并且显示当前页的记录时,要显示总记录数,总页数,当前页。
1.导入项目依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
如果不是maven项目,则导入这两个jar包,下载的地址为:https://mvnrepository.com/
jsqlparser-3.1.jar
pagehelper-5.1.10.jar
2.配置拦截器,注意plugins在typeAliases的后面,源码中说的很清楚了
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--<!– config params as the following –>-->
<!--<property name="dialect" value="mysql"/>-->
<property name="reasonable" value="true"/>
<!--<property name="dialect" value="mysql"/>-->
</plugin>
</plugins>
如果有对源码不太清楚的小伙伴可以看一下:
Mybatis的源码解析(一):SqlSessionFactory
Mybatis的源码解析(二):SqlSession
Mybatis的源码解析(三):获得xxxMapper对象并执行
3.数据库的表及javaBean
- EmpInfo
package com.itt.entity;
import java.util.List;
public class EmpInfo extends Department{
private String id;
private String name;
private String age;
private String job;
private String phone;
private String did;
List<EmpInfo> empInfos;
public List<EmpInfo> getEmpInfos() {
return empInfos;
}
public void setEmpInfos(List<EmpInfo> empInfos) {
this.empInfos = empInfos;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getDid() {
return did;
}
public void setDid(String did) {
this.did = did;
}
@Override
public String toString() {
return "id:"+this.id+","+"name:"+this.name+","+"age:"+this.age+","+
"job:"+this.job+","+"phone:"+this.phone+","+"did:"+this.did;
}
public EmpInfo(String id, String name, String age, String job, String phone) {
this.id = id;
this.name = name;
this.age = age;
this.job = job;
this.phone = phone;
}
public EmpInfo(String id, String name, String phone) {
this.id = id;
this.name = name;
this.phone = phone;
}
public EmpInfo() {
}
}
- Department
package com.itt.entity;
public class Department{
private String did;
private String dname;
public Department() {
}
public Department(String did, String dname) {
this.did = did;
this.dname = dname;
}
public String getDid() {
return did;
}
public void setDid(String did) {
this.did = did;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
@Override
public String toString() {
return "Department{" +
"did='" + did + '\'' +
", dname='" + dname + '\'' +
'}';
}
}
4.主配置文件conf.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>
<properties resource="db.properties"/>
<!--全局参数-->
<settings>
<!--开启日志-->
<setting name="logImpl" value="LOG4J"/>
<setting name="cacheEnabled" value="false"/>
<!--<setting name="jdbcTypeForNull" value="NUll"/>-->
</settings>
<!--设置单个/多个别名-->
<typeAliases>
<!--单个别名(别名 忽略大小写)-->
<!--<typeAlias type="com.itt.entity.EmpInfo" alias="student"/>-->
<!--批量定义别名,以下会自动将该包中的所有类 批量定义别名:别名就是类名(不带包名的类名)-->
<package name="com.itt.entity"/>
</typeAliases>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--<!– config params as the following –>-->
<!--<property name="dialect" value="mysql"/>-->
<property name="reasonable" value="true"/>
<!--<property name="dialect" value="mysql"/>-->
</plugin>
</plugins>
<!--<typeHandlers>-->
<!--<typeHandler handler="com.itt.converter.BooleanAndIntConverter"-->
<!--javaType="boolean" jdbcType="INTEGER"/>-->
<!--</typeHandlers>-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--配置数据库的支持类-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
<mappers>
<package name="com.itt.mapper"/>
</mappers>
</configuration>
5.接口
String queryBy(String dname);
List<EmpInfo> queryBydname(String did);
6.EmpInfoMapper.xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itt.mapper.EmpInfoMapper">
<select id="queryBydname" parameterType="String" resultMap="ByDid">
SELECT e.* FROM empinfo e INNER JOIN department d
ON d.did = e.did WHERE d.did = #{did} order by id desc
</select>
<resultMap id="ByDid" type="EmpInfo">
<id property="id" column="id" />
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="job" column="job"/>
<result property="phone" column="phone"/>
<result property="did" column="did"/>
</resultMap>
</mapper>
7.测试
@Test
public void queryBydname() throws Exception{
//Connection - SqlSession操作myBatis
//config.xml -> reader
Reader reader = Resources.getResourceAsReader("conf.xml");
//reader ->SqlSession
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
EmpInfoMapper mapper = session.getMapper(EmpInfoMapper.class);
String query = mapper.queryBy("技术部");
//显示第一页,并且一页显示4条数据
Page<Object> page = PageHelper.startPage(1, 4);
List<EmpInfo> list = mapper.queryBydname(query);
for (EmpInfo empInfo : list) {
System.out.println(empInfo);
}
//打印分页信息
System.out.println("当前页:" + page.getPageNum());
System.out.println("总数据:" + page.getTotal());
System.out.println("总页数:" + page.getPages());
session.close();
}
- 原先表中的数据
运行之后的结果: