Skip to content

SpringBoot分层架构开发 #38

Description

@ZhangAilan

springboot后端接口设计,从实体类型的定义到对外接口的实现

Image


📚 专业术语解释:

层级 名称 作用 常见术语/技术
1️⃣ Domain 层 实体层(Model) 定义与数据库表对应的实体类 @entity, JPA
2️⃣ Repository 层 数据访问层(DAO) 与数据库交互,做CRUD JpaRepository, @repository
3️⃣ Service 层 业务逻辑层 处理复杂业务逻辑、事务 @service, @transactional
4️⃣ Controller 层 表现层(Web 接口层) 接收前端请求并调用业务逻辑 @RestController, @RequestMapping

✅ 一、整体设计流程图

       ┌──────────────┐
       │  domain 层   │ ← 实体类(与数据库表一一对应)
       └────┬─────────┘
            ↓
       ┌──────────────┐
       │ repository 层│ ← 接口操作数据库(JPA)
       └────┬─────────┘
            ↓
       ┌──────────────┐
       │  service 层  │ ← 编写业务逻辑(可以事务控制)
       └────┬─────────┘
            ↓
       ┌──────────────┐
       │controller 层 │ ← 对外接口(前端访问用)
       └──────────────┘

✅ 二、各层作用及编写步骤

1️⃣ domain 层:实体类定义

  • 作用:定义数据库中的表结构映射。
  • 位置:com.example.xxx.domain
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long userId;

    private String userEmail;
    private String userPassword;
    private String userName;
    private Integer userFans;

    // Getter & Setter or @Data
}

☑ 实体类会自动映射为数据库表,字段即列。


2️⃣ repository 层:数据访问接口

  • 作用:提供基础的数据库 CRUD 操作。
  • 位置:com.example.xxx.repository
  • 通常继承 JpaRepository<T, ID>
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findUserByUserEmailAndUserPassword(String email, String password);
}

☑ Spring Data JPA 会自动根据方法名生成 SQL,无需自己写。


3️⃣ service 层:业务逻辑处理

  • 作用:封装业务逻辑,对外暴露服务。
  • 包含接口和实现类两个部分。
  • 位置:com.example.xxx.serviceservice.impl

接口:

public interface UserService {
    User userLogin(String email, String password);
    User userRegister(User user);
    Page<User> findHotUser(Integer page, Integer size);
}

实现类:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public User userLogin(String email, String password) {
        return userRepository.findUserByUserEmailAndUserPassword(email, password);
    }

    @Override
    @Transactional
    public User userRegister(User user) {
        return userRepository.save(user);
    }

    @Override
    public Page<User> findHotUser(Integer page, Integer size) {
        Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "userFans");
        return userRepository.findAll(pageable);
    }
}

☑ 可加事务注解 @Transactional,避免数据不一致问题。


4️⃣ controller 层:对外提供接口

  • 作用:定义前端访问的 HTTP 接口。
  • 位置:com.example.xxx.controller
@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody User user) {
        User result = userService.userLogin(user.getUserEmail(), user.getUserPassword());
        if (result != null) {
            return ResponseEntity.ok(result);
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("邮箱或密码错误");
        }
    }

    @PostMapping("/register")
    public ResponseEntity<?> register(@RequestBody User user) {
        return ResponseEntity.ok(userService.userRegister(user));
    }

    @GetMapping("/hot")
    public ResponseEntity<Page<User>> hotUsers(@RequestParam int page, @RequestParam int size) {
        return ResponseEntity.ok(userService.findHotUser(page, size));
    }
}

✅ 三、目录结构建议

src/main/java/com/example/_S_Hub_Backend/
├── controller/
│   └── UserController.java
├── service/
│   ├── UserService.java
│   └── impl/UserServiceImpl.java
├── repository/
│   └── UserRepository.java
├── domain/
│   └── User.java

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions