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