Skip to main content
Glama
README.md
# MyBatis 字段名与数据库列名一致性检查工具

这是一个 MyBatis 配置验证工具,用于检查实体类(POJO)的字段名与数据库表的列名是否一致,以及相关的 MyBatis 配置是否正确。

## 功能特性

该工具提供以下 7 个 MCP 工具函数:

### 1. `check_entity_fields()`
检查实体类字段定义,列出所有字段名并检查与数据库列名的对应关系。

### 2. `check_result_maps()`
检查 Mapper XML 中的 resultMap 配置:
- resultMap 的 id 和 type 是否正确
- 每个 `<result>` 的 column 属性是否与 SQL 查询列名一致
- 每个 `<result>` 的 property 属性是否与实体类字段名一致
- 嵌套对象的字段映射是否正确

### 3. `check_mapper_annotations()`
检查 Mapper 接口中的 @Results 注解配置:
- @Results 数组中每个 @Result 的 column 和 property 是否正确
- @ResultMap 引用的 resultMap id 是否与 XML 中定义的完全一致

### 4. `check_sql_aliases()`
检查 SQL 语句中的列别名配置:
- 对于使用 resultType 的查询,SQL 语句中是否通过 AS 为列起别名
- 列别名是否与实体字段名匹配(考虑驼峰转换)

### 5. `check_join_queries()`
检查联合查询中的字段重复或歧义问题:
- 涉及多表关联的查询,是否存在同名字段
- 是否为重复列使用了唯一别名
- 在 resultMap 中是否正确映射

### 6. `check_type_handlers()`
检查特殊类型字段的类型处理器配置:
- 实体字段类型与数据库列类型不完全匹配的字段
- 是否配置了自定义 TypeHandler
- 检查全局配置、resultMap 和注解中的 typeHandler 属性

### 7. `generate_detailed_report()` ⭐
生成详细的 MyBatis 配置检查报告,**只显示发现的问题**,每个问题都以可直接使用的 prompt 格式呈现。

## 配置文件

在项目根目录创建 `config.json` 文件,配置以下路径:

```json
{
  "entity_paths": [
    "src/main/java/com/example/entity",
    "src/main/java/com/example/model"
  ],
  "mapper_paths": [
    "src/main/resources/mapper",
    "src/main/java/com/example/mapper"
  ],
  "sql_files": [
    "src/main/resources/sql/schema.sql",
    "src/main/resources/db/migration/V1__init.sql"
  ],
  "report_path": "reports/mybatis_check_report.txt"
}
```

### 配置说明

- **entity_paths**: 实体类(POJO)的目录路径或文件路径,支持多个路径
- **mapper_paths**: Mapper XML 文件和 Mapper 接口的目录路径,支持多个路径
- **sql_files**: 数据库建表 SQL 文件的路径,支持多个文件
- **report_path**: 报告输出路径(可选,默认为 `mybatis_check_report.txt`)

### 重要特性

✅ **递归扫描**: 工具会自动递归扫描配置目录中的所有子文件夹
✅ **多路径支持**: 支持配置多个 entity_paths、mapper_paths 和 sql_files
✅ **报告路径配置**: 可自定义报告输出路径,支持绝对路径和相对路径
✅ **自动创建目录**: 如果报告目录不存在,工具会自动创建

## 使用方式

### 作为 MCP 服务器运行

```bash
python main.py
```

工具会自动加载 `config.json` 配置,并启动 MCP 服务器。

### 独立模式运行(用于测试)

如果未安装 mcp 包,工具会以独立模式运行,输出 JSON 格式的检查结果。

### 生成检查报告

使用 `generate_detailed_report()` 函数生成详细报告:

```python
from main import generate_detailed_report

report = generate_detailed_report()
print(report)
```

报告会自动保存到配置的 `report_path` 路径。

## 检查报告格式

`generate_detailed_report()` 生成的报告**只包含发现的问题**,不显示正确的配置。报告包含以下部分:

### 1. 检查 Mapper XML 中的 resultMap
详细列出所有 resultMap 配置问题,每个问题都附带修复 prompt。

### 2. 检查 Mapper 接口中的 @Results 注解
检查注解配置问题,提供详细的修复指导。

### 3. 检查 SQL 语句中的列别名
验证列别名与实体字段的匹配情况。

### 4. 检查联合查询字段重复或歧义
识别多表关联查询中的潜在问题。

### 5. 检查特殊类型字段的类型处理器
标记需要自定义 TypeHandler 的复杂类型字段。

### 6. 检查总结
提供统计信息和整体评估。

## 问题级别

