引言:

​ 我们在进行分页查询的时候,需要在mapper层写两个方法,一个用来分页查询数据,另一个用来查询总数。而这两个方法中,查询条件和sql又是高度重复的。

​ pageHelper就是帮我们解决这个问题的,他能够实现通过一条sql查询出分页数据和总数等分页需要的信息。

使用说明


  1. 引入依赖
  2. dao层分页查询的返回值,应该设置为Page类
  3. 在service层调用dao层的查询方法的上一行,使用PageHelper设置当前页和每页条数

导入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.6</version>
</dependency>

关于高版本springboot在集成中出现循环依赖报错

如果使用的是低于1.4.1版本的pagehelper-spring-boot-starter,则需要在配置文件中添加以下信息:

spring:
  main:
    allow-circular-references: true

这是因为低版本的 pageHelper中的PageHelperAutoConfiguration 里出现了循环依赖的问题。从springboot2.6开始,框架将默认不再自动处理循环依赖,并抛出异常。

上面的配置会允许循环依赖。不过这种方式并不推荐。所以最好还是使用1.4.1及以上的版本。

使用案例

1.controller

/**
 * 员工管理Controller
 */
@RestController
public class EmpController {

    @Autowired
    EmpService empService;

    @GetMapping("/emps")
    public Result findByPage(@RequestParam(name = "page", defaultValue = "1")Integer page,
                             @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                             @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                             @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end,
                             String name,Integer gender) {
        Page<Emp> result = empService.findByPage(name, gender, begin, end, page, pageSize);

        if (result == null) {
            return Result.error("数据错误,请联系系统管理员");
        }

        return Result.success(new PageVo(result.getResult(),(int)result.getTotal()));
    }
}

2.service

EmpServiceImpl.java

@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    EmpMapper empMapper;

    /**
     * 分页查询
     *
     * @param name     姓名
     * @param gender   性别
     * @param begin    入职开始时间
     * @param end      入职结束时间
     * @param page     当前页
     * @param pageSize 每页条数
     * @return
     */
    @Override
    public Page<Emp> findByPage(String name, Integer gender, LocalDate begin, LocalDate end,
                                Integer page, Integer pageSize) {
        // 设置当前页和每页条数
        PageHelper.startPage(page,pageSize);
        // 查询
        return empMapper.findByPage(name, gender, begin, end);
    }
}

3.Mapper

EmpMapper.java

/**
 * 员工管理
 */
@Mapper
public interface EmpMapper {
    /**
     * 分页查询
     *
     * @param name   姓名
     * @param gender 性别
     * @param begin  入职开始时间
     * @param end    入职结束时间
     * @return
     */
    Page<Emp> findByPage(@Param("name") String name, @Param("gender") Integer gender,
                         @Param("begin") LocalDate begin,
                         @Param("end") LocalDate end);
}

EmpMapper.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="link.xiaomo.tlias.mapper.EmpMapper">

    <select id="findByPage" resultType="link.xiaomo.tlias.pojo.Emp">
        select * from emp
        <where>
            <if test="name != null and name != gender">
                and `name` like concat('%',#{name},'%')
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="begin != null and end != null ">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
    </select>

</mapper>
如人饮水,冷暖自知。
最后更新于 2023-08-05