04-SpringBootWeb案例(下)

news2024/11/26 5:36:06

3. 员工管理

完成了部门管理的功能开发之后,我们进入到下一环节员工管理功能的开发。
在这里插入图片描述
基于以上原型,我们可以把员工管理功能分为:

  1. 分页查询(今天完成)
  2. 带条件的分页查询(今天完成)
  3. 删除员工(今天完成)
  4. 新增员工(后续完成)
  5. 修改员工(后续完成)

那下面我们就先从分页查询功能开始学习。

3.1 分页查询

3.1.1 基础分页

3.1.1.1 需求分析

我们之前做的查询功能,是将数据库中所有的数据查询出来并展示到页面上,试想如果数据库中的数据有很多(假设有十几万条)的时候,将数据全部展示出来肯定不现实,那如何解决这个问题呢?

使用分页解决这个问题。每次只展示一页的数据,比如:一页展示10条数据,如果还想看其他的数据,可以通过点击页码进行查询。

在这里插入图片描述
要想从数据库中进行分页查询,我们要使用 LIMIT 关键字,格式为:limit 开始索引 每页显示的条数

查询第1页数据的SQL语句是:
select * from emp limit 0,10;
查询第2页数据的SQL语句是:
select * from emp limit 10,10;
查询第3页的数据的SQL语句是:
select * from emp limit 20,10;
观察以上SQL语句,发现: 开始索引一直在改变 , 每页显示条数是固定的
开始索引的计算公式: 开始索引 = (当前页码 - 1) * 每页显示条数

我们继续基于页面原型,继续分析,得出以下结论:

  1. 前端在请求服务端时,传递的参数
    • 当前页码 page
    • 每页显示条数 pageSize
  2. 后端需要响应什么数据给前端
    • 所查询到的数据列表(存储到List 集合中)
    • 总记录数

在这里插入图片描述

后台给前端返回的数据包含:List集合(数据列表)、total(总记录数) 而这两部分我们通常封装到PageBean对象中,并将该对象转换为json格式的数据响应回给浏览器。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
	private Long total; //总记录数
	private List rows; //当前页数据列表
}
3.1.1.2 接口文档

员工列表查询

  • 基本信息

请求路径:/emps
请求方式:GET
接口描述:该接口用于员工列表数据的条件分页查询

  • 请求参数

参数格式:queryString
参数说明:

参数名是否必须示例备注
name姓名
gender1性别 , 1 男 , 2 女
begin2010-01-01范围匹配的开始时间(入职日期)
end2020-01-01范围匹配的结束时间(入职日期)
page1分页查询的页码,如果未指定,默认为1
pageSize10分页查询的每页记录数,如果未指定,默认为10

请求数据样例:

/emps?name=张&gender=1&begin=2007-09-01&end=2022-09-
01&page=1&pageSize=10
  • 响应数据

参数格式:application/json
参数说明:

参数名类型是否必须默认值备注其他信息
codenumber必须响应码,1 代表成功,0 代表失败
msgstring非必须提示信息
dataobject[ ]非必须返回的数据
l- totalnumber必须总记录数
l- rowsobject[]必须iditem 类型:object
l- idnumber非必须id
l- usernamestring非必须用户名
l- namestring非必须姓名
l- passwordstring非必须密码
l- entrydatestring非必须入职日期
l- gendernumber非必须性别,1 男 2女
l- imagestring非必须职位, 说明: 1 班主任,2 讲师,3 学工主管, 4 教研主管, 5 咨询师
l- jobnumber非必须图像
l- deptIdnumber非必须部门id
l- createTimestring非必须创建时间
l- updateTimestring非必须更新时间

响应数据样例:

{
	"code": 1,
	"msg": "success",
	"data": {
	"total": 2,
	"rows": [
 		{
			"id": 1,
			"username": "jinyong",
			"password": "123456",
			"name": "金庸",
			"gender": 1,
			"image": "https://web-framework.oss-cnhangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg",
			"job": 2,
			"entrydate": "2015-01-01",
			"deptId": 2,
			"createTime": "2022-09-01T23:06:30",
			"updateTime": "2022-09-02T00:29:04"
 		},
 		{
			"id": 2,
			"username": "zhangwuji",
			"password": "123456",
			"name": "张无忌",
			"gender": 1,
			"image": "https://web-framework.oss-cnhangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg",
			"job": 2,
			"entrydate": "2015-01-01",
			"deptId": 2,
			"createTime": "2022-09-01T23:06:30",
			"updateTime": "2022-09-02T00:29:04"
 		}
 		]
 	}
}
3.1.1.3 思路分析

