1、不使用PageHelper分页插件
模块名:mybatis-012-page
java
CarMapper接口
package org.example.mapper;
import org.apache.ibatis.annotations.Param;
import org.example.pojo.Car;
import java.util.List;
public interface CarMapper {
/**
* 分页查询
* @param startIndex 起始下标
* @param pageSize 每页显示的记录条数
* @return
*/
List<Car> selectByPage(@Param("startIndex") int startIndex,@Param("pageSize") int pageSize);
}
XML
CarMapper.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">
<!--要想使用接口代理机制:sql映射文件中mapper标签的namespace必须是Mapper接口的全限定名,sql语句的id值也必须是dao接口的方法名-->
<mapper namespace="org.example.mapper.CarMapper">
<select id="selectByPage" resultType="Car">
select * from t_car limit #{startIndex},#{pageSize}
</select>
</mapper>
java
PageTest.java
import org.apache.ibatis.session.SqlSession;
import org.example.mapper.CarMapper;
import org.example.pojo.Car;
import org.example.utils.SqlSessionUtil;
import org.junit.Test;
import java.util.List;
public class TestCarMapper {
@Test
public void testSelectByPage(){
//获取每页显示的记录条数
int pageSize = 3;
//显示第几页
int pageNum = 2;
//计算开始下标
int startIndex = (pageNum - 1) * pageSize;
SqlSession sqlSession = SqlSessionUtil.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
List<Car> cars = mapper.selectByPage(startIndex,pageSize);
cars.forEach(car -> System.out.println(car));
sqlSession.close();
}
}
2、使用Mybatis的PageHelper分页插件
-
使用PageHelper插件进行分页,更加的便捷。
-
使用了pageHelper插件后select语句中的limit子句就不用写了
2.1 导入分页插件jar包
方式一:导入jar包
方式二:引入maven依赖
XML
<!-- PageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
2.2 在核心配置文件中配置分页插件
2.2.1 在MyBatis全局配置文件中配置分页拦截器插件
在typeAliases标签下面同级进行配置:
XML
<!-- 分页插件 -->
<plugins>
<!--
interceptor属性:配置PageHelper插件中的核心拦截器类。
PageInterceptor分页拦截器类(类似于JavaWeb阶段的过滤器):该拦截器的作用是在 执行查询SQL语句 之前,将编写的SQL语句加上分页查询语句。
-->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="reasonable" value="true"/>
</plugin>
</plugins>
2.2.2 配置插件属性
XML
<!-- 分页插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 开启合理化分页-->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
2.3 在程序中的使用
2.3.1 实体类
java
package org.example.utils;
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Double sal;
private Double comm;
private Integer deptno;
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Integer getMgr() {
return mgr;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
public Double getComm() {
return comm;
}
public void setComm(Double comm) {
this.comm = comm;
}
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
@Override
public String toString() {
return "Emp{" + "empno=" + empno +
", ename='" + ename + '\'' +
", job='" + job + '\'' +
", mgr=" + mgr +
", hiredate=" + hiredate +
", sal=" + sal +
", comm=" + comm +
", deptno=" + deptno +
'}';
}
}
2.3.2 mapper接口
java
/*
Mapper层:分页查询的方法,不需要定义分页查询的参数和sql,
因为分页插件会自动添加分页sql和参数
*/
public interface EmpMapper {
List<Emp> selectByPage();
}
2.3.3 mapper文件
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.gs.mapper.EmpMapper">
<!-- 使用PageHelper插件实现分页,SQL语句无需编写任何和分页相关的内容 -->
<select id="selectByPage" resultType="com.gs.entity.Emp">
select empno,
ename,
job,
mgr,
hiredate,
sal,
comm,
deptno
from emp
order by empno
</select>
</mapper>
2.2.4 测试
关键点:
-
在DQL查询语句之前开启分页功能,并设置分页的基本属性。
-
在查询语句之后创建分页信息对象PageInfo,pageInfo对象是PageHelper插件提供的,用来封装 分页查询到的数据,在这个对象中封装了分页相关的信息。(PageInfo对象将来会存储到request域当中。在页面上展示。
java
public class PageHelperTest {
@Test
public void testPageHelper() {
SqlSession sqlSession = MybatisUtil.getSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
//在执行DQL语句之前开启分页功能:
//PageHelper.startPage(pageNum,pageSize);传入页码和每页的记录条数进行分页
PageHelper.startPage(1, 5);
List<Emp> empList = empMapper.selectByPage();
for (Emp emp : empList) {
System.out.println(emp);
}
//创建分页信息对象
PageInfo<Emp> pageInfo = new PageInfo<>(empList);
System.out.println("当前页数:" + pageInfo.getPageNum());
System.out.println("每页条数:" + pageInfo.getPageSize());
System.out.println("总记录数:" + pageInfo.getTotal());
System.out.println("总页数:" + pageInfo.getPages());
System.out.println("上一页:" + pageInfo.getPrePage());
System.out.println("下一页:" + pageInfo.getNextPage());
System.out.println("是否有上一页:" + pageInfo.isHasPreviousPage());
System.out.println("是否有下一页:" + pageInfo.isHasNextPage());
System.out.println("是否为首页:" + pageInfo.isIsFirstPage());
System.out.println("是否为末页:" + pageInfo.isIsLastPage());
System.out.println("存放页码的数据:" +
Arrays.toString(pageInfo.getNavigatepageNums()));
System.out.println("获取当前页数据:" + pageInfo.getList());
sqlSession.close();
}
}