部门分页查询
- 简单基础分页
- 分析
- 分页查询也是数据库进行查询的,所以我们要分页对应的SQL语向应该怎么写。
- 分页查询使用 LIMIT 关键字,格式为: LIMIT 开始索引, 每页显示的条数
- 以后前端页面在发送请求携带参数时,它并不明确开始索引是什么,但是它知道查询第几页。所以开始索引需要在后端进行计算,计算的公式是 :开始索引 = (当前页码-1)每页显示条数
基于上图,我们可以看到,前端需要请求的数据为:
- 展现哪一个页面
- 每个页面展示多少数据
基于上图,我们可以看到,后端需要响应的数据为:
- 数据表里面所有数据的条数
- 展现出前端指定页面的数据信息
- 设计
Controller层:
- 我们使用Get风格的请求
- 设定前端请求的参数为 page以及pageSize这两个数据对应展现哪一个页面以及每个页面展示多少数据
- 由于后端需要处理总条数以及当前页面对应的所有数据,因此我们将这两条数据封装在pageBean类的对象里面统一传输(当然我们也可以选用其他方式进行数据传输,比如集合)
- 我们响应的话就是用统一响应结果,将pageBean返回出去。
@RestController
public class EmpController {
@Autowired
private EmpService empService;
@GetMapping("/emps")//@RequestParam(defaultValue = "1")设置一个默认的初始展现数据
public Result page(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "5") Integer pageSize) {
PageBean pagebean = empService.page(page, pageSize);
return Result.success(pagebean);
}
}
Service层:
- 看注释
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean page(Integer page, Integer pageSize) {
//获取总条数
Long count=empMapper.count();
//获取指定页面的所有员工数据
//在这里我们已经将页面展示的数据显示计算好了(page-1)*pageSize
List<Emp> empList = empMapper.page((page-1)*pageSize, pageSize);
//返回一个pageBean集合
return new PageBean(count,empList);
}
}
mapper层:
@Mapper
public interface EmpMapper {
@Select("select count(*) from emp")
public Long count();//获取数据表里面的总条数
@Select("select * from emp limit #{page} ,#{pageSize}")//数据传入进行分页展示操作
public List<Emp> page(@Param("page") int page, @Param("pageSize") Integer pageSize);
}
- 分页插件
(1)分页插件以及使用规则
PageHelper 是Mybatis的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的分页查询。
如果使用了PageHelper分页插件进行分页,那我们是无需再Mapper这层来手动分页的。 Mapper这一层,我们进行正常的列表查询即可。我们需要在Service层中,调用Mapper的方法之前设置分页参数,在调用Mapper方法执行查询之后,解析分页结果,并将结果封装到PageBean对象中,返回。
(2)设计
流程如下:
步骤:
- 引入依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
- 代码实现
Controller层:不变,该怎么写还怎么写
Service层:
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean page(Integer page, Integer pageSize) {
//1.设置分页参数,这个里面无需多想,分页插件自动计算和操作
PageHelper.startPage(page, pageSize);
//2.执行查询
List<Emp> list = empMapper.list();
Page<Emp> p = (Page<Emp>) list;//Page<Emp>是分页插件pagehelper当中提供的分页结果的封装类,也无需多想
//封装PageBean对象
return new PageBean(p.getTotal(), p.getResult());//分页总数,目标分页的总数据
}
Mapper层:
直接写一个数据库查询语句就行
@Select("select * from emp")
public List<Emp> list();
- 条件分页
- 需求
我们看到页面原型及需求中描述,搜索栏的搜索条件有三个,分别是:
姓名:模糊匹配
性别:模糊匹配
入职时间:范围匹配
- 开发
Controller层:
- 前端请求什么参数就要在controller层的方法参数中添加什么参数
- 当传入的参数为时间对象的时候,我们需要给她加一个注解为指定时间的类型
@GetMapping("/emps")
public Result pageByTj(String name, Short gender,
//切记当传入一个时间对象类型的时候,一定要指定他的编码规则
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "5") Integer pageSize) {
//返回一个pageBean对象的内容,由于pageBean里面的emp数据为list所以可以使用直接塞进去
PageBean pageBean = empService.pageByTj(name,gender,begin,end,page,pageSize);
return Result.success(pageBean);
}
Service层:
- 我们使用了pageHelper分页插件,所以在mapper层方法中就不需要再传入分页的参数了,只需要将其他的参数放到方法里面进行传输
@Override
public PageBean pageByTj(String name, Short gender, LocalDate begin,
LocalDate end, Integer page, Integer pageSize) {
PageHelper.startPage(page, pageSize);
List<Emp> empList = empMapper.pageByTj(name,gender,begin,end);
Page<Emp> p = (Page<Emp>) empList;
return new PageBean(p.getTotal(), p.getResult());
}
Mapper层:
- mapper层当中我们所看到的是使用了动态sql语句的xml方法,所以只需要指定相应的参数,将所有的sql语句放到xml文件中即可
- 在参数前面加上注解,用来识别,建议后面都加上。但是如果是对象的参数就不要加否则报错
List<Emp> pageByTj(@Param("name") String name, @Param("gender")Short gender,
@Param("begin")LocalDate begin,@Param("end")LocalDate end);
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="com.example.Mapper.EmpMapper">//namespace:指定mapper层方法的全路径
<select id="pageByTj" resultType="com.example.pojo.Emp">//方法,返回值
select *from emp
<where>
<if test="name!=null and name!=''">
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>
order by update_time desc
</select>
</mapper>