在这里插入图片描述
分页查询需要的数据,封装在PageBean对象中:
在这里插入图片描述

3.1.1.4 功能开发

通过查看接口文档:员工列表查询

请求路径:/emps
请求方式:GET
请求参数:跟随在请求路径后的参数字符串。 例:/emps?page=1&pageSize=10
响应数据:json格式

EmpController

package com.itheima.controller;

import com.itheima.pojo.PageBean;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@CrossOrigin(origins = "*", maxAge = 3600)
public class EmpController {
    @Autowired
    private EmpService empService;

    // 条件分页查询
    @GetMapping("/emps")
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer pageSize) {
        // 记录日志
        log.info("分页查询,参数:{},{}", page, pageSize);
        // 调用业务层分页查询功能
        PageBean pageBean = empService.page(page, pageSize);
        // 响应
        return Result.success(pageBean);
    }
}

@RequestParam(defaultValue=“默认值”) //设置请求参数默认值

EmpService

package com.itheima.service;

import com.itheima.pojo.PageBean;
import org.springframework.stereotype.Service;

@Service
public interface EmpService {
    /**
     * 条件分页查询
     *
     * @param page     页码
     * @param pageSize 每页展示记录数
     * @return
     */

    PageBean page(Integer page, Integer pageSize);
}

EmpServiceImpl

package com.itheima.service.impl;

import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.Emp;
import com.itheima.pojo.PageBean;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@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;  // 计算起始索引 , 公式:(页码-1)*页大小
        List<Emp> empList = empMapper.page(start, pageSize);
        // 3、封装PageBean对象
        PageBean pageBean = new PageBean(count, empList);
        return pageBean;
    }
}

EmpMapper

package com.itheima.mapper;

import com.itheima.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface EmpMapper {
    /**
     * 获取总记录数
     *
     * @return
     */
    @Select("select count(*) from emp")
    public long count();

    /**
     * 获取当前页的结果列表
     *
     * @param start
     * @param pageSize
     * @return
     */
    @Select("select * from emp limit #{start},#{pageSize}")
    public List<Emp> page(Integer start, Integer pageSize);
}
3.1.1.5 功能测试

功能开发完成后,重新启动项目,使用postman,发起POST请求:
在这里插入图片描述

3.1.1.6 前后端联调

打开浏览器,测试后端功能接口:
在这里插入图片描述

3.1.2 分页插件

3.1.2.1 介绍

前面我们已经完了基础的分页查询,大家会发现:分页查询功能编写起来比较繁琐。
在这里插入图片描述

在Mapper接口中定义两个方法执行两条不同的SQL语句:

  1. 查询总记录数
  2. 指定页码的数据列表

在Service当中,调用Mapper接口的两个方法,分别获取:总记录数、查询结果列表,然后在将 获?>取的数据结果封装到PageBean对象中。 大家思考下:在未来开发其他项目,只要涉及到分页查询 >功能(例:订单、用户、支付、商品),
都必须按照以上操作完成功能开发

结论:原始方式的分页查询,存在着"步骤固定"、"代码频繁"的问题
解决方案:可以使用一些现成的分页插件完成。对于Mybatis来讲现在最主流的就是PageHelper。

PageHelper是Mybatis的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的
分页查询。
官网:https://pagehelper.github.io/

在这里插入图片描述

在执行empMapper.list()方法时,就是执行:select * from emp 语句,怎么能够实现分页操作呢?
分页插件帮我们完成了以下操作:

  1. 先获取到要执行的SQL语句:select * from emp
  2. 把SQL语句中的字段列表,变为:count(*)
  3. 执行SQL语句:select count(*) from emp //获取到总记录数
  4. 再对要执行的SQL语句:select * from emp 进行改造,在末尾添加 limit ? ,?
  5. 执行改造后的SQL语句:select * from emp limit ? , ?
3.1.2.2 代码实现

当使用了PageHelper分页插件进行分页,就无需再Mapper中进行手动分页了。 在Mapper中我们只
需要进行正常的列表查询即可。在Service层中,调用Mapper的方法之前设置分页参数,在调用
Mapper方法执行查询之后,解析分页结果,并将结果封装到PageBean对象中返回。
1、在pom.xml引入依赖

