REQ-010-1 完成内容: - 创建 6 个数据库表设计(datai_meta_org_config、datai_meta_task、datai_meta_job_execution、datai_meta_component、datai_meta_deploy_history、datai_meta_job_log) - 设计了合理的索引策略 - 对敏感字段进行了加密存储设计 - 表名前缀统一为 datai_meta_ - 所有表包含标准基础字段 REQ-010-2 完成内容: - 补充用户故事和细化验收标准 - 创建架构决策记录(MyBatis Plus 注解 + XML 映射文件混合方案) - 对比了 3 种备选方案 - 分析了决策对系统架构、开发流程、运维管理的影响 - 识别了技术风险、业务风险和实施风险 - 定义了回滚策略和验收标准 文档更新: - 创建 0010-database-table-design.md 架构决策记录 - 创建 0011-entity-mapper-create.md 架构决策记录 - 创建 0020-database-table-design-create.md 变更记录 - 创建 20260117-database-table-design-create.md 会话记录 - 创建 20260117-database-table-design-create-retro.md 复盘报告 - 创建 011-database-table-design-create.md 提示词文档 - 更新 REQ-010-2.md 需求文档 - 更新 docs/index.md 和 CHANGELOG.md
10 KiB
10 KiB
架构决策记录 (ADR) - 基础实体类和 Mapper 创建
背景
REQ-010-2 需求要求为 6 张数据库表创建对应的 Java 实体类、Mapper 接口和 XML 映射文件,使用 MyBatis Plus 框架,为后续功能开发提供数据访问基础。
6 张数据库表包括:
- datai_meta_org_config - Salesforce 组织配置表
- datai_meta_task - 元数据任务定义表
- datai_meta_job_execution - 作业执行记录表
- datai_meta_component - 元数据组件索引表
- datai_meta_deploy_history - 部署历史记录表
- datai_meta_job_log - 作业执行日志表
这些表结构已在 REQ-010-1 中完成设计和创建,现在需要创建对应的数据访问层代码。
约束条件:
- 必须使用 MyBatis Plus 框架
- 必须继承 BaseMapper 获取基础 CRUD 方法
- 必须使用 MyBatis Plus 注解(@TableName、@TableId、@TableField)
- 必须遵循项目编码规范
- 必须依赖于 REQ-010-1 创建的数据库表
面临的挑战:
- 如何处理 JSON 类型字段的序列化和反序列化
- 如何处理 TEXT 类型大字段
- 如何处理敏感字段的查询控制
- 如何确保代码符合项目编码规范
决策
采用 MyBatis Plus 注解 + XML 映射文件 的混合方案:
-
实体类设计:
- 使用 MyBatis Plus 注解(@TableName、@TableId、@TableField)进行表映射
- 使用 Lombok 简化实体类代码(@Data、@Builder、@NoArgsConstructor、@AllArgsConstructor)
- 使用 Jackson 的 @JsonSerialize 和 @JsonDeserialize 处理 JSON 类型字段
- 使用 String 类型处理 TEXT 类型大字段
- 使用 @TableField(select = false) 注解控制敏感字段默认不查询
- 添加必要的注释说明(类注释、字段注释)
-
Mapper 接口设计:
- 继承 BaseMapper 获取基础 CRUD 方法
- 使用 @Mapper 注解标记 Mapper 接口
- 根据需要添加自定义查询方法
-
Mapper XML 文件设计:
- 配置自定义查询方法的 SQL 映射
- namespace 配置为 Mapper 接口的全限定名
- resultType 配置为实体类的全限定名
- 添加必要的注释说明
备选方案
方案 1:MyBatis Plus 注解 + XML 映射文件(已选择)
优点:
- 结合了注解的简洁性和 XML 的灵活性
- 注解用于基础映射,XML 用于复杂查询
- 代码结构清晰,易于理解和维护
- 符合 MyBatis Plus 最佳实践
- 支持自定义查询方法,满足复杂业务需求
缺点:
- 需要维护 XML 映射文件
- 代码文件数量较多(实体类 + Mapper 接口 + XML 文件)
方案 2:纯 MyBatis Plus 注解(不使用 XML 映射文件)
优点:
- 代码文件数量较少(实体类 + Mapper 接口)
- 无需维护 XML 映射文件
- 代码更简洁,减少配置
缺点:
- 不支持复杂查询,需要使用 QueryWrapper 或 LambdaQueryWrapper
- QueryWrapper 代码可读性较差,难以维护
- 不支持动态 SQL(如 if、choose、foreach 等)
- 不满足 REQ-010-2 需求中关于 Mapper XML 文件的要求
方案 3:纯 MyBatis(不使用 MyBatis Plus)
优点:
- 完全控制 SQL 语句
- 支持复杂的查询和动态 SQL
- 代码可读性高
缺点:
- 需要手动编写基础 CRUD 方法,代码量大
- 不符合 REQ-010-2 需求中关于使用 MyBatis Plus 框架的约束
- 不符合项目现有技术栈
- 开发效率低,维护成本高
影响
对系统架构的影响
-
数据访问层架构:
- 建立了统一的数据访问层规范
- 使用 MyBatis Plus 作为统一的 ORM 框架
- 为后续功能开发提供了数据访问基础
-
代码结构:
- 实体类:
com.datai.salesforce.metadata.entity - Mapper 接口:
com.datai.salesforce.metadata.mapper - Mapper XML 文件:
resources/mapper
- 实体类:
-
技术栈一致性:
- 与现有项目技术栈保持一致
- 使用 MyBatis Plus 作为统一的 ORM 框架
- 使用 Lombok 简化代码
对开发流程的影响
-
开发效率:
- 使用 MyBatis Plus 的 BaseMapper,无需手动编写基础 CRUD 方法
- 使用 Lombok 简化实体类代码,减少样板代码
- 提高开发效率,减少开发时间
-
代码质量:
- 使用注解进行表映射,减少 XML 配置错误
- 使用 Jackson 处理 JSON 字段,确保数据一致性
- 使用 @TableField(select = false) 控制敏感字段查询,提高安全性
-
可维护性:
- 代码结构清晰,易于理解和维护
- 注释完整,便于后续开发人员理解
- 符合项目编码规范,便于代码审查
对运维管理的影响
-
性能优化:
- 使用 MyBatis Plus 的 BaseMapper,性能优于手动编写的 SQL
- 使用 Jackson 处理 JSON 字段,性能优于手动序列化
- 使用 @TableField(select = false) 控制敏感字段查询,减少不必要的数据传输
-
监控和调试:
- MyBatis Plus 提供了完善的日志功能,便于监控和调试
- XML 映射文件提供了清晰的 SQL 语句,便于性能优化
风险
技术风险
-
MyBatis Plus 版本兼容性风险:
- 风险描述:MyBatis Plus 版本升级可能导致注解或 API 变更
- 影响程度:中
- 应对措施:使用稳定的 MyBatis Plus 版本(3.5+),关注版本更新日志
-
Jackson 序列化和反序列化风险:
- 风险描述:JSON 字段结构变更可能导致序列化和反序列化失败
- 影响程度:中
- 应对措施:使用 Jackson 的容错机制,添加异常处理
-
Lombok 兼容性风险:
- 风险描述:Lombok 版本升级可能导致注解失效
- 影响程度:低
- 应对措施:使用稳定的 Lombok 版本,确保 IDE 支持
业务风险
-
敏感字段查询控制风险:
- 风险描述:敏感字段可能被误查询,导致数据泄露
- 影响程度:高
- 应对措施:使用 @TableField(select = false) 注解控制敏感字段默认不查询,需要时显式查询
-
JSON 字段数据丢失风险:
- 风险描述:JSON 字段序列化和反序列化失败可能导致数据丢失
- 影响程度:中
- 应对措施:使用 Jackson 的容错机制,添加异常处理和日志记录
实施风险
-
代码规范风险:
- 风险描述:代码不符合项目编码规范,导致代码审查失败
- 影响程度:中
- 应对措施:严格按照阿里巴巴 Java 开发规范编写代码,使用代码检查工具
-
Mapper XML 配置风险:
- 风险描述:Mapper XML 配置错误可能导致 SQL 执行失败
- 影响程度:中
- 应对措施:参考现有 Mapper XML 文件,编写单元测试验证
回滚策略
如果决策实施后出现问题,可以采取以下回滚策略:
-
实体类回滚:
- 删除实体类文件
- 重新创建实体类,使用纯 MyBatis 方式(不使用 MyBatis Plus 注解)
-
Mapper 接口回滚:
- 删除 Mapper 接口文件
- 重新创建 Mapper 接口,不继承 BaseMapper
- 手动编写基础 CRUD 方法
-
Mapper XML 文件回滚:
- 删除 Mapper XML 文件
- 重新创建 Mapper XML 文件,使用纯 MyBatis 方式
-
依赖回滚:
- 移除 MyBatis Plus 依赖
- 添加 MyBatis 依赖
- 更新 Spring Boot 配置
回滚步骤:
- 备份当前代码
- 删除实体类、Mapper 接口、Mapper XML 文件
- 重新创建实体类、Mapper 接口、Mapper XML 文件,使用纯 MyBatis 方式
- 更新项目依赖
- 编译和测试
验收标准
定义验证该决策有效性的具体标准和测试方法:
-
功能完整性:
- 6 个实体类创建成功,字段映射正确
- 6 个 Mapper 接口创建成功,继承 BaseMapper
- 6 个 Mapper XML 文件创建成功,配置正确
-
代码正确性:
- 实体类注解使用正确(@TableName、@TableId、@TableField)
- JSON 字段能够正确序列化和反序列化
- TEXT 类型大字段能够正确处理
- 敏感字段默认不查询(@TableField(select = false))
- Mapper XML 配置正确(namespace、resultType)
-
代码规范性:
- 代码符合阿里巴巴 Java 开发规范
- 代码有清晰的注释说明
- 代码结构清晰,易于理解和维护
-
框架兼容性:
- 代码与 MyBatis Plus 框架兼容
- 代码与 Lombok 兼容
- 代码与 Jackson 兼容
-
性能要求:
- 实体类序列化和反序列化耗时不超过 10ms
- Mapper 接口查询响应时间不超过 100ms
-
安全要求:
- 敏感字段(client_secret、password、security_token)默认不查询
- JSON 字段序列化和反序列化有异常处理
-
可用性要求:
- 实体类、Mapper 接口、Mapper XML 文件编译通过,无错误和警告
-
可维护性要求:
- 代码结构清晰,注释完整,易于理解和维护
测试方法:
- 编写单元测试,验证实体类、Mapper 接口、Mapper XML 文件的功能正确性
- 使用代码检查工具(如 Checkstyle、SonarQube)验证代码规范性
- 使用性能测试工具(如 JMeter)验证性能要求
- 使用安全测试工具(如 OWASP ZAP)验证安全要求
视觉锚点
Visual Reference
引用 Canvas 的具体节点或快照:
- Authentication.canvas - 项目架构视觉化展示
- 具体节点: 集成Mapper - 处理集成相关数据的持久化操作
Status
- Draft
- Accepted
- Superceded
参考资料
列出与该决策相关的参考资料,包括文档、文章或其他资源:
- REQ-010-2.md - 基础实体类和 Mapper 创建需求文档
- REQ-010-1.md - 数据库表结构设计和创建需求文档
- 0010-database-table-design.md - 数据库表结构设计和创建架构决策
- MyBatis Plus 官方文档 - MyBatis Plus 官方文档
- Lombok 官方文档 - Lombok 官方文档
- Jackson 官方文档 - Jackson 官方文档
- 阿里巴巴 Java 开发规范 - 阿里巴巴 Java 开发规范