对三层架构的梳理(Controller、Service、Dao)

发布于:2025-02-11 ⋅ 阅读:(36) ⋅ 点赞:(0)

项目结构如下:

src
 ├── main
 │    └── java
 │         └── com
 │             └── example
 │                 └── demo
 │                     ├── controller
 │                     │    └── UserController.java
 │                     ├── model
 │                     │    └── User.java
 │                     ├── repository
 │                     │    └── UserRepository.java
 │                     ├── service
 │                     │    └── UserService.java
 │                     └── DemoApplication.java  // Spring Boot 启动类
 └── resources
      └── application.properties

Controller 层:

  • 请求接收与响应处理:Controller 层负责接收 HTTP 请求,并根据请求的内容(如 URL、请求方法、请求体等)决定调用哪个服务(通常是 Service 层)。它处理与外界的接口,返回 HTTP 响应(如 JSON 数据、错误信息等)。
  • 请求和响应的格式化:Controller 层通常会负责将请求体进行解析(如 JSON 转换为对象),将服务层返回的结果转换为 HTTP 响应(如 JSON 格式)。
  • 用户输入验证:Controller 层也可以承担部分简单的输入验证任务(如参数检查),不过复杂的验证逻辑一般会放在 Service 层或专门的验证模块中。
  • 中间件与认证:Controller 层处理一些与请求处理之前或之后的操作,如授权、日志记录、缓存处理等中间件功能。
package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private UserService userService;  // 注入 Service 层

    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);  // 调用 Service 层获取用户数据
    }
}

Service 层:

  • 业务逻辑处理:Service 层包含应用的核心业务逻辑,它处理请求的具体功能实现,如数据库查询、数据计算、验证、调用外部服务等。
  • 数据转换与业务规则:Service 层通常会根据请求参数做一些数据转换,或者根据具体的业务规则进行决策与处理。
  • 与 DAO 层交互:Service 层需要从 DAO 层获取数据,并根据业务需求进行处理。它封装了业务逻辑,不直接涉及数据持久化操作。
  • 事务控制:在需要进行多步骤操作或多个数据库交互时,Service 层通常负责管理事务,确保数据的一致性和完整性。
package com.example.demo.service;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;  // 注入 DAO 层

    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);  // 调用 DAO 层查询用户
    }
}

DAO 层(Data Access Object 层):

  • 与数据库交互:DAO 层直接与数据库进行交互,负责执行 CRUD 操作(创建、读取、更新、删除)。它将数据存储和检索的操作封装起来,使得 Service 层无需关心数据库的具体实现。
  • 持久化操作封装:DAO 层负责所有的数据库查询、插入、更新和删除操作,并将数据库的数据转换为应用程序所需的模型对象。
  • 数据库相关逻辑封装:DAO 层封装了数据库的访问细节和查询逻辑,包括构造 SQL 语句、执行查询、映射数据库结果到应用模型等。它通常使用 ORM(对象关系映射)库(如 Hibernate、GORM)或原生 SQL 来执行数据库操作。
package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // JpaRepository 提供了许多 CRUD 操作,默认的 findById 方法已实现
}

补充model层和数据库配置:

Model 层通常包含实体类,它们代表数据库中的表结构。在这个示例中,我们会创建一个简单的 User 实体类。

package com.example.demo.model;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity  // 表示这是一个 JPA 实体类
public class User {

    @Id  // 表示主键字段
    private Long id;
    private String name;
    private String email;

    // 构造方法、getter 和 setter 方法
    public User() {
    }

    public User(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

为了让 Spring Data JPA 工作,我们还需要一个数据库配置,通常通过 application.propertiesapplication.yml 文件来配置。

spring.datasource.url=jdbc:mysql://localhost:3306/demo_db
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

 


网站公告

今日签到

点亮在社区的每一天
去签到