# MyBatis-Plus持久层与数据库表结构一致性检测机制设计

## 一、检测目标

确保MyBatis-Plus持久层（Entity + Mapper + Mapper XML）与达梦数据库表结构保持一致，提前发现并规避因字段不匹配导致的运行时错误。

**应用场景**：
- 开发阶段：提前发现字段映射问题
- 上线前审计：生成完整的一致性报告

---

## 二、检测架构

```
┌─────────────────────────────────────────────────────┐
│           Schema Consistency Checker                │
├─────────────────────────────────────────────────────┤
│ 1. 元数据采集                                         │
│    ├─ DatabaseMetadataExtractor  (数据库表结构)      │
│    ├─ MapperMetadataExtractor    (Entity注解+XML)    │
│    └─ SqlFileParser             (SQL脚本)           │
├─────────────────────────────────────────────────────┤
│ 2. 一致性分析                                         │
│    ├─ TableComparator    (表级对比)                  │
│    └─ FieldComparator    (字段级对比)                │
├─────────────────────────────────────────────────────┤
│ 3. 报告生成                                           │
│    ├─ MarkdownReporter  (开发查看)                   │
│    └─ HtmlReporter      (团队分享)                   │
├─────────────────────────────────────────────────────┤
│ 4. 执行入口                                           │
│    └─ SchemaConsistencyMain  (main方法驱动)         │
└─────────────────────────────────────────────────────┘
```

---

## 三、检测维度

### 3.1 表结构检查
| 检查项 | 说明 | 严重程度 |
|--------|------|----------|
| 表是否存在 | Mapper对应的表在数据库中存在 | HIGH |
| 主键一致性 | @TableId与数据库主键定义一致 | HIGH |
| 表名匹配 | @TableName与实际表名一致 | MEDIUM |

### 3.2 字段检查
| 检查项 | 说明 | 严重程度 |
|--------|------|----------|
| 字段完整性 | Mapper字段全部在数据库中存在 | HIGH |
| 字段多余性 | 无数据库中已删除的废弃字段 | MEDIUM |
| 类型匹配 | Java类型 ↔ 达梦类型对应正确 | MEDIUM |
| 长度匹配 | VARCHAR/DECIMAL长度一致 | LOW |
| 可空性 | @TableField + 实际可空性一致 | LOW |

### 3.3 Mapper XML检查
| 检查项 | 说明 | 严重程度 |
|--------|------|----------|
| ResultMap完整性 | 所有字段有对应column定义 | MEDIUM |
| Base_Column_List | 包含所有非LOB字段 | LOW |
| SQL字段存在性 | SQL中的字段在表结构中存在 | HIGH |

---

## 四、技术实现

### 4.1 核心技术
- **数据库元数据提取**: 使用JDBC DatabaseMetaData API获取达梦表结构
- **Mapper元数据提取**: 使用MyBatis-Plus TableInfoHelper获取Entity注解 + SAX解析XML
- **类型映射**: 配置化Java类型与达梦数据库类型的对应关系
- **对比算法**: 基于反射和元数据的多维度差异检测

### 4.2 包结构
```
com.chinaweal.aiccs.dev.consistency/
├── SchemaConsistencyMain    # 入口类
├── config/                   # 配置管理
├── metadata/                 # 元数据提取器
│   ├── DatabaseMetadataExtractor
│   ├── MapperMetadataExtractor
│   └── model/               # 元数据模型
├── comparator/              # 一致性对比器
└── reporter/                # 报告生成器
```

---

## 五、使用方式

### 5.1 命令行运行

```bash
# 检查所有数据源
mvn exec:java -Dexec.mainClass="com.chinaweal.aiccs.dev.consistency.SchemaConsistencyMain"

# 检查指定数据源
mvn exec:java -Dexec.mainClass="..." -Dexec.args="--datasource=aiccs --output=html"
```

### 5.2 配置文件
- `consistency-check.yml`: 数据源配置、检查规则（忽略表、失败策略）
- `type-mapping.yml`: Java类型与达梦数据库类型映射关系

---

## 六、输出报告

支持多种报告格式：
- **Markdown**: 开发人员查看，包含差异详情和修复建议
- **HTML**: 团队分享和归档

### 报告内容结构
1. **摘要**: 一致表数量、差异表数量、严重错误统计
2. **差异详情**: 按表分组展示字段级差异（缺失、多余、类型不匹配、长度不一致等）
3. **修复建议**: 自动生成ALTER TABLE SQL语句

