PageHelper

463 阅读2分钟

1. PageHelper插件

分页功能说明

分页功能介绍

image-20240315120028810.png

分页查询功能,客户端通常需要我们提供两项数据:

  • 数据列表:用于展示给用户看的数据;用户每次点击某一页的按钮,就要去服务端加载这一页的数据列表
  • 总数量:客户端得到总数量后,可以根据每页几条计算分了多少页,从而显示页码按钮

原始分页功能的实现方式

服务端要准备以上两项数据,需要:

  • 执行SQL语句查询总数量:select count(*) from emp where gender = 1
  • 执行SQL语句查询数据列表:select * from emp where gender = 1 limit 0, 5

存在的问题:

  1. 有两条SQL语句,Mapper接口里要写两个方法;
  2. 两条SQL语句的where条件相同

PageHelper介绍

分页插件PageHelper官网:pagehelper.github.io/

PageHelper是一款开源的Mybatis插件,可以帮我们简化分页功能的实现

PageHelper的使用

  1. 添加依赖坐标
<!--PageHelper分页插件-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.2</version>
</dependency>
  1. 使用方式:在调用Mapper时,按照如下步骤
//1. 开启分页
PageHelper.startPage(页码,每页几条);
//2. 查询列表:SQL语句里不要加limit,只要查询列表就行.
//   例如 select * from emp where...    不要再加limit
List<Emp> empList = empMapper.selectList();
//3. 获取分页结果
Page<Emp> page = (Page<Emp>)empList;
long total = page.getTotal(); //获取总数量

2. 分页查询员工-带条件

需求

根据页面提交的搜索条件,分页查询员工列表

image-20230821211129944.png

分析

image-20230822100441811.png

实现

PageBean

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean<T> {
    private Integer total;
    private List<T> rows;
}

EmpController

/**
 * 员工管理Controller
 */
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
    @Autowired
    private EmpService empService;
​
    @GetMapping
    public Result queryEmpsByPage(@RequestParam(value = "page", defaultValue = "1") Integer page,
                                  @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
                                  String name, Integer gender,
                                  @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                                  @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
​
        PageBean<Emp> pageBean = empService.queryEmpsByPage(name, gender, begin, end, page, pageSize);
        return Result.success(pageBean);
    }
}

EmpService

public interface EmpService {
    PageBean<Emp> queryEmpsByPage(String name, Integer gender, LocalDate begin, LocalDate end, Integer page, Integer pageSize);
}

EmpServiceImpl

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
​
    @Override
    public PageBean<Emp> queryEmpsByPage(String name, Integer gender, LocalDate begin, LocalDate end, Integer page, Integer pageSize) {
        //开启分页
        PageHelper.startPage(page, pageSize);
​
        //查询列表
        List<Emp> empList = empMapper.selectList(name, gender, begin, end);
​
        //得到分页结果
        Page<Emp> p = (Page<Emp>) empList;
​
        //封装PageBean对象
        PageBean<Emp> pageBean = new PageBean<>();
        pageBean.setTotal((int) p.getTotal());
        pageBean.setRows(empList);
        return pageBean;
    }
}

EmpMapper(方式1)

/**
 * 员工管理
 */
@Mapper
public interface EmpMapper {
    List<Emp> selectList(String name, Integer gender, LocalDate begin, LocalDate end);
}

EmpMapper.xml(方式2)

xml映射文件:要和Mapper接口同名同包

xml内容:

  • mapper标签的namespace必须是Mapper接口的全限定类名;
  • select标签的id必须是对应的方法名
  • select标签必须有resultType,是JavaBean的全限定类名,表示要把查询结果封装成什么类型的对象
<?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.sdf.mapper.EmpMapper">
    <select id="selectList" resultType="com.itheima.pojo.Emp">
        select * from emp
        <where>
            <if test="name!=null and name.length()>0">
                and name like concat('%', #{name}, '%')
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
            <if test="begin!=null">
                and entrydate >= #{begin}
            </if>
            <if test="end!=null">
                and entrydate &lt;= #{begin}
            </if>
        </where>
    </select>
</mapper>