java为什么要分为service层,dao层,controller层和Entity层等?

文章介绍了Java应用程序常见的分层架构,包括数据访问层(DAO)负责数据库交互,实体层(Entity)定义数据库对象的属性,服务层(Service)处理业务逻辑,以及控制层(Controller)控制业务流程。这种分层设计旨在实现模块化,解耦合,提高代码的可维护性和复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java中,通常将一个应用程序分为控制层(Controller)、服务层(Service)、实体Entity层和数据访问层(DAO)。这种分层结构的主要目的在于实现应用程序的模块化和解耦,便于团队协作和维护。

1.数据访问层(DAO):持久层,主要与数据库交互

DAO层首先会创建Dao接口,接着就可以在配置文件中定义该接口的实现类;接着就可以在模块中调用Dao的接口进行数据业务的处理,而不用关注此接口的具体实现类是哪一个类,它通过数据库驱动程序和JDBC连接到数据库,并编写SQL语句执行数据的读取和写入操作。Dao层的数据源和数据库连接的参数都是在配置文件中进行配置的。

举例:

package com.tigerhhzz.springcloud.dao;

import com.tigerhhzz.springcloud.entities.Payment;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper // 是ibatis下面的注解 //@Repositoty有时候会有问题
public interface PaymentDao {
  
  public int create(Payment payment);

  public Payment getPaymentById(@Param("id") Long id);

  /**
   * 查询指定行数据
   *
   * @param offset 查询起始位置
   * @param limit  查询条数
   * @return 对象列表
   */
  List<Payment> queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit);
}

2.Entity层:实体层,数据库在项目中的类

主要用于定义与数据库对象应的属性,提供get/set方法,tostring方法,有参无参构造函数。

举例:

package com.tigerhhzz.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//返回给前端的通用json数据串
@Data   //set/get方法
@AllArgsConstructor //有参构造器
@NoArgsConstructor  //无参构造器
public class CommonResult<T> {
  private Integer code;
  private String message;
  private T data; //泛型,对应类型的json数据

  //自定义两个参数的构造方法
  public CommonResult(Integer code, String message){
      this(code, message, null);
  }
}

3.服务层(Service):业务层 控制业务

业务模块的逻辑应用设计,和DAO层一样都是先设计接口,再创建要实现的类,然后在配置文件中进行配置其实现的关联。接下来就可以在service层调用接口进行业务逻辑应用的处理。

业务逻辑的处理,通常包括预处理、处理、后处理等几个阶段。服务层负责将来自控制层的请求参数传递给数据访问层,并对数据进行处理。服务层还可以处理事务和调用外部接口进行计算和数据处理。

好处:封装Service层的业务逻辑有利于业务逻辑的独立性和重复利用性。

举例:

package com.tigerhhzz.springcloud.service;


/**
 * @author tigerhhzz
 * @date 2022/6/15 9:16
 */
public interface PaymentService {
    String getPaymentInfo_OK(Integer id);

    String getPaymentInfo_Error(Integer id);


}

4.控制层(Controller):控制层 控制业务逻辑

具体的业务模块流程的控制,controller层主要调用Service层里面的接口控制具体的业务流程,控制的配置也要在配置文件中进行。

主要负责处理用户请求和响应。它接受来自前端的请求,并根据请求中的参数执行相应的服务层方法。控制层还可以处理异常信息和返回结果,一般会将结果返回给客户端。

举例:

package com.tigerhhzz.springcloud.controller;


import com.tigerhhzz.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author tigerhhzz
 * @date 2022/6/15 9:19
 */
@RestController
@Slf4j
public class PaymentController {

    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/hystrix/ok/{id}")
    public String getPaymentInfo_OK(@PathVariable("id") Integer id){
        String res = paymentService.getPaymentInfo_OK(id);
        return res;
    }
    @GetMapping("/payment/hystrix/error/{id}")
    public String getPaymentInfo_Error(@PathVariable("id") Integer id){
        String res = paymentService.getPaymentInfo_Error(id);
        return res;
    }


}

通过这种分层结构,可以使应用程序的不同层次之间的关注点分离开来。控制层负责处理请求和响应,服务层负责业务逻辑的处理,而数据访问层负责与数据库的交互。这种分层结构有助于团队协作、降低开发难度、提高代码复用性和维护性。

在这里插入图片描述

<< 在分架构(如Spring框架)中,`Service`、`Controller` `Entity` 分别承担了不同的职责。它们之间的协作关系非常清晰: 1. **Entity** 是数据模型,表示领域对象或数据库中的表结构。通常包含属性简单的getter/setter方法。 2. **Controller** 是控制,负责处理外部请求,并将这些请求转发给相应的服务进行业务逻辑操作。 3. **Service** 是业务逻辑,封装具体的业务规则逻辑,直接与 EntityDAO 数据访问交互。 以下是各之间如何互相调用的一个典型示例: ### 示例代码 ```java // 1. Entity Layer - 表示实体类 (例如用户) @Entity public class User { @Id private Long id; private String name; // getters and setters } // 2. Service Layer - 封装业务逻辑 @Service public class UserService { @Autowired private UserRepository userRepository; // 假设有一个UserRepository接口用于CRUD public List<User> getAllUsers() { return userRepository.findAll(); // 调用了DAO获取所有用户的列表 } public void addUser(User user) { userRepository.save(user); // 存储新用户到数据库 } } // 3. Controller Layer - 接收并响应HTTP请求 @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/") public ResponseEntity<List<User>> getAllUsers() { List<User> users = userService.getAllUsers(); return new ResponseEntity<>(users, HttpStatus.OK); } @PostMapping("/") public ResponseEntity<Void> createUser(@RequestBody User user) { userService.addUser(user); return new ResponseEntity<>(HttpStatus.CREATED); } } ``` --- ### 解释 #### 1. 控制器 (`Controller`) 调用服务 (`Service`) 当客户端发起 HTTP 请求时,控制器会拦截该请求并将参数传递给具体的服务方法。这使得 `Controller` 只专注于接收输入及返回结果,而复杂的业务逻辑则交由 `Service` 来完成。 #### 2. 服务 (`Service`) 使用实体 (`Entity`) `Service` 实现了主要的业务功能,并且可能会使用多个持久化对象(即 `Entity`)。通过依赖注入的方式引入相关的 DAO 操作工具后,在执行保存/查询等动作的同时也会自动映射为对应的实体类实例。 #### 3. 实体 (`Entity`) 的角色 作为核心的数据承载单元,`Entity` 并不主动参与其他两者的通信过程;而是被动地被创建修改删除以及加载展示出来供前端应用消费。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hhzz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值