引言:
我们在进行分页查询的时候,需要在mapper层写两个方法,一个用来分页查询数据,另一个用来查询总数。而这两个方法中,查询条件和sql又是高度重复的。
pageHelper就是帮我们解决这个问题的,他能够实现通过一条sql查询出分页数据和总数等分页需要的信息。
使用说明
- 引入依赖
- dao层分页查询的返回值,应该设置为Page类
- 在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>
Comments NOTHING