datai/docs/archive/decisions/adr/0011-entity-mapper-create.md

392 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 架构决策记录 - 基础实体类和Mapper创建
## 背景
在完成数据库表结构设计和创建REQ-010-1需要为9张数据库表创建对应的Java实体类、Mapper接口和XML映射文件使用MyBatis Plus框架为后续功能开发提供数据访问基础。
当前系统面临的主要问题包括:
1. 缺少Java实体类无法进行数据持久化操作
2. 缺少Mapper接口无法进行数据库查询和更新
3. 缺少XML映射文件无法配置SQL映射
4. 需要处理JSON类型字段的序列化和反序列化
5. 需要处理TEXT类型大字段
6. 需要保护敏感字段,避免泄露
## 决策
### 1. 实体类创建方案
**决策**: 使用MyBatis Plus注解创建实体类使用Lombok简化代码使用Jackson处理JSON字段。
**理由**:
- MyBatis Plus注解@TableName、@TableId、@TableField可以简化实体类配置
- Lombok可以简化实体类代码减少样板代码
- Jackson可以处理JSON类型字段的序列化和反序列化
- 使用String类型处理TEXT类型大字段简单可靠
- 使用@TableField(select = false)注解保护敏感字段,避免泄露
**实现方案**:
- 使用@TableName注解指定表名
- 使用@TableId注解标识主键类型为Long
- 使用@TableField注解处理字段映射
- 使用Lombok的@Data、@Builder、@NoArgsConstructor、@AllArgsConstructor注解简化代码
- 使用Jackson的@JsonSerialize和@JsonDeserialize处理JSON字段
- 使用String类型处理TEXT类型大字段
- 使用@TableField(select = false)注解保护敏感字段client_secret、password、security_token
- 添加必要的注释说明(类注释、字段注释)
- 代码符合阿里巴巴Java开发规范
### 2. Mapper接口创建方案
**决策**: 创建Mapper接口继承BaseMapper获取基础CRUD方法使用@Mapper注解标记Mapper接口。
**理由**:
- BaseMapper提供了基础的CRUD方法可以减少重复代码
- @Mapper注解标记Mapper接口便于MyBatis扫描和注册
- 根据需要添加自定义查询方法,满足业务需求
- 代码符合阿里巴巴Java开发规范
**实现方案**:
- 创建Mapper接口继承BaseMapper获取基础CRUD方法
- 使用@Mapper注解标记Mapper接口
- 根据需要添加自定义查询方法
- 添加必要的注释说明
- 代码符合阿里巴巴Java开发规范
### 3. Mapper XML文件创建方案
**决策**: 创建Mapper XML文件配置SQL映射使用MyBatis Plus的XML映射语法。
**理由**:
- XML映射文件可以配置复杂的SQL查询
- MyBatis Plus的XML映射语法简单易用
- namespace配置正确对应Mapper接口的全限定名
- resultType配置正确对应实体类的全限定名
- 添加必要的注释说明,提高代码可读性
- 代码符合MyBatis Plus XML映射语法
**实现方案**:
- 创建Mapper XML文件配置SQL映射
- namespace配置正确对应Mapper接口的全限定名
- resultType配置正确对应实体类的全限定名
- 添加必要的注释说明
- 代码符合MyBatis Plus XML映射语法
### 4. JSON字段处理方案
**决策**: 使用Jackson处理JSON类型字段的序列化和反序列化。
**理由**:
- Jackson是Java中常用的JSON处理库功能强大
- Jackson可以处理复杂的JSON数据结构
- Jackson的@JsonSerialize和@JsonDeserialize注解可以自定义序列化和反序列化逻辑
- Jackson的性能良好可以满足性能要求
**实现方案**:
- 使用Jackson的@JsonSerialize注解指定序列化器
- 使用Jackson的@JsonDeserialize注解指定反序列化器
- 自定义序列化器和反序列化器处理JSON字段的序列化和反序列化
- 使用String类型存储JSON字段使用Jackson进行序列化和反序列化
### 5. 大字段处理方案
**决策**: 使用String类型处理TEXT类型大字段。
**理由**:
- String类型可以存储TEXT类型大字段
- String类型简单易用不需要额外的处理
- String类型的性能良好可以满足性能要求
**实现方案**:
- 使用String类型处理TEXT类型大字段
- 使用@TableField注解处理字段映射
- 添加必要的注释说明
### 6. 敏感字段保护方案
**决策**: 使用@TableField(select = false)注解保护敏感字段,默认不查询。
**理由**:
- @TableField(select = false)注解可以保护敏感字段,默认不查询
- 避免敏感字段泄露,提高系统安全性
- 需要查询敏感字段时使用SQL查询指定字段
**实现方案**:
- 使用@TableField(select = false)注解保护敏感字段client_secret、password、security_token
- 默认不查询敏感字段
- 需要查询敏感字段时使用SQL查询指定字段
- 添加必要的注释说明
## 备选方案
### 1. 实体类创建备选方案
**备选方案 1**: 使用XML映射文件创建实体类
**优点**:
- XML映射文件可以配置复杂的字段映射
- XML映射文件可以处理特殊的字段类型
**缺点**:
- XML映射文件配置复杂维护成本高
- XML映射文件不如注解直观
- 不如MyBatis Plus注解简单易用
**备选方案 2**: 使用JPA注解创建实体类
**优点**:
- JPA是标准的ORM框架易于学习
**缺点**:
- JPA的性能不如MyBatis Plus
- JPA不如MyBatis Plus灵活
- 不如MyBatis Plus注解简单易用
### 2. Mapper接口创建备选方案
**备选方案 1**: 不继承BaseMapper手动实现CRUD方法
**优点**:
- 可以自定义CRUD方法满足特殊需求
**缺点**:
- 需要手动实现CRUD方法代码量大
- 不如BaseMapper简单易用
- 不如BaseMapper功能丰富
**备选方案 2**: 使用注解配置SQL查询
**优点**:
- 注解配置SQL查询简单直观
**缺点**:
- 注解配置SQL查询不如XML映射文件灵活
- 注解配置SQL查询不适合复杂的SQL查询
- 不如XML映射文件功能丰富
### 3. Mapper XML文件创建备选方案
**备选方案 1**: 不创建XML映射文件使用注解配置SQL查询
**优点**:
- 注解配置SQL查询简单直观
**缺点**:
- 注解配置SQL查询不如XML映射文件灵活
- 注解配置SQL查询不适合复杂的SQL查询
- 不如XML映射文件功能丰富
**备选方案 2**: 使用MyBatis Plus的Wrapper构建查询条件
**优点**:
- Wrapper构建查询条件简单易用
**缺点**:
- Wrapper构建查询条件不如XML映射文件灵活
- Wrapper构建查询条件不适合复杂的SQL查询
- 不如XML映射文件功能丰富
### 4. JSON字段处理备选方案
**备选方案 1**: 使用Gson处理JSON字段
**优点**:
- Gson是Google开发的JSON处理库性能良好
**缺点**:
- Gson的功能不如Jackson丰富
- Gson的注解不如Jackson灵活
- 不如Jackson流行
**备选方案 2**: 使用Fastjson处理JSON字段
**优点**:
- Fastjson是阿里巴巴开发的JSON处理库性能良好
**缺点**:
- Fastjson的安全性问题较多不如Jackson安全
- Fastjson的功能不如Jackson丰富
- 不如Jackson流行
### 5. 大字段处理备选方案
**备选方案 1**: 使用byte[]类型处理TEXT类型大字段
**优点**:
- byte[]类型可以存储二进制数据
**缺点**:
- byte[]类型不如String类型简单易用
- byte[]类型的性能不如String类型
- 不如String类型流行
**备选方案 2**: 使用Blob类型处理TEXT类型大字段
**优点**:
- Blob类型可以存储二进制数据
**缺点**:
- Blob类型不如String类型简单易用
- Blob类型的性能不如String类型
- 不如String类型流行
### 6. 敏感字段保护备选方案
**备选方案 1**: 使用加密算法加密敏感字段
**优点**:
- 加密算法可以保护敏感字段,提高系统安全性
**缺点**:
- 加密算法增加了系统复杂度
- 加密算法影响了系统性能
- 不如@TableField(select = false)注解简单易用
**备选方案 2**: 使用视图隐藏敏感字段
**优点**:
- 视图可以隐藏敏感字段,提高系统安全性
**缺点**:
- 视图增加了系统复杂度
- 视图影响了系统性能
- 不如@TableField(select = false)注解简单易用
## 影响
### 对系统架构的影响
- 新增9个实体类包括DataiMetaOrgConfig、DataiMetaTask、DataiMetaPackageItem、DataiMetaComponent、DataiMetaComponentVersion、DataiMetaJobExecution、DataiMetaDeployHistory、DataiMetaDeployComponentResult、DataiMetaJobLog
- 新增9个Mapper接口包括DataiMetaOrgConfigMapper、DataiMetaTaskMapper、DataiMetaPackageItemMapper、DataiMetaComponentMapper、DataiMetaComponentVersionMapper、DataiMetaJobExecutionMapper、DataiMetaDeployHistoryMapper、DataiMetaDeployComponentResultMapper、DataiMetaJobLogMapper
- 新增9个Mapper XML文件包括DataiMetaOrgConfigMapper.xml、DataiMetaTaskMapper.xml、DataiMetaPackageItemMapper.xml、DataiMetaComponentMapper.xml、DataiMetaComponentVersionMapper.xml、DataiMetaJobExecutionMapper.xml、DataiMetaDeployHistoryMapper.xml、DataiMetaDeployComponentResultMapper.xml、DataiMetaJobLogMapper.xml
### 对开发流程的影响
- 需要开发人员掌握MyBatis Plus框架包括实体类注解、Mapper接口、XML映射文件
- 需要开发人员掌握Lombok框架包括@Data、@Builder、@NoArgsConstructor、@AllArgsConstructor注解
- 需要开发人员掌握Jackson框架包括@JsonSerialize、@JsonDeserialize注解
- 需要开发人员编写单元测试验证实体类、Mapper接口、XML映射文件
### 对运维管理的影响
- 需要运维人员维护数据库表结构,确保表结构与实体类一致
- 需要运维人员监控数据库性能,确保查询性能满足要求
## 风险
### 技术风险
- **实体类映射风险**: 实体类字段映射错误可能导致数据读写失败
- **Mapper XML配置风险**: Mapper XML配置错误可能导致SQL执行失败
- **JSON字段处理风险**: JSON类型字段处理不当可能导致数据丢失
- **大字段处理风险**: 大字段处理不当可能导致性能问题
- **框架兼容风险**: MyBatis Plus版本兼容性问题
### 业务风险
- **数据一致性风险**: 实体类字段映射错误可能导致数据不一致
- **性能风险**: 大字段处理不当可能导致性能下降
### 实施风险
- **开发风险**: 实体类、Mapper接口、XML映射文件开发复杂可能影响开发进度
- **测试风险**: 实体类、Mapper接口、XML映射文件测试复杂可能影响测试进度
## 回滚策略
### 实体类创建回滚策略
- 如果实体类字段映射错误,可以修改实体类字段映射,重新编译
- 如果实体类字段映射影响业务功能,可以删除实体类,重新创建
### Mapper接口创建回滚策略
- 如果Mapper接口配置错误可以修改Mapper接口重新编译
- 如果Mapper接口影响业务功能可以删除Mapper接口重新创建
### Mapper XML文件创建回滚策略
- 如果Mapper XML配置错误可以修改Mapper XML重新编译
- 如果Mapper XML影响业务功能可以删除Mapper XML重新创建
### JSON字段处理回滚策略
- 如果JSON字段处理错误可以修改JSON字段处理逻辑重新编译
- 如果JSON字段影响业务功能可以删除JSON字段处理逻辑重新创建
### 大字段处理回滚策略
- 如果大字段处理错误,可以修改大字段处理逻辑,重新编译
- 如果大字段影响业务功能,可以删除大字段处理逻辑,重新创建
### 敏感字段保护回滚策略
- 如果敏感字段保护错误,可以修改敏感字段保护逻辑,重新编译
- 如果敏感字段保护影响业务功能,可以删除敏感字段保护逻辑,重新创建
## 验收标准
### 实体类创建验收标准
- 9个实体类创建成功
- 使用MyBatis Plus的@TableName注解指定表名
- 使用@TableId注解标识主键类型为Long
- 使用@TableField注解处理字段映射
- 实体类字段与数据库表字段一一对应
- 实体类处理JSON类型字段的序列化和反序列化使用Jackson的@JsonSerialize和@JsonDeserialize
- 实体类处理TEXT类型大字段使用String类型
- 实体类添加必要的注释说明(类注释、字段注释)
- 实体类使用Lombok简化代码@Data、@Builder、@NoArgsConstructor、@AllArgsConstructor
- 实体类代码符合阿里巴巴Java开发规范
### Mapper接口创建验收标准
- 9个Mapper接口创建成功
- Mapper接口继承BaseMapper获取基础CRUD方法
- Mapper接口使用@Mapper注解标记
- Mapper接口添加自定义查询方法如果需要
- Mapper接口代码符合阿里巴巴Java开发规范
### Mapper XML文件创建验收标准
- 9个Mapper XML文件创建成功
- XML映射文件namespace配置正确对应Mapper接口的全限定名
- XML映射文件resultType配置正确对应实体类的全限定名
- XML映射文件添加必要的注释说明
- XML映射文件代码符合MyBatis Plus XML映射语法
### 非功能验收标准
- 性能要求 - 实体类序列化和反序列化耗时不超过 10ms
- 性能要求 - Mapper接口查询响应时间不超过 100ms
- 安全要求 - 敏感字段client_secret、password、security_token使用@TableField(select = false)注解,默认不查询
- 可用性要求 - 实体类、Mapper接口、Mapper XML文件编译通过无错误和警告
- 可维护性要求 - 代码结构清晰,注释完整,易于理解和维护
## 视觉锚点
### Visual Reference
引用 Canvas 的具体节点或快照:
- [Authentication.canvas](../../Authentication.canvas) - 相关架构图
- **具体节点**: [集成Mapper](node_integration_mapper) - 处理集成相关数据的持久化操作
### Status
- [x] Draft
- [ ] Accepted
- [ ] Superceded
## 参考资料
列出与该决策相关的参考资料,包括文档、文章或其他资源:
- [REQ-010-2.md](../requirements/REQ-010-2.md) - 基础实体类和Mapper创建需求文档
- [REQ-010.md](../requirements/REQ-010.md) - Salesforce元数据拉取和部署主需求文档
- [REQ-010-1.md](../requirements/REQ-010-1.md) - 数据库表结构设计和创建
- [metadata-module.md](../reference-code/com/docs/metadata-module.md) - Salesforce Metadata API 模块说明(唯一真源)
- [index.md](../reference-code/com/docs/index.md) - Salesforce SOAP API Java 客户端参考文档(唯一真源)
- MyBatis Plus 文档 - https://baomidou.com/
- Lombok 文档 - https://projectlombok.org/
- Jackson 文档 - https://github.com/FasterXML/jackson