💡 一则也许对你有用的小广告 🏆
欢迎飞飞程序员 ,你将获得:专属的实战项目(已更新的所有会员标识的项目都能学习) / 1v1 提问 / Java 学习路线 / PHP 学习路线 / 学习打卡 / 社群讨论
截止目前, 飞飞 正在疯狂爆肝实战项目,后续还会上新更多项目,目标是将所学知识开发成项目并且分享给大家,如知识付费系统, Ai系统, CMS系统,在线商城系统,等等 ,欢迎点击围观
DO Mapper Vo Controller Service 是Java后端分层架构,通常在Spring Boot项目中使用,旨在实现“高内聚、低耦合”,让代码职责分明,便于维护。
下面我将按照数据流向从下到上,或者从外到内为您分别介绍这几层。
1. DO (Data Object) - 数据对象
- 定义:通常与数据库表结构一一对应。它是持久化层的实体,数据库里有什么字段,DO里就有什么字段(或者基本对应)。
- 职责:单纯地承载数据,不包含业务逻辑。
- 例子:
2. Mapper (DAO层) - 数据访问层
- 定义:也叫DAO(Data Access Object)层。它是与数据库直接打交道的层。
- 职责:负责SQL的执行。它从数据库查询数据封装成DO,或者把DO保存进数据库。
例子:
3. VO (View Object) - 视图对象
- 定义:通常用于前端展示(View)。它是专门给前端接口返回的数据结构。
- 职责:隐藏敏感信息(如密码),或者对数据格式进行转换(如把日期格式化成字符串,把性别 1 转换成 "男")。
- 例子:
4. Service - 业务逻辑层
- 定义:核心业务逻辑层。它是整个系统的“大脑”。
- 职责:
- 处理复杂的业务规则(如计算、校验)。
- 协调多个 Mapper(比如转账需要同时操作两个账户)。
- 进行事务控制(Transaction)。
- 将 DO 转换为 VO。
- 例子:
- 用户注册功能:
- 检查用户名是否已存在(调用 Mapper)。
- 如果不存在,加密密码。
- 构建 UserDO 并保存(调用 Mapper)。
- 发送欢迎邮件。
@Service
public class UserService {
public void register(String name, String pwd) {
// 1. 校验逻辑
if (userMapper.selectByName(name) != null) {
throw new RuntimeException("用户已存在");
}
// 2. 业务逻辑:加密
String encryptedPwd = MD5Util.encrypt(pwd);
// 3. 组装 DO
UserDO user = new UserDO();
user.setUserName(name);
user.setPassword(encryptedPwd);
// 4. 持久化
userMapper.insert(user);
}
}
5. Controller - 控制层
- 定义:系统的入口,直接面对前端(浏览器/APP)。
- 职责:
- 接收HTTP请求,解析参数。
- 调用 Service 层处理业务。
- 将结果封装成统一的格式(如 JSON)返回给前端。
- 通常不写复杂的业务逻辑。
例子:
前端发起 POST /user/register 请求。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public Result register(@RequestBody UserRegisterReq req) {
// 调用 Service
userService.register(req.getName(), req.getPassword());
// 返回成功信息
return Result.success("注册成功");
}
}
一个完整的“用户查询”流程示例
为了让你更清晰地理解它们是如何协作的,我们来看一个“根据ID查询用户信息”的流程:
- 用户点击前端按钮,发起请求。
- Controller 接收到请求
GET /user/1。
- Controller 调用 Service 的
getUserById(1) 方法。
- Service 调用 Mapper 的
selectById(1) 方法。
- Mapper 执行 SQL
SELECT * FROM t_user WHERE id = 1,数据库返回数据。
- Mapper 将数据库记录封装成 DO (
UserDO) 返回给 Service。
- Service 拿到
UserDO,发现里面有密码字段,为了安全,它创建一个 VO (UserVO),把 UserDO 里的昵称和时间复制进去,丢弃密码。
- Service 将
UserVO 返回给 Controller。
- Controller 将
UserVO 包装成 JSON 格式返回给前端。
示例流程如下:
前端 <--> Controller <--> Service <--> Mapper <--> 数据库
(VO/DTO) (DO/VO) (DO)