Java笔记-20、Web后端实战-部门管理-增删改查

news/2025/3/25 22:10:44/文章来源:https://www.cnblogs.com/subeipo/p/18792438

先查看页面原型明确需求,再根据接口文档开发。

部门查询基本实现

需求:不考虑分页展示;根据最后修改时间倒序排序。

mapper执行SQL语句。

Service调用mapper接口方法。

Controller接收请求,调用service层,响应结果。

controller定义一个方法,方法的返回值意味着给前端返回什么数据,Result。加注解@RequestMapping("/depts")。接下来调用service,由于service已经交给IOC容器管理,直接注入:面向接口编程,声明deptService接口,使用@AutoWired注入,然后在方法中调用接口方法。

对于@RequestMapping("/depts"),没有限定请求方式,应该加属性。@RequestMapping(value="/depts", method=RequestMethod.GET)

这样太麻烦,使用@GetMapping @DeleteMapping @Postmapping @PutMapping

结果封装

实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装。

如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装。

比如 LocalDateTime createTime 和数据库中的create_time,无法自动封装。mapper中从数据查询到后,时间数据并没有封装到实体类里。

解决方法一:手动结果映射

通过 @Results@Result 进行手动结果映射。

@Results({@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime")
})
@Select("select id, name ,create_time, update_time from dept order by update_time desc")
public List<Dept> findAll();

解决方法二:起别名

在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。

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

解决方法三:开启驼峰命名-推荐

如果字段名与属性名符合下划线-驼峰命名规则,mybatis会自动通过驼峰命名规则映射。

mybatis:configuration:map-underscore-to-camel-case: true

部门查询前后端联调

前端工程运行在前端服务器 NGINX

nginx部署完得到文件夹,有三个文件夹需要介绍:conf-nginx的配置;html-部署的前端项目;logs-nginx的运行日志。

后端项目开启,tomcat服务器运行,浏览器访问nginx所在ip:90,访问到nginx,那么nginx如何访问到tomcat服务器呢?

nginx反向代理-加中间层的又一次胜利

反向代理是一种网络架构,通过代理服务器为后端的服务器做代理,客户端的请求直接请求代理服务器,然后转发给后端的服务器。

安全、灵活、负载均衡。

反向代理的配置

nginx.conf

