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

14 KiB
Raw Blame History

架构决策记录 - 基础实体类和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 的具体节点或快照:

Status

  • Draft
  • Accepted
  • Superceded

参考资料

列出与该决策相关的参考资料,包括文档、文章或其他资源: