一、目标
继续实现 删除部门、添加部门、根据 ID 查询部门 和 修改部门 的详细功能实现,分为 Controller 层、Service 层 和 Mapper 层。
二、代码分析
总体代码:
Controller 层:
package com.zhang.Controller;
@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping
public Result list() throws Exception {
// src/main/resources/dept.txt
List<Dept> deptlist = deptService.list();
return Result.success(deptlist);
}
@DeleteMapping
public Result delete(Integer id){
log.info("删除部门ID: " + id);
deptService.delete(id);
return Result.success();
}
@PostMapping
public Result add(@RequestBody Dept dept){
log.info("新增部门: " + dept);
deptService.add(dept);
return Result.success();
}
@GetMapping("{id}")
public Result getById(@PathVariable Integer id){
log.info("根据ID查询部门: " + id);
Dept dept = deptService.getById(id);
return Result.success(dept);
}
@PutMapping
public Result update(@RequestBody Dept dept){
log.info("更新部门: " + dept);
deptService.updata(dept);
return Result.success();
}
Service 层:
package com.zhang.Service.impl;
@Service
public class DeptServiceimpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public List<Dept> list() throws Exception {
return deptMapper.findAll();
}
@Override
public void delete(Integer id) {
deptMapper.deleteById(id);
}
@Override
public void add(Dept dept) {
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
deptMapper.add(dept);
}
@Override
public Dept getById(Integer id) {
Dept dept = deptMapper.getById(id);
return dept;
}
@Override
public void updata(Dept dept) {
dept.setUpdateTime(LocalDateTime.now());
deptMapper.update(dept);
}
}
Mapper 层:
package com.zhang.Mapper;
import com.zhang.pojo.Dept;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface DeptMapper {
@Select("select id, name, create_time, update_time from dept")
public List<Dept> findAll();
@Delete("delete from dept where id = #{id}")
void deleteById(Integer id);
@Insert("insert into dept (name, create_time, update_time) VALUES (#{name}, #
{createTime}, #{updateTime})")
void add(Dept dept);
@Select("select id, name, create_time, update_time from dept where id = #{id}")
Dept getById(Integer id);
@Update("update dept set name = #{name}, update_time = #{updateTime} where id = #{id}")
void update(Dept dept);
}
1. 删除部门
@DeleteMapping("/depts")
public Result delete(@RequestParam(name = "id") Integer _id){
System.out.println(_id);
return Result.success();
}
@Override
public void delete(Integer id) {
deptMapper.deleteById(id);
}
@Delete("delete from dept where id = #{id}")
void deleteById(Integer id);
功能描述:
- 通过 HTTP DELETE 请求,接收需要删除的部门 ID。
- Controller 层 接收 ID,调用 Service 层的
delete
方法。 - Service 层 调用 Mapper 层 执行 SQL 语句
DELETE FROM dept WHERE id = #{id}
,完成删除操作。 - 最终返回通用结果对象
Result.success()
作为响应。
注解解释:
@DeleteMapping
:- 指定此方法处理 HTTP DELETE 请求。
- 无需显式指定路径,默认映射到
/depts
(基于类上@RequestMapping("/depts")
的定义)。
log.info(...)
:- 使用 Lombok 提供的
@Slf4j
注解 打印日志,方便调试,记录当前删除的部门 ID。
- 使用 Lombok 提供的
Result.success()
:- 返回标准的 JSON 响应格式,表示操作成功。
@Delete
:- MyBatis 提供的注解,用于直接编写 SQL DELETE 语句。
- 其中
#{id}
表示使用 MyBatis 的参数占位符,自动将方法的参数绑定到 SQL 中的id
。
2. 添加部门
@PostMapping
public Result add(@RequestBody Dept dept) {
log.info("新增部门: " + dept);
deptService.add(dept);
return Result.success();
}
@Override
public void add(Dept dept) {
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
deptMapper.add(dept);
}
@Insert("insert into dept (name, create_time, update_time) VALUES (#{name}, #{createTime},
#{updateTime})")
void add(Dept dept);
功能描述:
- 通过 HTTP POST 请求,接收需要添加的部门数据(JSON 格式)。
- Controller 层 将 JSON 数据绑定到
Dept
对象,并调用 Service 层的add
方法。 - Service 层 设置
createTime
和updateTime
字段为当前时间,并调用 Mapper 层 执行插入操作。 - Mapper 层 执行 SQL 语句
INSERT INTO dept (...) VALUES (...)
,将新部门数据插入数据库。
注解解释:
@PostMapping
:- 指定此方法处理 HTTP POST 请求,通常用于新增数据。
@RequestBody
:- 表示从 HTTP 请求体中解析 JSON 数据,并自动绑定到方法参数
dept。
- 表示从 HTTP 请求体中解析 JSON 数据,并自动绑定到方法参数
- 日志记录:
- 打印新增部门信息,便于调试。
@Insert
:- MyBatis 提供的注解,用于执行 SQL INSERT 操作。
- 通过
#{name}
,#{createTime}
,#{updateTime}
将Dept
对象的字段动态绑定到 SQL 中。
3. 根据 ID 查询部门
@GetMapping("{id}")
public Result getById(@PathVariable Integer id) {
log.info("根据ID查询部门: " + id);
Dept dept = deptService.getById(id);
return Result.success(dept);
}
@Override
public Dept getById(Integer id) {
Dept dept = deptMapper.getById(id);
return dept;
}
@Select("select id, name, create_time, update_time from dept where id = #{id}")
Dept getById(Integer id);
功能描述:
- 通过 HTTP GET 请求,使用路径参数传递部门 ID。
- Controller 层 调用 Service 层的
getById
方法。 - Service 层 调用 Mapper 层 执行查询语句
SELECT ... FROM dept WHERE id = #{id}
。 - 将查询到的
Dept
对象封装到通用结果对象中返回给客户端。
注解解释:
@GetMapping("{id}")
:- 处理 HTTP GET 请求,并将 URL 中的路径参数绑定到方法参数。
@PathVariable
:- 将路径中的
id
部分自动绑定到id
参数。
- 将路径中的
@Select
:- MyBatis 提供的注解,用于执行 SQL SELECT 查询。
- 通过
#{id}
绑定方法参数,动态构建查询。
4. 修改部门
@PutMapping
public Result update(@RequestBody Dept dept) {
log.info("更新部门: " + dept);
deptService.updata(dept);
return Result.success();
}
@Override
public void updata(Dept dept) {
dept.setUpdateTime(LocalDateTime.now());
deptMapper.update(dept);
}
@Update("update dept set name = #{name}, update_time = #{updateTime} where id = #{id}")
void update(Dept dept);
功能描述:
- 通过 HTTP PUT 请求,接收需要更新的部门数据(JSON 格式)。
- Controller 层 调用 Service 层的
updata
方法。 - Service 层 更新部门的
updateTime
字段为当前时间,调用 Mapper 层 执行更新操作。 - Mapper 层 执行 SQL 语句
UPDATE dept SET ... WHERE id = #{id}
,完成数据库更新。
注解解释:
@PutMapping
:- 处理 HTTP PUT 请求,用于更新资源数据。
@RequestBody
:- 绑定 JSON 数据到方法参数
dept
。
- 绑定 JSON 数据到方法参数
@Update
:- MyBatis 提供的注解,用于执行 SQL UPDATE 操作。
- 动态绑定
Dept
对象的字段到 SQL 中,实现灵活的更新操作。
三、总结
通过以上功能实现,完善了 删除部门、添加部门、查询部门 和 修改部门 的完整流程。通过 Spring Boot 的分层架构(Controller、Service、Mapper)和 MyBatis 的注解,标准且简洁实现了这几个功能。