本文是JavaWeb学习笔记,基于黑马程序员的教程,主要讲解分页查询和条件分页查询的实现。文章首先介绍SQL分页语法和参数计算方法,然后详细说明后端开发流程:通过PageBean封装分页数据,使用MyBatis注解编写Mapper层查询,在Service层实现分页逻辑,并在Controller接收参数。特别介绍了分页插件PageHelper的简化用法,最后扩展实现带条件的动态分页查询,包括时间参数处理等注意事项。所有代码示例均配有详细注释,并展示了Postman测试和前后端联调过程。
本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)》,章节分布参考视频教程,为同样学习JavaWeb系列课程的同学们提供参考。
01 引子
- 分页查询
- 条件分页查询
- 删除员工
02 分页查询
① 需求

分页查询语法
参数1:起始索引 = (页码 - 1)* 每页展示记录数
参数2:查询返回记录数 = 每页展示记录数
select * from emp limit 0, 5; #第一页
select * from emp limit 5, 5; #第二页
select * from emp limit 10, 5; #第三页
② 分析

③ 思路

PageBean.java:分页查询结果的封装类,声明两个属性,分别为总记录数和数据列表,和接口文档中响应数据的格式严格一致。
@Data:提供get、set方法
@NoArgsConstructor:提供无参构造
@AllArgsConstructor:提供全参构造
/**
* 分页查询结果封装类
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
private Long total;//总记录数
private List rows;//数据列表
}
④ 开发
EmpMapper.java接口
/**
* 员工管理
*/
@Mapper
public interface EmpMapper {
/**
* 查询总记录数
* @return
*/
@Select("select count(*) from emp")
public Long count(); //返回总记录数(long类型)
/**
* 分页查询,获取列表数据
* @param start
* @param pageSize
* @return
*/
@Select("select * from emp limit #{start}, #{pageSize}")
public List<Emp> page(Integer start, Integer pageSize);
//返回数据列表(List集合类型)
//泛型为封装的Emp类型
//参数列表为动态的当前页码和每页展示记录数
}
EmpController.java
@RestController
public class EmpController {
//注入Service对象
@Autowired
private EmpService empService;
//@RequestParam传递默认值
@GetMapping("/emps")
public Result page(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer pageSize) {
//输出日志log
log.info("分页查询,参数:{},{}", page, pageSize);
//调用Service分页查询
PageBean pageBean = empService.page(page, pageSize);
return Result.success(pageBean); //封装、返回
}
}
EmpService.java接口
/**
* 分页查询
* @param page
* @param pageSize
* @return
*/
PageBean page(Integer page, Integer pageSize);
EmpServiceImpl.java实现类
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean page(Integer page, Integer pageSize) {
//1. 获取总记录数
Long count = empMapper.count();
//2. 获取分页查询结果列表
Integer start = (page - 1) * pageSize;
List<Emp> empList = empMapper.page(start, pageSize);
//3. 封装PageBean对象
PageBean pageBean = new PageBean(count, empList);
return pageBean;
}
}
⑤ Postman测试

⑥ 前后端联调测试

注:在进行分页查询时,注意请求参数和响应结果,前者包括页码和每页展示记录数,后者包括总记录数和结果列表,其中,注解@RequestParam(defaultValue="1")作用为设置请求参数默认值。
03 分页插件 PageHelper


@Override
public PageBean page(Integer page, Integer pageSize,String name, Short gender,LocalDate begin,LocalDate end) {
//1. 设置分页参数
PageHelper.startPage(page,pageSize);
//2. 执行查询
List<Emp> empList = empMapper.list();
Page<Emp> p = (Page<Emp>) empList;
//3. 封装PageBean对象
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
return pageBean;
}

04 条件分页查询
① 需求

② 思路

③ 开发
EmpController.java
@RestController
public class EmpController {
@Autowired
private EmpService empService;
@GetMapping("/emps")
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") LoalDate end) {
log.info("分页查询,参数:{},{},{},{},{},{}", page, pageSize, name, gender, begin, end);
PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);
return Result.success(pageBean);
}
}
EmpService.java接口
PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LoalDate end);
EmpServiceImpl.java实现类
@Override
public PageBean page(Integer page, Integer pageSize,String name, Short gender,LocalDate begin,LocalDate end) {
//1. 设置分页参数
PageHelper.startPage(page,pageSize);
//2. 执行查询
List<Emp> empList = empMapper.list(name, gender, begin, end);
Page<Emp> p = (Page<Emp>) empList;
//3. 封装PageBean对象
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
return pageBean;
}
EmpMapper.java接口
/**
* 员工管理
*/
@Mapper
public interface EmpMapper {
@Select("select * from emp")
public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
}
④ Postman测试


⑤ 前后端联调测试


05 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>

06 删除员工
① 需求

② 思路
-- 批量删除员工
delete from emp where id in (1, 2, 3);


③ 开发
EmpController.java
@DeleteMapping("/emps/{ids}")
public Result delete(@PathVariable List<Integer> ids){
log.info("批量删除操作, ids:{}", ids);
empService.delete(ids);
return Result.success();
}
EmpService.java
void delete(List<Integer> ids);
EmpServiceImpl.java
@Override
public void delete(List<Integer> ids){
empMapper.delete(ids);
}
EmpMapper.java
void delete(List<Integer> ids);
EmpMapper.xml
<delete id="delete">
delete
from emp
where id in
<foreach collection="ids" item="id" seperator="," open="(" close=")">
#{id}
</foreach>
</delete>
④ Postman测试


⑤ 前后端联调测试

849

被折叠的 条评论
为什么被折叠?



