【苍穹外卖JAVA项目】第2天:新增员工
在EmployeeMapper.java中插入数据:一、新增员工
1.产品原型

2.接口设计
由于需要提交员工信息,用post请求方式,可以携带json数据

3.设计数据库的employee表

4.设计DTO
数据传输对象(DTO):封装前端提交过来的数据

实体类如下:包含更多属性
public class Employee implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String username;private String name;private String password;private String phone;private String sex;private String idNumber;private Integer status;//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;private Long createUser;private Long updateUser;}
5.开发
在EmployeeController.java中创建新增员工的方法:
说明:接收前端的HTTP POST请求,将请求体中的JSON数据转换为
EmployeeDTO对象,记录日志,调用业务逻辑层的save方法来保存员工数据,并返回一个成功的响应
/*** 新增员工* @param employeeDTO* @return*/@PostMapping //表明此方法用来处理客户端发送的POST请求@ApiOperation("新增员工") //为API提供文档说明//@RequestBody主要用来接收前端传递给后端的json对象,并将该对象自动转换为EmployeeDTO类型的实例public Result save(@RequestBody EmployeeDTO employeeDTO){log.info("新增员工:{}",employeeDTO); //日志记录,{}是占位符,用于插入变量的值employeeService.save(employeeDTO); //该方法后续步骤会定义,用于处理保存的逻辑return Result.success(); //Result是自定义的类,用于封装API方法的响应数据}
在EmployeeService.java中声明新增员工方法:
/*** 新增员工* @param employeeDTO*/void save(EmployeeDTO employeeDTO);
在实现类EmployeeServicelmpl.java中实现新增员工方法:
说明:将
EmployeeDTO对象转换为Employee对象并保存到数据库中
/*** 新增员工** @param employeeDTO*/public void save(EmployeeDTO employeeDTO) {Employee employee = new Employee();//将EmployeeDTO对象的属性复制到Employee对象中BeanUtils.copyProperties(employeeDTO, employee);//设置账号的状态,默认正常状态 1表示正常 0表示锁定employee.setStatus(StatusConstant.ENABLE);//设置密码,默认密码123456employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));//设置当前记录的创建时间和修改时间employee.setCreateTime(LocalDateTime.now());employee.setUpdateTime(LocalDateTime.now());//设置当前记录创建人id和修改人idemployee.setCreateUser(10L);//目前写个假数据,后期修改employee.setUpdateUser(10L);employeeMapper.insert(employee);//后续步骤定义,将Employee对象保存到数据库中}
在EmployeeMapper.java中插入员工数据:
说明:使用MyBatis框架的Java接口方法,定义了插入员工数据到数据库的操作
/*** 插入员工数据* @param employee*///@Insert是一个MyBatis框架的注解,用来指定SQL插入语句//#{name}、#{username}等是MyBatis的参数占位符,它们将被实际的员工对象属性值所替换@Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user,status) " +"values " +"(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})")void insert(Employee employee);
6.功能测试
(1)通过前后端联调测试
由于前后端并行开发,后端开发完之后,前端可能没有开发完成,因此此方法局限性大,不常用

添加成功

(2)通过接口文档测试
在接口文档中的员工登录中生成一个jwt令牌,复制到全局参数设置中,刷新页面(令牌会2小时后失效,若报错401的话需要重新生成令牌)


在新增员工中自动添加了请求头部,此时发送请求就可以返回响应,数据库中成功添加了数据


7.代码完善
(1)录入的用户名已存在,抛出异常后没有处理
当重新提交zhangsan的数据时,因数据重复会抛出异常,需要重写异常


说明:异常处理方法,它使用了Spring框架的
@ExceptionHandler注解来捕获并处理特定的异常类型:SQLIntegrityConstraintViolationException
/*** 处理SQL异常* @param ex* @return*/@ExceptionHandler //捕获并处理特定的异常类型public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){//Duplicate entry 'zhangsan' for key 'employee.idx_username'String message = ex.getMessage(); //获取异常的详细信息if(message.contains("Duplicate entry")){String[] sp = message.split(" "); //通过空格分割异常消息,然后提取用户名String username = sp[2];String msg = username + MessageConstant.ALREADY_EXISTS; //自定义的错误消息:用户已存在return Result.error(msg);}else {return Result.error(MessageConstant.UNKNOWN_ERROR);//自定义的错误消息:未知错误}}
(2)新增员工时,创建人id和修改人id设置为了固定值
需要通过某种方式动态获取当前登录员工的id





客户端发送的每一个请求对应一个线程,因此可以把id存入ThreadLocal,再在server里取出来
在使用ThreadLocal时往往会进行一个简单的封装,包装成一个工具类common-context-BaseContext
package com.sky.context;public class BaseContext {public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();public static void setCurrentId(Long id) {threadLocal.set(id);}public static Long getCurrentId() {return threadLocal.get();}public static void removeCurrentId() {threadLocal.remove();}}
需要在JwtTokenAdminlnterceptor.java拦截器取出ID:
BaseContext.setCurrentId(empId);
需要在EmployeeServicelmpl.java实现类获得ID:
//设置当前记录创建人id和修改人idemployee.setCreateUser(BaseContext.getCurrentId());employee.setUpdateUser(BaseContext.getCurrentId());
二、员工分页查询
1.产品原型

2.接口设计

3.设计DTO

4.开发


在EmployeeController.java中创建员工分页查询的方法:
/*** 员工分页查询* @param employeePageQueryDTO* @return*/@GetMapping("/page")@ApiOperation("员工分页查询")public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){log.info("员工分页查询,参数为:{}", employeePageQueryDTO);PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO); //service存储分页查询的方法return Result.success(pageResult);}
在EmployeeService.java中声明员工分页查询方法:
/*** 分页查询方法* @param employeePageQueryDTO* @return*/PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO);
在实现类EmployeeServicelmpl.java中实现员工分页查询方法:
说明:使用mybatis中的pagehelper插件,已经在初始代码pom.xml中引入,可以简化分页操作,
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId></dependency>
/*** 分页查询* @param employeePageQueryDTO* @return*/public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {//select * from employee limit 0,10(limit关键字查询第0-10条)//实现原理:将page封装后存入threadlocal,在分页查询前取出来,动态拼接实现SQLPageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO); //返回pagehelper格式的对象long total = page.getTotal();List<Employee> records = page.getResult();return new PageResult(total, records);}
在EmployeeMapper.java中插入数据:
/*** 员工分页查询* @param employeePageQueryDTO* @return*/Page<Employee> pageQuery(EmployeePageQueryDTO employeePageQueryDTO);
说明:使用动态SQL,不再使用注解的方式,需要写到映射文件server-resources-mapper-EmployeeMapper.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.sky.mapper.EmployeeMapper"><select id="pageQuery" resultType="com.sky.entity.Employee">select * from employee<where><if test="name != null and name != ''">and name like concat('%',#{name},'%')</if></where>order by create_time desc</select>
</mapper>
5.功能测试
相关文章:
【苍穹外卖JAVA项目】第2天:新增员工
在EmployeeMapper.java中插入数据:一、新增员工 1.产品原型 2.接口设计 由于需要提交员工信息,用post请求方式,可以携带json数据 3.设计数据库的employee表 4.设计DTO 数据传输对象(DTO):封装前端提交过…...
队列的实现及循环队列
一、队列的概念及结构 队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列具有先进先出FIFO(Fist In First Out)。 入队列:进行插入操作的一端称为队尾。 出队列:进行删除操作的一端称为…...
docker部署zookeeper和kafka
docker部署zookeeper和kafka zookeeperkafkakafka-eagle zookeeper firewall-cmd --zonepublic --add-port2181/tcp --permanent firewall-cmd --reload docker pull zookeeper:3.4.14 docker run -d --name zk -p 2181:2181 zookeeper:3.4.14mkdir -p /root/zookeeper/data m…...
(13)zabbix的监控-1
前言:在上一次的基础上,完成实验。 1、添加一个空模板,方便 2、添加空模板到主机192.168.121.50 client-one里面模板是空的 4、在主机添加监控项和图形 5、自定义监控项,在客户端定义 [rootclient1 ~]# vim /etc/zabbix/zabbix_…...
Redis相关面试题(二)
一、Bit中不同命令使用的场景 二、什么是缓存击穿,缓存穿透,缓存雪崩? 缓存击穿:是指当某一个key的缓存过期时大并发量的请求同时访问key,瞬间击穿服务器直接访问到数据库,使得数据库处于负载情况 缓存穿透…...
Docker Compose与私有仓库
Docker Compose与私有仓库 docker-compose -v 查看版本信息 Docker Compose的应用 创建APACHE容器 vim docker-compose.yaml yaml文件缩进严格;冒号后有内容需要加空格,冒号后无内容一般不加空格 冒号后的内容中若包含路径‘/’或‘:’时…...
AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例
AI学习记录已经发了十几篇,大佬们可以看看,如果有帮助动动小手点赞 token入门版,有空会更新具体代码操作 GPT4当中,我们提问问题是按照token进行扣费的,那到底什么是token? 在不同的语言模型当中&#x…...
Java线程池和执行流程
在 Java 中,常见的四种线程池包括: 1. newFixedThreadPool(固定大小线程池) 应用场景:适用于需要限制线程数量,并且任务执行时间比较均匀的场景,例如服务器端的连接处理。优点:线程数…...
进程信号的产生与处理
目录 前言 一.信号的概念 二.信号的产生 1.键盘产生 2.系统调用 3.软件条件 4.异常 三.信号的保存 四.信号的处理 信号处理的方式 设定屏蔽信号 自定义处理信号 信号处理的时机 前言 进程信号(Process Signals)是操作系统与运行进程之间进行通…...
统一响应结果封装,Result类的实现【后端 06】
统一响应结果封装,Result类的实现 在开发Web应用或API接口时,如何优雅地处理并返回响应结果是每个开发者都需要考虑的问题。统一响应结果封装(Unified Response Encapsulation)作为一种广泛采用的实践,不仅提高了API的…...
明日周刊-第20期
本周异形新电影上映,开始期待起来了,毕竟这是一个经久不衰的ip。还有就是马上来临的黑神话悟空,属于我们自己的3A大作,接下去的每一天都是新的期待。 文章目录 科技短讯资源分享随便说说一点心情 科技短讯 科技创新与突破 人工智…...
深入剖析 Spring 常用注解:功能与差异的全景洞察
《深入剖析 Spring 常用注解:功能与差异的全景洞察》 在当今的 Java 开发领域,Spring 框架无疑是最广泛使用的框架之一。而在 Spring 中,注解的运用极大地简化了开发流程,提高了代码的可读性和可维护性。本文将深入探讨 Spring 中…...
【隐私计算篇】隐私计算使用不当也会泄露原始数据
1. 背景信息 有个有趣的问题,刚好最近有讨论到,在这里也抛一下,就是隐私计算中我们经常谈到主流的一些技术,比如联邦学习、多方安全计算、安全求交、匿踪查询、可信执行环境等,然后笼统地会称这些技术实现了对隐私…...
C++第一讲:开篇
C第一讲:开篇 1.C历史背景1.1C创世主--本贾尼1.2C版本更新1.3C的重要性1.4C书籍推荐 2.C的第一个程序3.命名空间3.1namespace是什么3.2namespace的使用3.3namespace使用注意事项3.4命名空间的使用 4.C输入和输出5.缺省参数6.函数重载7.引用7.1什么是引用7.2引用的定…...
OceanBase V4.2特性解析:MySQL模式下GIS空间表达式的场景及能力解析
1. 背景 1.1. OceanBase Mysql gis空间表达式的应用场景及能力 在OceanBase 4.1版本中,mysql模式下支持了gis数据类型以及部分空间对象相关的表达式,随着客户使用空间数据的需求日益增长,需要快速地补齐空间数据存储和计算分析的能力&#…...
HSL模型和HSB模型,和懒人配色的Color Hunt
色彩不仅仅是视觉上的享受,它在数据可视化中也扮演着关键角色。通过合理运用色彩模型,我们可以使数据更具可读性和解释性。在这篇文章将探讨HSL(Hue, Saturation, Lightness)和HSB(Hue, Saturation, Brightness&#x…...
什么是云原生?(二)
1. 云原生的定义 云原生指构建和运行应用以充分利用通过云技术交付模式交付的分布式计算。云原生应用旨在充分利用云技术平台特有的可扩展性、弹性和灵活性优势。 根据云原生计算基金会 (CNCF) 的定义,云原生技术可帮助企业在公有云、私有云和混合云环境中构建和…...
pytorch 47 模型剪枝实战|基于torch-pruning库代码对yolov10n模型进行剪枝
torch-pruning官方提供了基于yolov8的剪枝代码,基于此代码改进博主实现了对yolov10n模型的剪枝。虽然实现了对yolov10n模型的剪枝,剪枝目标为移除60%的通道,然而实验是失败的,针对coco数据集进行操作,剪枝前的模型map时37,剪枝后只能恢复到22,比预计下降了15个点,剪枝后…...
LeetCode_sql_day15(262.行程与用户)
描述:262. 行程和用户 - 力扣(LeetCode) 取消率 的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。 编写解决方案找出 "2013-10-01" 至 "2013-10-03" 期间非禁止…...
【MySQL】详解数据库约束、聚合查询和联合查询
数据库约束 约束类型 数据库的约束类型主要包括以下几种: 主键约束(Primary Key Constraint):确保表中的每一行都有唯一的标识,且不能为NULL。 外键约束(Foreign Key Constraint):…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