<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper-spring-boot-starter</artifactId>
	<version>1.4.2</version>
</dependency>

2、EmpMapper

@Mapper
public interface EmpMapper {
	//获取当前页的结果列表
	@Select("select * from emp")
	public List<Emp> page(Integer start, Integer pageSize);
}

3、EmpServiceImpl

@Override
public PageBean page(Integer page, Integer pageSize) {
	// 设置分页参数
	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;
}
3.1.2.3 测试

功能开发完成后,我们重启项目工程,打开postman,发起GET请求,访问 :http://localhost:8080/emps?page=1&pageSize=5
在这里插入图片描述

后端程序SQL输出:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2187544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pikachu-Sql Inject-数字型注入(GET)

一、、破解 SQL 查询语句中的字段数 ?id1 order by 3 -- // -- 是注释&#xff0c; 加号 在MySQL中会转成空格 order by 1 &#xff0c;by 数字几&#xff0c;就是按照第几列进行排序&#xff1b;如果没有这一行&#xff0c;则报错 如&#xff1a;以下语句&#xff0c;根据…

QT学习笔记1(QT和QT creator介绍)

QT学习笔记1&#xff08;QT和QT creator介绍&#xff09; Qt 是一个跨平台的应用开发框架&#xff0c;主要用于图形用户界面&#xff08;GUI&#xff09;应用的开发&#xff0c;但也支持非GUI程序的开发。Qt 支持多种平台&#xff0c;如Windows、macOS、Linux、iOS和Android&a…

Servlet的生命周期及用户提交表单页面的实现(实验报告)

一、实验目的、要求 1. 掌握Servlet的定义&#xff0c;即Servlet是运行在服务器端的Java程序&#xff0c;用于扩展服务器的功能。 2. 学习和掌握在开发环境中搭建Servlet应用所需的工具&#xff0c;如Tomcat服务器、IDEA等。 二、实验内容 根据本章所学知识&#xff0c;实验…

linux第一课:下载与安装

这是我的个人复习笔记&#xff0c;草稿箱字太多会卡就发这了&#xff0c;欢迎大家阅读。 Kali Linux&#xff0c;黑客必备神器。跟着我&#xff0c;带你从入门到入狱&#xff01; 第一课&#xff0c;下载与安装。 第一步&#xff1a; 在官网下载Centos镜像&#xff1a;http…

(2025)408考研:王道操作系统文件管理强化

写在最前面,需要pdf的请资源里下载,已经排版好了,这里不知道为什么粘贴上来排版这么难看!!! 某一个分区进行格式化的时候,这个分区的文件系统就被建立了,一旦这个文件系统建立完后,就确定了文件系统使用的什么样的物理结构。 操作系统引导: 主存分为两部分,RAM和RO…

人体目标检测数据集 18000张 人体 带标注voc yolo

