ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

实现分页查询

实现分页查询

目录

一、分页查询

二、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层:

需要注意:

  1. 定义的SQL语句结尾不能加";",因为PageHelper在运行分页查询的时候,会在我们写的SQL语句后面直接添加limit,加";"会报错
  2. 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>
返回列表