根据页面原型,明确需求
页面原型
需求
查看接口文档
接口文档的链接如下:
【腾讯文档】SpringBoot案例所需文档
https://docs.qq.com/doc/DUkRiTWVaUmFVck9N
思路分析
分页条件查询就时将条件查询的结果进行分页展示,由于有的条件可能设置也可能不设置,因此采用动态SQL语句进行查询,所以采取配置文件的方式进行,具体参照文章:MyBatis-XML映射文件_熵240的博客-CSDN博客
MyBatis-动态SQL-if and where_熵240的博客-CSDN博客
MyBatis-动态SQL-foreach_熵240的博客-CSDN博客
接口功能实现
控制层(Controller类)
具体关键代码如下
package com.example.tlias.controller;
import com.example.tlias.pojo.PageBean;
import com.example.tlias.pojo.Result;
import com.example.tlias.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
@Slf4j
@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,
// @RequestParam(required = false) 标表示该参数是可选的,不是必须传递的。
@RequestParam(required = false) Short gender,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat LocalDate end) {
// 设置未接受到参数值时,设置其默认值
// if (page == null) page = 1;
// if (pageSize == null) pageSize = 10;
// todo 对gender地值进行判断
log.info("分页查询,参数page:{}、pageSize:{},gender:{},name:{},begin:{},end:{}", page, pageSize, gender, name, begin, end);
// 调用Service中的方法进行分页查询
// 查询的结果封装到PageBean中
PageBean pageBean = empService.Page(page, pageSize, name, gender, begin, end);
return Result.success(pageBean);
}
}
业务层(Service类)
具体关键代码如下
业务类
package com.example.tlias.service;
import com.example.tlias.pojo.PageBean;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
public interface EmpService {
PageBean Page(Integer page, Integer pageSize,
String name, Short gender,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat LocalDate end);
}
业务实现类
@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;
}
持久层(Mapper类)
具体关键代码如下:
package com.example.tlias.mapper;
import com.example.tlias.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import java.time.LocalDate;
import java.util.List;
@Mapper
public interface EmpMapper {
/**
* 员工信息的查询
* 使用pagehepler插件
*
* @return
*/
public List<Emp> list(String name,
Short gender,
LocalDate begin,
LocalDate end);
}
Mapper.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.tlias.mapper.EmpMapper">
<select id="list" resultType="com.example.tlias.pojo.Emp">
select *
from emp
<where>
<if test="name!=null">
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>
在上述的代码中gender的数据类型为Short,short和Short两种数据类型的区别如下:
1. 数据类型: - short是Java的原始数据类型(primitive type),用于表示短整数(16位有符号整数),范围为-32,768到32,767。 - Short是Java的包装类(wrapper class),它是对short类型的封装,提供了一些额外的功能,如方法和属性。 2. 可空性: - short是一个原始数据类型,它不能为null。 - Short是一个包装类,它可以为null。这使得我们可以在需要处理null的情况下使用它,比如在集合中存储null或者表示缺失值。 3. 自动装箱和拆箱: - short是一个原始数据类型,它不支持自动装箱和拆箱。如果需要将short类型的值赋给Short类型的变量,或者将Short类型的值赋给short类型的变量,需要进行显式的类型转换。 - Short是一个包装类,它支持自动装箱和拆箱。这意味着我们可以直接将short类型的值赋给Short类型的变量,或者将Short类型的值赋给short类型的变量,而不需要进行显式的类型转换。 4. 使用场景: - short通常用于需要节省内存空间或性能要求较高的场景,比如在大量数据计算或存储空间有限的情况下。 - Short通常用于需要处理null或者在需要使用包装类的特殊功能(如集合操作、反射等)的场景。 总结起来,short是原始数据类型,适用于简单的数值计算和节省内存空间的场景;而Short是包装类,适用于需要处理null或者使用包装类的特殊功能的场景。
接口测试
在启动完SpringBoot项目后,使用postman进行接口功能的测试,具体的请求地址及请求参数如下:
还有参数值未进行指定
运行结果如下:
{
"code": 1,
"msg": "success",
"data": {
"total": 5,
"rows": [
{
"id": 6,
"username": "xiaozhao",
"password": "123456",
"name": "小昭",
"gender": 2,
"image": "6.jpg",
"job": 3,
"entrydate": "2013-09-05",
"deptId": 1,
"creteTime": null,
"updateTime": "2023-08-07T15:44:50"
},
{
"id": 7,
"username": "jixiaofu",
"password": "123456",
"name": "纪晓芙",
"gender": 2,
"image": "7.jpg",
"job": 1,
"entrydate": "2005-08-01",
"deptId": 1,
"creteTime": null,
"updateTime": "2023-08-07T15:44:50"
},
{
"id": 8,
"username": "zhouzhiruo",
"password": "123456",
"name": "周芷若",
"gender": 2,
"image": "8.jpg",
"job": 1,
"entrydate": "2014-11-09",
"deptId": 1,
"creteTime": null,
"updateTime": "2023-08-07T15:44:50"
}
]
}
}
前后端联调
打开课程提供的nginx项目,运行结果如下,进行条件分页查询
控制台输出
成功运行
但是仔细阅读输出日志
在前端没有传递name参数值时,SQL语句依然拼接了name查询条件,根据日志内容知道,此时name参数的值为一个空字符串,因此要对SQL语句进行完善。具体修改如下:
添加一个判断条件,再次运行发现问题得到了解决
小结
- 条件分页查询
- 条件查询:动态SQL-XML映射文件
- 分页查询:MyBatis中PageHepler分页插件