文章目录

  • 准备工作
    • 工程搭建
  • 增删改查
    • 查询部门
    • 删除部门
    • 新增部门
    • 修改部门
      • 查询回显
      • 修改数据
  • 日志技术

准备工作

需求:部门管理的查询、新增、修改、删除
在这里插入图片描述
使用REST风格的URL:

  • GET : 查询
  • POST :新增
  • PUT : 修改
  • DELETE :删除

调试工具:Apifox
集成了Api文档、Api调试、Api Mock、Api测试的一体化协作平台。

工程搭建

创建SpringBoot工程,并引入web开发起步依赖、mybatis、mysql驱动、lombok。
创建tlias数据库,并准备dept部门表。

CREATE TABLE dept (id int unsigned PRIMARY KEY AUTO_INCREMENT COMMENT 'ID, 主键',name varchar(10) NOT NULL UNIQUE COMMENT '部门名称',create_time datetime DEFAULT NULL COMMENT '创建时间',update_time datetime DEFAULT NULL COMMENT '修改时间'
) COMMENT '部门表';INSERT INTO dept VALUES (1,'学工部','2023-09-25 09:47:40','2024-07-25 09:47:40'),(2,'教研部','2023-09-25 09:47:40','2024-08-09 15:17:04'),(3,'咨询部','2023-09-25 09:47:40','2024-07-30 21:26:24'),(4,'就业部','2023-09-25 09:47:40','2024-07-25 09:47:40'),(5,'人事部','2023-09-25 09:47:40','2024-07-25 09:47:40'),(6,'行政部','2023-11-30 20:56:37','2024-07-30 20:56:37');

在application.yml中配置数据库连接信息

spring:application:name: tlias-web-management#mysql连接配置datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/tliasusername: rootpassword: 1234
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

准备包结构,引入实体类Dept及统一的响应结果封装类Result
在这里插入图片描述
实体类Dept:(lombok有问题,重写了getter、setter)

package com.baichu.poji;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDateTime;@Data
//@NoArgsConstructor
//@AllArgsConstructor
public class Dept {private Integer id;private String name;private LocalDateTime createTime;private LocalDateTime updateTime;// Getter and Setter for idpublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}// Getter and Setter for namepublic String getName() {return name;}public void setName(String name) {this.name = name;}// Getter and Setter for createTimepublic LocalDateTime getCreateTime() {return createTime;}public void setCreateTime(LocalDateTime createTime) {this.createTime = createTime;}// Getter and Setter for updateTimepublic LocalDateTime getUpdateTime() {return updateTime;}public void setUpdateTime(LocalDateTime updateTime) {this.updateTime = updateTime;}// toString method@Overridepublic String toString() {return "Dept{" +"id=" + id +", name='" + name + '\'' +", createTime=" + createTime +", updateTime=" + updateTime +'}';}
}

统一响应结果Result

package com.baichu.poji;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果*/
@Data
public class Result {private Integer code; //编码:1成功,0为失败private String msg; //错误信息private Object data; //数据// 无参构造函数public Result() {}// Getter and Setter for codepublic Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}// Getter and Setter for msgpublic String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}// Getter and Setter for datapublic Object getData() {return data;}public void setData(Object data) {this.data = data;}public static Result success() {Result result = new Result();result.code = 1;result.msg = "success";return result;}public static Result success(Object object) {Result result = new Result();result.data = object;result.code = 1;result.msg = "success";return result;}public static Result error(String msg) {Result result = new Result();result.msg = msg;result.code = 0;return result;}@Overridepublic String toString() {return String.format("Result{code=%d, msg='%s', data=%s}",code, msg,(data != null) ? data.toString() : "null");}
}

DeptMapper

package com.itheima.mapper;import org.apache.ibatis.annotations.Mapper;@Mapper
public interface DeptMapper {
}
DeptService
package com.itheima.service;public interface DeptService {
}
DeptServiceImpl
package com.itheima.service.impl;import com.itheima.service.DeptService;
import org.springframework.stereotype.Service;@Service
public class DeptServiceImpl implements DeptService {
}

DeptController

package com.itheima.controller;import org.springframework.web.bind.annotation.RestController;/*** 部门管理控制器*/
@RestController
public class DeptController {
}

增删改查

查询部门

需求:查询所有的部门数据,查询出来展示在部门管理的页面中。
Controller层

/*** 查询部门列表* @return*/
//@RequestMapping(value = "/depts",method = RequestMethod.GET)
@GetMapping("/depts")
public Result list(){log.info("查询全部部门数据");//System.out.println("查询全部部门数据");List<Dept> deptlist = deptService.findAll();return Result.success(deptlist);
}