人体目标检测数据集 18000张 人体 带标注voc yolo 继续 人体目标检测数据集介绍 数据集名称 人体目标检测数据集 (Human Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型&#xff08;包括YOLOv5、YOLOv6、YOLOv7等&#xff09;而设计&#…

vue-cli老项目继续优化:json压缩神器 compress-json

前言 上文讲到一个 vue-cli 带脚本生成内容的老项目的打包时间已经从 40min &#xff0c;优化到 12min &#xff0c;再到 9min 。 还有可以考虑的方式包含缩小脚本体积、依赖分包、构建的缓存等等。 那么本文就来讨论缩小脚本体积的方式。 分析 前文已知&#xff0c;生成的…

螺狮壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习06(Docker网络连接)

如果要搭建基于docker的私人DC&#xff0c;除了虚拟机网络连接外&#xff0c;就得掌握docker的网络连接。磨刀不误砍柴工&#xff0c;或者说工欲善其事必先利其器&#xff0c;我们先学学典型的docker的网络连接方式。Docker的网络连接有四种&#xff1a;bridge、none、containe…

jmeter学习(2)变量

1&#xff09;用户定义的变量 路径&#xff1a;添加-》配置元件-》用户定义的变量 用户定义的变量是全局变量&#xff0c;可以跨线程组被调用&#xff0c;但在启动运行时获取一次值&#xff0c;在运行过程中不再动态获取值。 2&#xff09;用户参数 路径&#xff1a;…

扩展可持续性概念:太空移民、持久产品与人类未来

可持续性的扩展概念&#xff1a;超越绿色能源&#xff0c;关乎人类未来的延续 当我们听到“可持续性”这个词时&#xff0c;大多数人首先想到的是环境保护、绿色能源、减少碳足迹或保护生态系统。虽然这些都是不可忽视的重要部分&#xff0c;但可持续性远远超出了绿色能源的范…

RabbbitMQ篇(环境搭建 - 下载 安装)(持续更新迭代)

目录 一、Windows 1. 下载安装程序 2. 安装配置erlang 3. 安装rabbitMQ 4. 验证 二、Linux 1. 下载rpm包 1.1. 下载Erlang的rpm包 1.2. 下载socat的rpm包 1.3. 下载RabbitMQ的rpm包 2. 安装 2.1. 安装Erlang 2.2. 安装socat 2.3. 安装RabbitMQ 3. 启动RabbitMQ服…

酒店生态发展旅游四个一体化建设-—未来之窗行业应用跨平台架构

一、酒店在旅游中的作用 首先&#xff0c;酒店为游客提供了舒适的住宿环境。经过一天的游玩&#xff0c;游客需要一个干净、安全、设施齐全的空间休息&#xff0c;恢复精力&#xff0c;以更好地继续后续的行程。 其次&#xff0c;酒店是旅游服务的重要载体。它不仅提供住宿&am…

【Node.js】内置模块FileSystem的保姆级入门讲解

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;Vscode 本文代码都经由博主PleaSure乐事实操后得出&#xff0c;可以放心使用。 1.FileSystem介绍 Node.js 的 fs&#xff08;filesystem&#xff09;模块是一个核心模块&#xff0c…

【MATLAB2024b】安装离线帮助文档(windows)

文章目录 一、在 MATLAB 设置中安装二、从math works 网站下载ISO&#xff1a;给无法联网的电脑安装 版本&#xff1a;matlab 2024b&#xff08;或者大于等于2023a&#xff09; 所需空间&#xff1a;10~15 GB 平台&#xff1a;Windows 需要注册math works账号。 一、在 MATLAB …

kubernets基础-ingress详细介绍

文章目录 什么是IngressIngress详细说明Ingress示例 Ingress控制器Ingress控制器的工作原理Ingress控制器的特点常见的Ingress控制器 Ingress关联Ingress控制器一、Ingress资源对象二、Ingress控制器三、Ingress与Ingress控制器的关联方式四、注意事项 多实例部署一、Ingress多…

《数据结构(刘大有)》学习(6)

系列文章目录 一、绪论 二、顺序表、链表 三、堆栈、队列 四、数组 五、字符串 六、树 目录 树的基本概念树的定义树的特点树的相关术语度层数高度路径二叉树定义特点定理满二叉树定义特点完全二叉树定义特点二叉树的存储结构顺序存储结点结构优点缺点 链式存储 结点结构…

带你深入浅出设计模式:四、原型模式:编程中的克隆技术

此为设计模式第四谈&#xff01; 用总-分-总的结构和生活化的例子给你讲解设计模式&#xff01; 码农不易&#xff0c;各位学者学到东西请点赞收藏支持支持&#xff01; 开始部分&#xff1a; 总&#xff1a;原型模式的核心逻辑在于通过克隆现有实例来创建新对象&#xff0c…

(12)MATLAB莱斯(Rician)衰落信道仿真2补充:莱斯衰落信道与莱斯随机变量

文章目录 前言1.关于莱斯衰落信道仿真的两个公式2.由式&#xff08;1&#xff09;推出式&#xff08;2&#xff09; 前言 本文给出关于莱斯衰落信道仿真的两个公式之间的推导。 1.关于莱斯衰落信道仿真的两个公式 在上一篇《&#xff08;11&#xff09;MATLAB莱斯&#xff08…

不只是前端,后端、产品和测试也需要了解的浏览器知识(一)

目录标题 一、我们为什么要了解浏览器&#xff1f;1. 对于前端开发者2. 对于后端开发者 二、浏览器发展概述1. 宏观发展2. 微观发展 三、浏览器核心部件1. 浏览器界面介绍2. 目前浏览器的使用的渲染引擎和解释器总结3. 浏览器的解释器 四、各家浏览器目前的市场占比五、整体总结…

深度学习笔记18_TensorFlow实现猫狗识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.9 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a;TensorFlow 2.10.0 二、GPU设置…