完了分页查询后,下面我们需要在分页查询的基础上,添加条件。
通过员工管理的页面原型我们可以看到,员工列表页面的查询,不仅仅需要考虑分页,还需要考虑查询条件。 分页查询我们已经实现了,接下来,我们需要考虑在分页查询的基础上,再加上查询条件。
我们看到页面原型及需求中描述,搜索栏的搜索条件有三个,分别是:
姓名:模糊匹配
性别:精确匹配
入职日期:范围匹配
select *
from emp
where
name like concat('%','张','%') ? -- 条件1:根据姓名模糊匹配
?and gender = 1 ? ? ? ? ? ? ? ? ? -- 条件2:根据性别精确匹配
?and entrydate = between '2000-01-01' and '2010-01-01' ?-- 条件3:根据入职日期范围匹配
order by update_time desc;
而且上述的三个条件,都是可以传递,也可以不传递的,也就是动态的。 我们需要使用前面学习的Mybatis中的动态SQL 。
通过查看接口文档:员工列表查询
请求路径:/emps
请求方式:GET
请求参数:
参数名称 是否必须 示例 备注 name 否 张 姓名 gender 否 1 性别 , 1 男 , 2 女 begin 否 2010-01-01 范围匹配的开始时间(入职日期) end 否 2020-01-01 范围匹配的结束时间(入职日期) page 是 1 分页查询的页码,如果未指定,默认为1 pageSize 是 10 分页查询的每页记录数,如果未指定,默认为10
在原有分页查询的代码基础上进行改造:
EmpController
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
?
? ?@Autowired
? ?private EmpService empService;
?
? ?//条件分页查询
? ?@GetMapping
? ?public Result page(@RequestParam(defaultValue = "1") Integer page,
? ? ? ? ? ? ? ? ? ? ? @RequestParam(defaultValue = "10") Integer pageSize,
? ? ? ? ? ? ? ? ? ? ? String name, Short gender,
? ? ? ? ? ? ? ? ? ? ? @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
? ? ? ? ? ? ? ? ? ? ? @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
? ? ? ?//记录日志
? ? ? ?log.info("分页查询,参数:{},{},{},{},{},{}", page, pageSize,name, gender, begin, end);
? ? ? ?//调用业务层分页查询功能
? ? ? ?PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);
? ? ? ?//响应
? ? ? ?return Result.success(pageBean);
? }
}
EmpService
public interface EmpService {
? ?/**
? ? * 条件分页查询
? ? * @param page ? ? 页码
? ? * @param pageSize 每页展示记录数
? ? * @param name ? ? 姓名
? ? * @param gender ? 性别
? ? * @param begin ? 开始时间
? ? * @param end ? ? 结束时间
? ? * @return
? ? */
? ?PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end);
}
EmpServiceImpl
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
? ?@Autowired
? ?private EmpMapper empMapper;
?
? ?@Override
? ?public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {
? ? ? ?//设置分页参数
? ? ? ?PageHelper.startPage(page, pageSize);
? ? ? ?//执行条件分页查询
? ? ? ?List<Emp> empList = empMapper.list(name, gender, begin, end);
? ? ? ?//获取查询结果
? ? ? ?Page<Emp> p = (Page<Emp>) empList;
? ? ? ?//封装PageBean
? ? ? ?PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
? ? ? ?return pageBean;
? }
}
EmpMapper
@Mapper
public interface EmpMapper {
? ?//获取当前页的结果列表
? ?public List<Emp> list(String name, Short gender, LocalDate begin, 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="com.itheima.mapper.EmpMapper">
?
? ?<!-- 条件分页查询 -->
? ?<select id="list" resultType="com.itheima.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>
功能开发完成后,重启项目工程,打开postman,发起GET请求:
控制台SQL语句:
打开浏览器,测试后端功能接口: