当前位置: 首页 > news >正文

【苍穹外卖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中插入数据&#xff1a;一、新增员工 1.产品原型 2.接口设计 由于需要提交员工信息&#xff0c;用post请求方式&#xff0c;可以携带json数据 3.设计数据库的employee表 4.设计DTO 数据传输对象&#xff08;DTO&#xff09;&#xff1a;封装前端提交过…...

队列的实现及循环队列

一、队列的概念及结构 队列只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表。队列具有先进先出FIFO&#xff08;Fist In First Out&#xff09;。 入队列&#xff1a;进行插入操作的一端称为队尾。 出队列&#xff1a;进行删除操作的一端称为…...

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

前言&#xff1a;在上一次的基础上&#xff0c;完成实验。 1、添加一个空模板&#xff0c;方便 2、添加空模板到主机192.168.121.50 client-one里面模板是空的 4、在主机添加监控项和图形 5、自定义监控项&#xff0c;在客户端定义 [rootclient1 ~]# vim /etc/zabbix/zabbix_…...

Redis相关面试题(二)

一、Bit中不同命令使用的场景 二、什么是缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩&#xff1f; 缓存击穿&#xff1a;是指当某一个key的缓存过期时大并发量的请求同时访问key&#xff0c;瞬间击穿服务器直接访问到数据库&#xff0c;使得数据库处于负载情况 缓存穿透…...

Docker Compose与私有仓库

Docker Compose与私有仓库 docker-compose -v 查看版本信息 Docker Compose的应用 创建APACHE容器 vim docker-compose.yaml yaml文件缩进严格&#xff1b;冒号后有内容需要加空格&#xff0c;冒号后无内容一般不加空格 冒号后的内容中若包含路径‘/’或‘&#xff1a;’时…...

AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例

AI学习记录已经发了十几篇&#xff0c;大佬们可以看看&#xff0c;如果有帮助动动小手点赞 token入门版&#xff0c;有空会更新具体代码操作 GPT4当中&#xff0c;我们提问问题是按照token进行扣费的&#xff0c;那到底什么是token&#xff1f; 在不同的语言模型当中&#x…...

Java线程池和执行流程

在 Java 中&#xff0c;常见的四种线程池包括&#xff1a; 1. newFixedThreadPool&#xff08;固定大小线程池&#xff09; 应用场景&#xff1a;适用于需要限制线程数量&#xff0c;并且任务执行时间比较均匀的场景&#xff0c;例如服务器端的连接处理。优点&#xff1a;线程数…...

进程信号的产生与处理

目录 前言 一.信号的概念 二.信号的产生 1.键盘产生 2.系统调用 3.软件条件 4.异常 三.信号的保存 四.信号的处理 信号处理的方式 设定屏蔽信号 自定义处理信号 信号处理的时机 前言 进程信号&#xff08;Process Signals&#xff09;是操作系统与运行进程之间进行通…...

统一响应结果封装,Result类的实现【后端 06】

统一响应结果封装&#xff0c;Result类的实现 在开发Web应用或API接口时&#xff0c;如何优雅地处理并返回响应结果是每个开发者都需要考虑的问题。统一响应结果封装&#xff08;Unified Response Encapsulation&#xff09;作为一种广泛采用的实践&#xff0c;不仅提高了API的…...

明日周刊-第20期

本周异形新电影上映&#xff0c;开始期待起来了&#xff0c;毕竟这是一个经久不衰的ip。还有就是马上来临的黑神话悟空&#xff0c;属于我们自己的3A大作&#xff0c;接下去的每一天都是新的期待。 文章目录 科技短讯资源分享随便说说一点心情 科技短讯 科技创新与突破 人工智…...

深入剖析 Spring 常用注解:功能与差异的全景洞察

《深入剖析 Spring 常用注解&#xff1a;功能与差异的全景洞察》 在当今的 Java 开发领域&#xff0c;Spring 框架无疑是最广泛使用的框架之一。而在 Spring 中&#xff0c;注解的运用极大地简化了开发流程&#xff0c;提高了代码的可读性和可维护性。本文将深入探讨 Spring 中…...

【隐私计算篇】隐私计算使用不当也会泄露原始数据

1. 背景信息 有个有趣的问题&#xff0c;刚好最近有讨论到&#xff0c;在这里也抛一下&#xff0c;就是隐私计算中我们经常谈到主流的一些技术&#xff0c;比如联邦学习、多方安全计算、安全求交、匿踪查询、可信执行环境等&#xff0c;然后笼统地会称这些技术实现了对隐私…...

C++第一讲:开篇

C第一讲&#xff1a;开篇 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版本中&#xff0c;mysql模式下支持了gis数据类型以及部分空间对象相关的表达式&#xff0c;随着客户使用空间数据的需求日益增长&#xff0c;需要快速地补齐空间数据存储和计算分析的能力&#…...

HSL模型和HSB模型,和懒人配色的Color Hunt

色彩不仅仅是视觉上的享受&#xff0c;它在数据可视化中也扮演着关键角色。通过合理运用色彩模型&#xff0c;我们可以使数据更具可读性和解释性。在这篇文章将探讨HSL&#xff08;Hue, Saturation, Lightness&#xff09;和HSB&#xff08;Hue, Saturation, Brightness&#x…...

什么是云原生?(二)

1. 云原生的定义 云原生指构建和运行应用以充分利用通过云技术交付模式交付的分布式计算。云原生应用旨在充分利用云技术平台特有的可扩展性、弹性和灵活性优势。 根据云原生计算基金会 (CNCF) 的定义&#xff0c;云原生技术可帮助企业在公有云、私有云和混合云环境中构建和…...

pytorch 47 模型剪枝实战|基于torch-pruning库代码对yolov10n模型进行剪枝

torch-pruning官方提供了基于yolov8的剪枝代码,基于此代码改进博主实现了对yolov10n模型的剪枝。虽然实现了对yolov10n模型的剪枝,剪枝目标为移除60%的通道,然而实验是失败的,针对coco数据集进行操作,剪枝前的模型map时37,剪枝后只能恢复到22,比预计下降了15个点,剪枝后…...

LeetCode_sql_day15(262.行程与用户)

描述&#xff1a;262. 行程和用户 - 力扣&#xff08;LeetCode&#xff09; 取消率 的计算方式如下&#xff1a;(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。 编写解决方案找出 "2013-10-01" 至 "2013-10-03" 期间非禁止…...

【MySQL】详解数据库约束、聚合查询和联合查询

数据库约束 约束类型 数据库的约束类型主要包括以下几种&#xff1a; 主键约束&#xff08;Primary Key Constraint&#xff09;&#xff1a;确保表中的每一行都有唯一的标识&#xff0c;且不能为NULL。 外键约束&#xff08;Foreign Key Constraint&#xff09;&#xff1a…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...