Controller (控制层,处理请求和响应) --> Service (服务层,业务逻辑) --> Repository (数据访问层,与数据库交互) --> DataBase (数据库层,MyBatis Ktorm Hibernate 等 ORM)
Domain (领域层,或 Model,数据库映射对象类,业务模型)
Dto (数据传输对象,在 Controller 响应时返回给客户端)
在 Spring Boot 和一般的分层架构中,通常会将应用程序的代码分为多个层次,以便于管理和维护
含义:控制层,负责处理 HTTP 请求和响应。
职责:
示例:
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<UserDto> getUserById(@PathVariable Long id) {
UserDto user = userService.getUserById(id);
return ResponseEntity.ok(user);
}
}
含义:服务层,包含业务逻辑。
职责:
示例:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public UserDto getUserById(Long id) {
User user = userRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("User not found"));
return new UserDto(user);
}
}
含义:数据访问层,负责与数据库进行交互。
职责:
示例:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
}
使用 MyBatis、Ktorm 的项目可以省略 Repository,直接在 Service 调用 Mapper
在一些应用中,Repository 和 DAO 的功能可能会重叠,特别是在简单的项目中,但在更复杂的系统中,它们的分离有助于提高可维护性和可测试性。
含义:领域层,定义业务模型。
职责:
示例:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
// Getter 和 Setter
}
含义:数据传输对象,专门用于在不同层之间传输数据。
职责:
示例:
public class UserDto {
private Long id;
private String username;
public UserDto(User user) {
this.id = user.getId();
this.username = user.getUsername();
}
// Getter 和 Setter
}