版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。


# 代码
## 概述
修改代码架构, 使用Mapstruct和Lombok解决setter(),getter()以及查询结果到dto的转换
[Mapstruct文档](http://https://mapstruct.org/documentation/1.5/reference/html/#Preface "Mapstruct文档") [Lombok简单介绍](https://cloud.tencent.com/developer/article/1698734 "Lombok简单介绍")

结构如下:
![](https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=cbd4233d026d5dcec8fb9af76a18f6c5&file=file.png)

一个控制层可以依赖多个应用
一个应用层只有一个仓库和多个服务
仓库由一个或多个DAO组成
每一层的方法都需要描述输入输出信息

## 控制层
**总体代码**
控制层只存在将请求参数转换成命令和调用应用方法的代码, 如图
![](https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=fb89e896c791d7a581ddaebb64423786&file=file.png)
**注释**
在方法的注释中应该描述输入和输出的数据, 接口的功能

**输入输出**
控制层应该输入DTO输出DTO

**与应用的关系**
一个控制可以依赖多个应用

**输入校验**
不在dto上使用注释控制输入数据限制, 而是在值对象的构造方法中判断

## 应用层
**总体代码**
应用层只包含流程代码, 不应出现业务代码(具体逻辑,控制语句,循环语句)
具体的业务代码由服务层和实体完成
应用层应该明确职责, 如用户的增删查改与用户行为应该独立分为两个应用

**注释**
在方法的注释中描述输入和输出的数据, 接口的功能

**输入输出**
应用层接受命令类型输入,如:command,query,event, 输出DTO类型

**与仓库的关系**
一个应用使用一个仓库


## 服务层
**总体代码**
具体的业务逻辑,单个服务的功能应该要单一,如新增用户时对用户名的唯一校验需要一个服务, 可以使前后台共用一个服务校验

**与仓库的关系**
服务不允许依赖仓库, 通过方法传参的形式传入仓库调用仓库方法

**与其他服务的关系**
允许服务层之间相互依赖,

## 仓库层
**总体代码**
不应出现业务逻辑

**注释**
在方法的注释中应该描述输入和输出的数据, 接口的功能

**与DAO的关系**
依赖一个或多个DAO, 只依赖应用或服务需要用到的DAO
包括redis,mogodb等

## DAO层
**总体代码**
原来的mapper层前后台所使用的sql应该独立避免,逻辑混乱

**注释**
在方法的注释中应该描述输入和输出的数据, 接口的功能

## 目录结构
```
root
|
|____controler 控制层
|
|____types 类型
|    |
|    |____dto 请求或响应数据对象
|    |
|    |____cmd 命令出查询外的请求
|    |
|    |____query 查询请求
|    |
|    |____event 事件
|
|____exception 异常
|    |
|    |____handle 异常处理
|
|____application 应用层
|    |
|    |____assembler 转换层
|
|____domain 领域层
|    |
|    |____entity 实体
|    |
|    |____vo 值对象
|
|____facade 装饰层
|
|____service 服务层
|
|____repository 仓库层
     |
     |____convert 转换层
     |
     |____mapper/dao 接口层
     |
     |____do 数据对象
```

## 实体与仓库的创建
### 实体
区分实体与值对象的关键在于是否有状态
实体必须包含主键

主键接口
```
import java.io.Serializable;

public interface Id extends Serializable {
    long serialVersionUID = 1L;
}
```
实体接口
```
public interface Entity<id extends Id>{

    id getId();
}
```

### 仓库
仓库接口
```
// 其中的实体表示仓库属于哪个领域, 仓库能查询的字段应该被包含在实体内
public interface Repo<entity extends Entity<id>, id extends Id> {
    // 常用方法
    entity findById(id id);

    entity save(entity entity);
}
```

# SQL
所有列表SQL都需要倒序