server {listen       90;server_name  localhost;client_max_body_size 10m;location / {root   html;index  index.html index.htm;try_files $uri $uri/ /index.html;}location ^~ /api/ {  // 匹配/api/开头的路径,匹配到了执行大括号里的规则rewrite ^/api/(.*)$ /$1 break; //将前面的路径重写为后面的路径 ^正则开始,$正则结束,.单个任意字符,*任意次数proxy_pass http://localhost:8080;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
  1. location:用于定义匹配路径匹配的规则。
  2. ^~ /api/:表示精确匹配,即只匹配以/api/开头的路径。
  3. rewrite:该指令用于重写匹配到的路径。
  4. proxy_pass:该指令用于代理转发,它将匹配到的请求转发给位于后端的指令服务器。

部门删除

controller接收参数

/depts?id=2

方式一

通过原始的 HttpServletRequest 对象获取请求参数。

@DeleteMapping("/depts")
public Result delete(HttpServLetRequest request){String idStr = request.getParameter("id");int id = Integer.parseInt(idStr);System.out.println("根据ID删除部门:"+ id);return Result.success();
}

方式二

通过Spring提供的 @RequestParam 注解,将请求参数绑定给方法形参。

@DeleteMapping("/depts")
public Result delete(@RequestParam("id") Integer deptId){System.out.println("根据ID删除部门:"+ deptId);return Result.success();
}

此时必须传递参数,否则会报错。原因在于注解的属性required = true,如果想改的话可设为false。不传递为null。

方式三:二的简化-推荐

如果请求参数名与形参变量名相同,直接定义方法形参即可接收。

@DeleteMapping("/depts")
public Result delete(Integer id){System.out.println("根据ID删除部门:"+ id);return Result.success();
}

新增部门

Controller接收请求参数和请求数据。

Service补全基础属性。

Controller接收JSON格式参数

JSON格式的参数,通常会使用一个实体对象进行接收。

规则:JSON数据的键名与方法形参对象的属性名相同,并需要使用@RequestBody注解标识。如下,这样接收到的JSON数据就会封装到dept这个对象中。

@PostMapping("/depts")
public Result add(@RequestBody Dept dept){System.out.println("添加部门:"+ dept);deptService.add(dept);return Result.success();
}

Mapper传递对象值

mapper在协sql语句传递对象值时,#{}里写的应该是对应的属性名。

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

修改部门

  1. 查询回显,根据ID查询,使用Restful风格
  2. 修改数据

Controller接收路径参数

/dept/1

路径参数:通过请求URL直接传递参数,使用{}来标识该路径参数,需要使用@PathVariable获取。

@GetMapping("/depts/{id}")
public Result getInfo(@PathVariable("id") Integer deptId){System.out.println("根据ID查询部门数据:"+ deptId);Dept dept = deptService.getInfo(deptId);return Result.success(dept);
}

简化方式,如果路径参数的参数名与方法形参名称一致,省略注解的value值。

@GetMapping("/depts/{id}")
public Result getInfo(@PathVariable Integer id){System.out.println("根据ID查询部门数据:"+ id);Dept dept = deptService.getInfo(id);return Result.success(dept);
}

同一类下路径的抽取

@RestController
public class DeptController {@Autowiredprivate DeptService deptService;@GetMapping("/depts")@DeleteMapping("/depts")@PostMapping("/depts")@GetMapping("/depts/{id}")@PutMapping("/depts")
}

统一抽取,一个完整的请求路径,应该是类上的@RequestMapping的value属性 + 方法上的@RequestMapping的value属性

@RequestMapping("/depts")
@RestController
public class DeptController {@Autowiredprivate DeptService deptService;@GetMapping@DeleteMapping@PostMapping@GetMapping("/{id}")@PutMapping
}

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

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

相关文章

20242321 2024-2025-2 《Python程序设计》实验一报告(修改版)

20242321 2024-2025-2 《Python程序设计》实验一报告(修改版) 课程:《Python程序设计》 班级: 2423 姓名:汤泽鹏 学号:20242321 实验教师:王志强 实验日期:2025年3月25日 必修/选修: 公选课 一、实验内容熟悉Python开发环境; 练习Python运行、调试技能;(编写书中的…

LCD1602 单片机上代码的实现和代码结构的分析

简单的实现了LCD1602显示屏的显示,主要关注代码结构的学习(对标内核代码驱动实现,代码的解耦)1、单片机引脚和设备引脚之间的通信 LCD1602使用并口与单片机进行通信,主要包括D0-D7 8个数据线和3根控制线(RS(指令和数据寄存器的区分),R/W(读写控制引脚),E(开始读写引脚,理…

矿用AI人员入侵本安型防爆摄像头

AI智能防爆摄像机可在诸如煤矿、井下等具有易燃易爆气体的高危环境中。矿井煤矿传输机,为了监测防止矿工误闯入,在运输线上方安装防爆AI智能预警摄像头,实时检测矿工闯入运输线识别报警,可以起到保护设备和矿工的安全。防爆AI智能预警摄像头采用煤矿用级别防爆外壳,摄像机…

openGl4

----向量章节---原文:如果一个向量的齐次坐标是0,这个坐标就是方向向量(Direction Vector),因为w坐标是0,这个向量就不能位移这段提供了一个区分方向向量和点坐标的方式,而且是逻辑上区分的。可以平移=点=w非0,w非0=可以平移=点原文提到了万向节死锁。是一种旋转导致轴重…

20242943 2024-2025-2 《网络攻防实践》实践四报告

一.实践内容在网络攻防实验环境中完成TCP/IP协议栈重点协议的攻击实验,包括ARP缓存欺骗攻击、ICMP重定向攻击、SYN Flood攻击、TCP RST攻击、TCP会话劫持攻击。 1.ARP缓存欺骗攻击 ARP缓存欺骗攻击利用了ARP协议缺乏身份验证的漏洞。攻击者通过在局域网内发送伪造的ARP响应消息…

使用PyCharm连接服务器并配置Python虚拟环境

使用PyCharm连接服务器并配置Python虚拟环境 以StrongSORT作为例子,用PyCharm打开StrongSORT项目1.打开idea设置,找到SSH配置2.添加配置并测试连接3.新建一个刚刚添加的服务器的终端4.新建一个StrongSORT项目文件夹 mkdir StrongSORT5.按照README文档创建虚拟环境 conda crea…

sd9

1、Knowledge Distillation in Iterative Generative Models for Improved Sampling Speed 提高采样速度2种方法:schedular优化、蒸馏 本论文基于DDIM,DDPM训练出来的epsilon theta 可以直接用于DDIM。由于DDIM的降噪过程是确定的,但是step多,由此定义了一个确定的教师分…

【昆工 25 考研调剂捡漏!计算机调剂名额近80+】

📣【昆工 25 考研调剂捡漏!计算机调剂名额近80+】📣 3月25日唐师兄更新 🔥计算机考生看过来!昆明理工大学信息工程与自动化学院调剂通道开启!名额多、方向全、全日制/非全均有岗,速进群锁定上岸席位! 🌟 重点调剂方向 🌟 ✅ 计算机应用技术(16人) ✅ 人工智能…

76. 最小覆盖子串(滑动窗口)

O(1)的字符频度匹配 设计一个 distance数组记录 s字串和 t的匹配程度。也就是每个字符频度的差 s[c] - t[c] = distance[c] t初始化distance中个字符的频度,如果s[c] 统计到一个,就在distance--,这样,当distance为0时,就代表这个字符完全匹配。 此外再创建一个count记录有…

在HTML页面通过JavaScript访问Ollama本地部署的DeepSeek

在HTML页面通过JavaScript访问Ollama本地部署的DeepSeek,顺便解决了 HTML 页面调用 Ollama 服务的跨域问题前排提醒: 1. 操作系统为Windows11 2. 如果你还没有使用Ollama本地部署DeepSeek,可以参考Windows系统上使用Ollama本地部署DeepSeek 3. 顺便解决了 HTML 页面调用 Oll…

【3】进制转换学习总结(c++)

1.进制的基础知识 一:进制是进位计数制,是人为定义的带进位的计数方法。对于任何一种进制,例如:X进制,就表示每一位置上的数运算时都是逢X进一位。比如十进制就是逢十进一,二进制就是逢二进一。 二:生活中常见的进制有:十进制,十二进制,二十四进制,六十进制等。 2.十…

vue+leaflet示例:地图截图批量导出(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…