- **ERROR**: 严重问题,必须修复
- **WARNING**: 警告,建议尽快处理
- **INFO**: 信息提示,可能需要关注

## 示例输出

```
================================================================================
报告已保存到: D:\Workspace\project\reports\mybatis_check_report.txt

================================================================================
MyBatis 配置检查详细报告
================================================================================

【检查项 1】检查 Mapper XML 中的 resultMap
--------------------------------------------------------------------------------
检查内容:
  - resultMap 的 id 和 type 是否正确
  - 每个 <result> 的 column 属性是否与 SQL 查询列名一致
  - 每个 <result> 的 property 属性是否与实体类字段名一致
  - 嵌套对象的字段映射是否正确

发现 2 个问题:

  1. 问题级别: ERROR
     问题类型: RESULTMAP_PROPERTY
     问题描述: Property "deleteFlag" not found in entity Student
     位置: D:\Workspace\project\src\main\resources\mapper\student\StudentMapper.xml:BaseResultMap
     建议: 检查 Student 实体类是否存在 deleteFlag 字段,或修改 resultMap 中的 property 属性

  Prompt(用于修复此问题):
  --------------------------------------------------------------------------------
  请修复以下 MyBatis resultMap 配置问题:

  问题级别: ERROR
  问题类型: RESULTMAP_PROPERTY
  问题描述: Property "deleteFlag" not found in entity Student
  位置: D:\Workspace\project\src\main\resources\mapper\student\StudentMapper.xml:BaseResultMap
  建议: 检查 Student 实体类是否存在 deleteFlag 字段,或修改 resultMap 中的 property 属性

  请:
  1. 打开文件: D:\Workspace\project\src\main\resources\mapper\student\StudentMapper.xml:BaseResultMap
  2. 根据问题描述定位问题
  3. 检查 resultMap 的 type 属性是否正确指向实体类
  4. 检查每个 <result> 的 property 属性是否与实体类字段名完全一致(区分大小写)
  5. 检查每个 <result> 的 column 属性是否与 SQL 查询中的列名一致
  6. 提供修复后的代码

【检查项 2】检查 Mapper 接口中的 @Results 注解
--------------------------------------------------------------------------------
检查内容:
  - Mapper 接口方法上的 @Results 或 @ResultMap 注解
  - @Results 数组中每个 @Result 的 column 和 property 是否正确
  - @ResultMap 引用的 resultMap id 是否与 XML 中定义的完全一致

发现 4 个问题:
  ...

================================================================================
检查总结
================================================================================

实体类数量: 142
数据库表数量: 44
ResultMap 数量: 2
Mapper 方法数量: 15

问题统计:
  - 错误 (ERROR): 4
  - 警告 (WARNING): 0
  - 信息 (INFO): 56
  - 总计: 60

⚠️  发现严重问题,请优先处理错误级别的问题!

================================================================================
```

## 依赖项

- Python 3.7+
- mcp>=0.9.0(可选,用于 MCP 服务器模式)

## 安装依赖

```bash
pip install -r requirements.txt
```

## 注意事项

1. 确保配置的路径正确且可访问
2. SQL 文件中的表名和列名会被转换为小写进行匹配
3. 实体类字段名区分大小写
4. 工具会自动递归扫描目录中的所有相关文件
5. 报告只显示发现的问题,不显示正确的配置
6. 报告路径支持绝对路径和相对路径
7. 如果报告目录不存在,工具会自动创建

## 最佳实践

1. 在 CI/CD 流程中集成此工具,自动检查代码质量
2. 定期运行 `generate_detailed_report()` 生成详细报告
3. 优先处理 ERROR 级别的问题
4. 根据报告中的 prompt 指导进行修复
5. 配置多个路径以覆盖所有需要检查的模块
6. 使用绝对路径配置报告输出,便于集成到其他系统

## 常见问题

### Q: 如何检查多个模块的实体类?
A: 在 `entity_paths` 中配置多个路径即可:
```json
{
  "entity_paths": [
    "src/main/java/com/module1/entity",
    "src/main/java/com/module2/entity",
    "src/main/java/com/module3/entity"
  ]
}
```

### Q: 报告文件太大怎么办?
A: 报告只包含发现的问题,如果问题很多,可以:
1. 先修复 ERROR 级别的问题
2. 分模块检查,每个模块单独配置路径
3. 使用 grep 或其他工具过滤特定类型的问题

### Q: 如何忽略某些检查项?
A: 目前不支持忽略特定检查项,所有检查项都会执行。但可以只关注报告中的 ERROR 和 WARNING 级别问题。

## 许可证

MIT License