一、目标
继续实现 删除部门、添加部门、根据 ID 查询部门 和 修改部门 的详细功能实现,分为 Controller 层、Service 层 和 Mapper 层。
二、代码分析
总体代码:
Controller 层:
package com.zhang.Controller;
@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {@Autowiredprivate DeptService deptService;@GetMappingpublic Result list() throws Exception {
// src/main/resources/dept.txtList<Dept> deptlist = deptService.list();return Result.success(deptlist);}@DeleteMappingpublic Result delete(Integer id){log.info("删除部门ID: " + id);deptService.delete(id);return Result.success();}@PostMappingpublic 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);}@PutMappingpublic 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 {@Autowiredprivate DeptMapper deptMapper;@Overridepublic List<Dept> list() throws Exception {return deptMapper.findAll();}@Overridepublic void delete(Integer id) {deptMapper.deleteById(id);}@Overridepublic void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.add(dept);}@Overridepublic Dept getById(Integer id) {Dept dept = deptMapper.getById(id);return dept;}@Overridepublic 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 的注解,标准且简洁实现了这几个功能。