SpringBoot案例-员工管理-分页条件查询

根据页面原型,明确需求

页面原型

需求

 查看接口文档

接口文档的链接如下:

【腾讯文档】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语句进行完善。具体修改如下:

 添加一个判断条件,再次运行发现问题得到了解决

 

小结

  1. 条件分页查询
    1. 条件查询:动态SQL-XML映射文件
    2. 分页查询:MyBatis中PageHepler分页插件

猜你喜欢

转载自blog.csdn.net/weixin_64939936/article/details/132327850
今日推荐