添加接口最终向数据库提交数据,根据界面原型结合表结构进行设计,先分析表中每个字段的数据来源,再分析接口传入参数内容,通常添加接口没有特殊要求可根据状态码判断是否添加成功。
1. Controller
层
Controller
层负责处理前端发送的请求,接收参数,并调用 Service
层的方法。
步骤:
- 定义一个处理添加请求的接口方法。通常使用
@PostMapping
注解来标识它是一个 POST 请求。 - 在方法参数中接收前端传递的 DTO 对象,使用
@RequestBody
注解来将 JSON 数据自动转换为 Java 对象。
示例:
@RestController
@RequestMapping("/api/v1/items")
public class ItemController {
@Autowired
private ItemService itemService;
@PostMapping("/batch")
@ApiOperation("*服务批量新增")
public void add(@RequestBody List<ItemDTO > itemDTOList) {
itemService.batchAdd(itemDTOList);
}
}
2. Service
层
Service
层负责业务逻辑的处理。这里通常会对输入的数据进行校验,然后调用 Mapper
层的方法来操作数据库。
步骤:
- 编写一个添加数据的方法。
- 在方法中首先对 DTO 对象进行校验,比如检查必填字段是否为空,数据格式是否正确等。
- 校验通过后,将 DTO 转换为对应的实体对象。
- 调用
Mapper
层的方法,将数据插入数据库中。
示例:
@Service
public class ItemService {
@Override
@Transactional
public void batchAdd(List<itemDTOList> itemDTOList) {
//1.校验服务项是否为启用状态,不是启用状态不能新增
//2.校验是否重复新增
//3.新增服务
baseMapper.insert(serve);
}
}
}
2.1 数据校验
一般校验两部分:(1)参数的数据的正确性,或者是否符合要求。
(2)校验是否重复新增。
2.2 异常处理
如果数据校验为不符合要求或重复新增,要抛出异常。
对于增、删、改类的接口通常会先进行入参校验,校验失败抛出异常,由异常处理器统一对异常进行处理。
异常处理怎么实现的:
mapper异常及service异常都抛给controller,controller方法的异常由异常处理器统一对异常进行处理。
我们抛出的异常是自定义异常类型,自定义的异常类型都继承了CommonException类型,在异常处理器中对此类型的异常进行处理。
通过@RestControllerAdvice注解加@ExceptionHandler注解实现,具体的原理是当controller抛出异常由DispatcherServlet统一拦截处理,再根据异常类型找到@ExceptionHandler标识方法去执行该方法进行异常处理。
2.3 事务管理
在 Service
层进行数据校验后,还需要考虑事务管理。可以使用 @Transactional
注解来保证整个添加操作的原子性,避免数据的不一致。
@Transactional
是 Java 中用于声明式事务管理的注解,通常用于 Spring 框架中。它的主要作用是在方法执行时,将所有涉及的数据库操作纳入到一个事务中。如果事务中的任何一步操作失败(例如抛出异常),事务将回滚,这意味着所有已经执行的数据库操作都将被撤销,以保证数据的一致性。
2.3.1 事务的概念:
-
事务是一个逻辑操作单元,包含一组数据库操作(例如插入、更新、删除等)。这些操作要么全部成功,要么全部失败。
-
事务的四个基本特性通常被称为 ACID(原子性、一致性、隔离性、持久性)。
2.3.2 @Transactional
的作用:
-
原子性:确保方法内的所有操作要么全部执行成功,要么在出现异常时全部回滚。
-
一致性:确保方法执行前后,数据库中的数据保持一致。
-
隔离性:不同事务之间相互隔离,避免并发问题。
-
持久性:事务成功提交后,数据持久存储在数据库中。
2.3.3 常见使用场景:
-
在 Service 层 方法上使用
@Transactional
,确保该方法中所有的数据库操作在一个事务中执行。 -
对于需要多步操作且每步操作依赖前一步结果的情况,非常适合使用事务管理。
3. Mapper
层
Mapper
层负责与数据库的直接交互。通过 MyBatis
、MyBatis-Plus
或者其他持久层框架,将数据插入到数据库表中。
5. 总结
5.1 controller
根据界面原型结合表结构进行设计,先分析表中每个字段的数据来源,再分析接口传入参数内容,然后定义controller接口,通常不需要返回数据,前端可根据状态码判断是否添加成功。
5.2 service
首先校验两部分:(1)参数的数据的正确性,或者是否符合要求;(2)校验是否重复新增。
如果数据校验为不符合要求或重复新增,要抛出异常。
校验通过,向数据库中添加数据。
如果涉及多个数据表的修改数据,需要在方法上添加@Transactional
注解,来保证数据的一致性。
5.3 mapper
将数据插入到数据库表中。