实现分页查询
目录
一、分页查询
二、PageHelper分页查询
三、条件分页查询
一、分页查询
前端传递page(页数),pageSize(每页大小),后端接收后查询返回结果。
实体类:
total是总数
List<T> rows是查询到的数据,数据肯定不止一条,用List接收
@Data @AllArgsConstructor @NoArgsConstructor public class PageResult<T> { private Long total; private List<T> rows; }controller层:
接收page和pageSize,设置默认值
@GetMapping public Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize) { log.info("分页查询, 参数: {}, {}", page, pageSize); PageResult<Emp> pageResult = empService.page(page, pageSize); return Result.success(pageResult); }service层:
@Override public PageResult<Emp> page(Integer page, Integer pageSize) { Long total = empMapper.count(); Integer start = (page - 1) * pageSize; List<Emp> rows = empMapper.list(start, pageSize); return new PageResult<Emp>(total, rows); }mapper层:
/** * 查询总记录数 * @return */ @Select("select count(*) from emp e left join dept d on e.dept_id = d.id") public Long count(); /** * 分页查询 * @return */ @Select("select e.*, d.name deptName from emp e left join dept d on e.dept_id = d.id" + " order by e.update_time desc limit #{start}, #{pageSize}") public List<Emp> list(Integer start, Integer pageSize);二、PageHelper分页查询
使用mybatis插件来实现分页查询。
添加依赖:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.7</version> </dependency>实体类和controller层与上面一致。
service层:
需要注意:
- 定义的SQL语句结尾不能加";",因为PageHelper在运行分页查询的时候,会在我们写的SQL语句后面直接添加limit,加";"会报错
- PageHelper只会对后面的第一个查询语句进行分页处理
@Override public PageResult<Emp> page(Integer page, Integer pageSize) { PageHelper.startPage(page, pageSize); List<Emp> empList = empMapper.list(); Page<Emp> pageInfo = (Page<Emp>) empList; return new PageResult<>(pageInfo.getTotal(), pageInfo.getResult()); }mapper层:
@Select("select e.*, d.name deptName from emp e left join dept d on e.dept_id = d.id order by e.update_time desc") public List<Emp> list();三、条件分页查询
在原本的程序基础上接收条件并使用查询。
实体类:
为了方便传参,写一个实体类
@Data @AllArgsConstructor @NoArgsConstructor public class EmpQueryParam { private Integer page = 1; private Integer pageSize = 10; private String name; private Integer gender; @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate begin; @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate end; }controller层:
@GetMapping public Result page(EmpQueryParam empQueryParam) { log.info("分页查询, 参数: {}", empQueryParam); PageResult<Emp> pageResult = empService.page(empQueryParam); return Result.success(pageResult); }service层:
@Override public PageResult<Emp> page(EmpQueryParam empQueryParam) { PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize()); List<Emp> empList = empMapper.list(empQueryParam); Page<Emp> pageInfo = (Page<Emp>) empList; return new PageResult<>(pageInfo.getTotal(), pageInfo.getResult()); }mapper层:
语法比较复杂,所以在xml文件中写更加方便
public List<Emp> list(EmpQueryParam empQueryParam);<select id="list" resultType="yixiao.tlias.pojo.Emp"> select e.*, d.name deptName from emp e left join dept d on e.dept_id = d.id <where> <if test="name != null and name != ''"> e.name like concat('%', #{name}, '%') </if> <if test="gender != null"> and e.gender = #{gender} </if> <if test="begin != null and end != null"> and e.entry_date between #{begin} and #{end} </if> </where> order by e.update_time desc </select>