Service层
在 DeptService 中,增加 findAll方法

List<Dept> findAll();

在 DeptServiceImpl 中,增加 findAll方法

@Override
public List<Dept> findAll() {return deptMapper.findAll();
}

Mapper层
在 DeptMapper 中,增加 findAll方法

@Select("select id, name, create_time createTime,update_time updateTime from dept order by create_time desc")
List<Dept> findAll();

接口测试
在这里插入图片描述

删除部门

删除部门数据。在点击 “删除” 按钮,会根据ID删除部门数据。

Controller层

/*** 删除部门*/
@DeleteMapping("/depts")
public Result delete(Integer id){log.info("根据id删除部门"+id);deptService.deleteById(id);return Result.success();
}

Service层
在 DeptService 中,增加 deleteById 方法

void deleteById(Integer id);

在 DeptServiceImpl 中,增加 deleteById 方法

@Override
public void deleteById(Integer id) {deptMapper.deleteById(id);
}

Mapper层
在 DeptMapper 中,增加 deleteById 方法

@Delete("delete from dept where id = #{id}")
void deleteById(Integer id);

接口测试
在这里插入图片描述

新增部门

点击 “新增部门” 的按钮之后,弹出新增部门表单,填写部门名称之后,点击确定之后,保存部门数据。

Controller层

/*** 增加部门*/
@PostMapping("/depts")
public Result add(@RequestBody Dept dept){log.info("增加部门");deptService.add(dept);return Result.success();
}

Service层
在 DeptService 中,增加 deleteById 方法

void add(Dept dept);

在 DeptServiceImpl 中,增加 deleteById 方法

@Override
public void add(Dept dept) {dept.setUpdateTime(LocalDateTime.now());dept.setCreateTime(LocalDateTime.now());deptMapper.insert(dept);
}

Mapper层
在 DeptMapper 中,增加 deleteById 方法

@Insert("insert into dept(name, create_time, update_time) values (#{name},#{createTime},#{updateTime})")
void insert(Dept dept);

接口测试
在这里插入图片描述

修改部门

对于任何业务的修改功能来说,一般都会分为两步进行:查询回显、修改数据。

查询回显

当我们点击 “编辑” 的时候,需要根据ID查询部门数据,然后用于页面回显展示。

Controller层

/*** 根据id查找* @param id* @return*/
@GetMapping("/depts/{id}")
public Result getInfo(@PathVariable Integer id){log.info("根据id查找部门:"+id);Dept dept = deptService.getInfo(id);return Result.success(dept);
}

Service层
在 DeptService 中增加 getById方法

Dept getInfo(Integer id);

在 DeptServiceImpl 中增加 getById方法

@Override
public Dept getInfo(Integer id) {return deptMapper.getInfo(id);
}

Mapper层
在 DeptMapper 中增加 getById 方法

@Select("select id, name, create_time createTime,update_time updateTime from dept where id = #{id}")
Dept getInfo(Integer id);

修改数据

查询回显回来之后,就可以对部门的信息进行修改了,修改完毕之后,点击确定,此时,就需要根据ID修改部门的数据。

Controller层

/*** 修改部门*/
@PutMapping("/depts")
public Result upDate(@RequestBody Dept dept){log.info("修改部门");deptService.upDate(dept);return Result.success();
}

Service层
在 DeptService 中增加 update 方法。

void upDate(Dept dept);

在 DeptServiceImpl 中增加 update 方法。 由于是修改操作,每一次修改数据,都需要更新updateTime。

@Override
public void upDate(Dept dept) {dept.setUpdateTime(LocalDateTime.now());deptMapper.update(dept);
}

Mapper层
在 DeptMapper 中增加 update 方法

@Update("update dept set name = #{name},update_time = #{updateTime} where id = #{id}")
void update(Dept dept);

接口测试
在这里插入图片描述

日志技术

日志框架:

  • JUL:这是JavaSE平台提供的官方日志框架,也被称为JUL。配置相对简单,但不够灵活,性能较差。
  • Log4j:一个流行的日志框架,提供了灵活的配置选项,支持多种输出目标。
  • Logback:基于Log4j升级而来,提供了更多的功能和配置选项,性能由于Log4j。
  • Slf4j:(Simple Logging Facade for Java)简单日志门面,提供了一套日志操作的标准接口及抽象类,允许应用程序使用不同的底层日志框架。

引入配置文件 logback.xml:

<configuration><!--  控制台输出  --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level表示级别从左显示5个字符宽度,%logger显示日志记录器的名称, %msg表示日志消息,%n表示换行符  --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern></encoder></appender><!--  系统文件输出  --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--  日志文件输出的文件名, %i表示序号  --><FileNamePattern>D:/tlias-%d{yyyy-MM-dd}-%i.log</FileNamePattern><!--  最多保留的历史日志文件数量  --><MaxHistory>30</MaxHistory><!--  最大文件大小,超过这个大小会触发滚动到新文件,默认为 10MB  --><maxFileSize>10MB</maxFileSize></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level表示级别从左显示5个字符宽度,%msg表示日志消息,%n表示换行符  --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern></encoder></appender><!--  日志输出级别  --><root level="INFO"><appender-ref ref="STDOUT"/><appender-ref ref="FILE"/></root>
</configuration>

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图解】idea中快速查找maven冲突

现象 今天启动项目时&#xff0c;总是以下报错&#xff0c;并退出SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/F:/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.13.3/log4j-slf4j-impl-2.13.3.jar!/org/slf4j/im…

LightGBM、XGBoost和CatBoost自定义损失函数和评估指标

LightGBM、XGBoost和CatBoost自定义损失函数和评估指标函数&#xff08;缩放误差&#xff09;数学原理损失函数定义梯度计算评估指标LightGBM实现自定义损失函数自定义评估指标使用方式XGBoost实现自定义损失函数自定义评估指标使用方式CatBoost实现自定义损失函数自定义评估指…

2025-09-08升级问题记录: 升级SDK从Android11到Android12

将 Android 工程的 targetSdkVersion 从 30 &#xff08;Android 11&#xff09;升级到 31&#xff08;Android 12&#xff09;需要关注一些重要的行为变更和适配点。 主要适配要点&#xff1a; 适配类别关键变更点适配紧迫性简要说明组件导出属性声明了 Intent Filter 的组件…

利用OpenCV实现模板与多个对象匹配

代码实现&#xff1a;import cv2 import numpy as npimg_rgb cv2.imread(mobanpipei.jpg) img_gray cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template cv2.imread(jianto.jpg, flags0) h, w template.shape[:2]# 读取图像# # 顺时针旋转 90 度&#xff08;k1&#xff0…

OS28.【Linux】自制简单的Shell的修bug记录

目录 1.问题代码 2.排查 前期检查 查找是谁修改了environ[0] 使用gdb下断点 查看后续的影响 分析出问题的split_commandline函数 3.反思 4.正确代码 5.结论 6.除此之外...... ★提示: 此bug非常隐蔽,不仔细分析很难查出问题,非常锻炼调试能力! 1.问题代码 #includ…

Debian 系统上安装与配置 MediaMTX

&#x1f3af; 在 Debian 系统上安装与配置 MediaMTX&#xff08;原 rtsp-simple-server&#xff09;&#xff1a;打造轻量级流媒体服务器 作者&#xff1a;远在太平洋 环境&#xff1a;Debian 10/11/12 | Ubuntu 可参考 关键词&#xff1a;MediaMTX、rtsp-simple-server、RTSP…

分布式专题——10.4 ShardingSphere-Proxy服务端分库分表

1 为什么要有服务端分库分表&#xff1f; ShardingSphere-Proxy 是 ShardingSphere 提供的服务端分库分表工具&#xff0c;定位是“透明化的数据库代理”。 它模拟 MySQL 或 PostgreSQL 的数据库服务&#xff0c;应用程序&#xff08;Application&#xff09;只需像访问单个数据…

Mysql相关的面试题1

什么是聚集索引&#xff08;聚簇索引&#xff09;&#xff1f;什么是二级索引&#xff08;非聚簇索引&#xff09;&#xff1f; 聚集索引就是叶子节点关联行数据的索引&#xff0c;二级索引就是叶子节点关联主键的索引&#xff0c;聚集索引必须有且仅有一个&#xff0c;二级索引…

电涌保护器:为现代生活筑起一道隐形防雷网

何为电涌保护器&#xff1f;电涌保护器&#xff08;Surge Protective Device&#xff0c;简称SPD&#xff09;主要用于控制信号系统&#xff0c;保护电气电子设备信号线路免受雷电电磁脉冲、感应过电压、操作过电压的影响&#xff0c;广泛应用于工控、消防、安防监控、交通、电…

【uniapp微信小程序】扫普通链接二维码打开小程序

需求&#xff1a;用户A保存自己的邀请码海报&#xff0c;用户B扫描该普通连接二维码&#xff0c;打开微信小程序&#xff0c;并且携带用户A的邀请码信息&#xff0c;用户B登录时&#xff0c;跟用户A关联&#xff0c;成为用户A的下级。 tips&#xff1a;保存海报到手机相册可以参…

LeetCode 378 - 有序矩阵中第 K 小的元素

文章目录摘要描述题解答案题解代码分析代码解析示例测试及结果输出结果时间复杂度空间复杂度总结摘要 在开发中&#xff0c;我们经常遇到需要处理大规模有序数据的场景&#xff0c;比如数据库分页、排行榜查询、或者处理排序过的矩阵。LeetCode 第 378 题“有序矩阵中第 K 小的…

【Lua】Windows 下编写 C 扩展模块:VS 编译与 Lua 调用全流程

▒ 目录 ▒&#x1f6eb; 导读需求环境1️⃣ 核心原理&#xff1a;Windows下Lua与C的交互逻辑2️⃣ Windows下编写步骤&#xff1a;以mymath模块为例2.1 步骤1&#xff1a;准备Windows开发环境方式1&#xff1a;官网下载Lua源码并编译&#xff08;可控性高&#xff09;方式2&am…

Python快速入门专业版(二十九):函数返回值:多返回值、None与函数嵌套调用

目录引一、多返回值&#xff1a;一次返回多个结果的优雅方式1. 多返回值的本质&#xff1a;隐式封装为元组示例1&#xff1a;返回多个值的函数及接收方式2. 多返回值的接收技巧技巧1&#xff1a;用下划线_忽略不需要的返回值技巧2&#xff1a;用*接收剩余值&#xff08;Python …

python使用pip安装的包与卸载

1&#xff1a;基本卸载命令 # 卸载单个包 pip uninstall package_name# 示例&#xff1a;卸载requests包 pip uninstall requests2&#xff1a;卸载多个包 # 一次性卸载多个包 pip uninstall package1 package2 package3# 示例 pip uninstall requests numpy pandas3&#xff1…

超级流水线和标量流水线的原理

一、什么是流水线&#xff1f;要理解这两个概念&#xff0c;首先要明白流水线&#xff08;Pipelining&#xff09; 的基本思想。想象一个汽车装配工厂&#xff1a;* 没有流水线&#xff1a;一个工人负责组装一整辆汽车&#xff0c;装完一辆再装下一辆。效率很低。* 有了流水线&…

【Ansible】管理复杂的Play和Playbook知识点

1.什么是主机模式&#xff1f;答&#xff1a;主机模式是Ansible中用于从Inventory中筛选目标主机的规则&#xff0c;通过灵活的模式定义可精准定位需要执行任务的主机。2.主机模式的作用答&#xff1a;筛选目标&#xff1a;从主机清单中选择一个或多个主机/组&#xff0c;作为P…

FastGPT源码解析 Agent 智能体应用创建流程和代码分析

FastGPT对话智能体创建流程和代码分析 平台作为agent平台&#xff0c;平台所有功能都是围绕Agent创建和使用为核心的。平台整合各种基础能力&#xff0c;如大模型、知识库、工作流、插件等模块&#xff0c;通过可视化&#xff0c;在界面上创建智能体&#xff0c;使用全部基础能…

缺失数据处理全指南:方法、案例与最佳实践

如何处理缺失数据&#xff1a;方法、案例与最佳实践 1. 引言 在数据分析和机器学习中&#xff0c;缺失数据是一个普遍存在的问题。如何处理缺失值&#xff0c;往往直接影响到后续分析和建模的效果。处理不当&#xff0c;不仅会浪费数据&#xff0c;还可能导致模型预测结果的不准…

为什么Cesium不使用vue或者react,而是 保留 Knockout

1. Knockout-ES5 插件的语法简化优势 自动深度监听&#xff1a;Cesium 通过集成 Knockout-ES5 插件&#xff0c;允许开发者直接使用普通变量语法&#xff08;如 viewModel.property newValue&#xff09;替代繁琐的 observable() 包装&#xff0c;无需手动声明每个可观察属性。…

Word怎么设置页码总页数不包含封面和目录页

有时候使用页码格式是[第x页/共x页]或[x/x]时会遇到word总页数和实际想要的页数不一致&#xff0c;导致显示不统一&#xff0c;这里介绍一个简单的办法&#xff0c;适用于比较简单的情况。 一、wps版本 文章分节 首先将目录页与正文页进行分节&#xff1a;在目录页后面选择插入…