java-codegen-from-db · diff
git:20260907.6966012 to git:20260907.7f64c1a
25 added, 14 removed. Audit A to A.
---
name: java-codegen-from-db
description: 从 MySQL/PostgreSQL/SQLite 数据库表反向生成 Spring Boot Java 工程代码(Entity/DAO/Service/Controller/Mapper)。当用户提到"生成 Java 代码"、"反向工程"、"按数据库建模"、"从表生成 Spring Boot"等需求,且能提供数据库连接信息或已有连接时使用。
when_to_use:
- 用户提供了数据库连接(host/port/user/pwd/database)并要求生成 Java 代码
- 用户已经通过 db_connect_test 建立了连接,提到具体表名要"生成代码"/"做反向工程"
- 用户提到 Spring Boot 项目"从数据库建模"或要求把表结构转成 Entity/Repository/Service
when_not_to_use:
- 用户只是想"看一下表结构" → 直接用 db_table_describe,不要走完整 skill
- 用户在做 Spring Boot 版本升级(2.x → 3.x)→ 使用 springboot-migration skill
- 用户在调试现有代码 → 不需要生成
---
# java-codegen-from-db
## 工作流总览
本 skill 把"从数据库表生成 Java 代码"拆为 **5 个显式阶段**,每个阶段调用具体的 MCP 工具,关键决策点会暂停让用户确认。**不允许跳步**——前一步的输出是后一步的输入。
```
[1] 预检查项目 → [2] schema 分析 → [3] 语义增强(可选)
↓
[5] 写盘 ← [4] 分层渲染(等待用户确认)
```
---
## 阶段 1: 预检查项目(必做)
**目的**: 在生成代码前确认目标 Spring Boot 项目结构合法、依赖大致齐全。否则生成出来也编译不过。
### 1.1 验证项目结构
调用 **`springboot_validate_project`**:
- 参数: `{ "check_dependencies": true, "create_missing_dirs": true, "template_category": "<用户选定的分类>" }`
- 期待返回中包含 `Project Structure: ✅ OK` 或 `✅ Project Root`
- 如果失败 → 告诉用户具体缺什么,**不要继续**
### 1.2 分析依赖健康度
调用 **`springboot_analyze_dependencies`**:
- 参数:
```json
{
"template_category": "<同上>",
"database_type": "mysql|postgresql|sqlite",
"include_swagger": true,
"include_lombok": true,
"include_mapstruct": true
}
```
- 返回中提取 `Missing Dependencies: N`:
- N == 0 → health = 100,继续
- N ≤ 2 → health = 80,继续但提醒用户
- N ≤ 5 → health = 60,**暂停让用户决定是否继续**
- N > 5 → health = 40,**强烈建议先修依赖**,问用户是否要看具体清单
### 1.3 渲染依赖健康仪表盘(MCP App)
如果客户端支持 MCP Apps(`_meta` 渲染),返回值中应附加:
```json
{
"_meta": {
"mcp-apps/component": "dashboard",
"mcp-apps/data": { "score": <health>, ... }
}
}
```
现阶段如未支持,用文本表格代替。
---
## 阶段 2: schema 分析(必做)
**目的**: 拿到目标表的列、主键、外键、索引,这是模板渲染的输入。
### 2.1 建立或复用连接
如果用户尚未连接:
- 调用 **`db_connect_test`** with `{host, port, username, password, database, database_type}`
- 拿到 `connection_id`,记住它,后续所有调用都要带
### 2.2 列出表名(可选)
当用户没指明表,先列出来让用户选:
- 调用 **`db_query_tables`** with `{connection_id, database}`
- 把表名列给用户,等用户选
### 2.3 描述目标表
对每张目标表:
- 调用 **`db_table_describe`** with `{connection_id, database, table, include_java_types: true}`
- 这一步会返回列定义 + 推断的 Java 类型
### 2.4 获取外键关系
- 调用 **`db_table_foreign_keys`** with `{connection_id, database, table}`
- 多张表时一起调,然后给用户渲染 ER 图(MCP App `mermaid` 组件)
### 2.5 渲染 ER 图(MCP App)
当用户选了 ≥ 2 张表,构造 Mermaid `erDiagram` 字符串,放进 `_meta["mcp-apps/source"]`。
---
- ## 阶段 3: 语义增强(推荐,Phase 4 工具可用后启用)
+ ## 阶段 3: 语义增强(推荐)
- > 当前 Phase 2 时这些工具尚未实现,跳过本阶段直接进 4。
+ 当前 MCP server 已提供阶段 3 的 AI 工具。它们默认使用本地规则,不依赖
+ `ANTHROPIC_API_KEY`;只有用户明确允许时才通过 `prefer_llm=true` 请求 Claude。
- **目的**: 让 LLM 推断"业务上合理的类名/字段名",而不是机械拼接表名。
+ **目的**: 让 LLM 推断"业务上合理的类名/字段名",并在生成前选择匹配的模板,而不是机械拼接表名。
- ### 3.1 推断业务命名(待实现)
+ ### 3.1 概述 schema(多表时推荐)
- - 调用 `ai_infer_business_names`(Phase 4 工具,详见 iteration-plan)
- - 例: `sys_user_role` → `UserRoleAssignment`(关系实体)
+ - 调用 `ai_summarize_schema`,传入阶段 2 收集的 `table_names`、`foreign_keys`,可选传入 `table_column_counts`。
+ - 向用户展示返回的 `narrative`、`modules`、`core_entities`、`relationships`,作为后续命名和模板推荐的共同上下文。
- ### 3.2 推荐模板(待实现)
+ ### 3.2 推断业务命名
- - 调用 `ai_recommend_template`
- - 例: 检测到 RBAC 模式 → 建议 `MybatisPlus-Mixed` 或 `sb35-java21`
+ - 调用 `ai_infer_business_names`,传入 `tables` 数组;每项至少包含 `name`,并尽量附上 `columns` 和 `foreign_keys`。
+ - 需要外部模型增强时才传 `prefer_llm: true`,否则使用规则结果;不要把数据库密码放入工具参数。
+ - 向用户展示每项返回的 `class_name`、`field_naming`、`table_kind`、`reason` 和 `confidence`。
+ - 例: `sys_user_role` → `UserRoleAssignment`(关系实体)。
- ### 3.3 用户确认点 ★
+ ### 3.3 推荐模板
- LLM **必须**把推断结果呈现给用户,等用户确认或修改,再进下一步。**禁止默认接受**。
+ - 调用 `ai_recommend_template`,传入整库 `table_names` 和可选 `foreign_keys`。
+ - 用户明确偏好 Java 21 / Spring Boot 3.x 时传 `hint_modern_stack: true`,否则让规则按 schema 模式推荐。
+ - 向用户展示 `recommended_template`、`options`、`matched_pattern`、`confidence` 和 `reasons`。
+ - 例: 检测到 RBAC 模式 → 建议 `MybatisPlus-Mixed`;现代栈偏好 → 建议 `sb35-java21`。
+ ### 3.4 用户确认点 ★
+
+ LLM **必须**把 schema 概述、命名推断和模板推荐呈现给用户,等用户确认或修改,再进下一步。**禁止默认接受**。
+
---
## 阶段 4: 分层代码生成(★ 用原子工具,而不是大工具)
**重要**: Phase 2.2 之后,我们用 7 个原子工具替代旧的 `db_codegen_generate`。**优先用原子工具**。
### 4.1 构建上下文
调用 **`codegen_build_context`**:
```json
{
"connection_id": "<...>",
"table_name": "<...>",
"database": "<...>",
"template_category": "Default | MybatisPlus | MybatisPlus-Mixed | sb35-java21",
"author": "<...>",
"package_name": "com.example.xxx",
"include_swagger": true,
"include_lombok": true,
"include_mapstruct": true,
"project_path": "test_project"
}
```
返回值: 完整的 `context` 对象(JSON,**不写盘**)。LLM 把这个对象作为后续 render 工具的输入。
### 4.2 分层渲染
按顺序对**每个层**调用对应工具,每次都传 `context`:
| 工具 | 渲染层 | 模板文件 |
|------|--------|----------|
| `codegen_render_entity` | 实体类 | entity.mustache |
| `codegen_render_dao` | DAO/Repository | dao.mustache |
| `codegen_render_service` | Service 接口 | service.mustache + serviceImpl.mustache |
| `codegen_render_controller` | REST Controller | controller.mustache |
| `codegen_render_mapper` | MyBatis XML | mapper.mustache(仅 MybatisPlus/Mixed) |
| `codegen_render_dto` | DTO(sb35-java21 record) | dto.mustache(可选) |
每次返回:
```json
{
"code": "<完整 Java 源码字符串>",
"file_path": "<相对路径,如 com/example/entity/SysUser.java>",
"_meta": {
"mcp-apps/component": "code-diff",
"mcp-apps/language": "java",
"mcp-apps/before": "<目标位置已存在文件的内容,无则 null>",
"mcp-apps/after": "<同 code>"
}
}
```
### 4.3 用户确认点 ★
渲染完所有层后,**先不要写盘**。让用户:
1. review 每个文件的内容(MCP App diff 渲染)
2. 修改 `context`(如包名、字段类型)
3. 重新调用对应的 `codegen_render_*`
确认无误后才进阶段 5。
### 4.4 兼容退路: 单体工具
如果某些环境只有旧版工具:
- 调用 **`db_codegen_generate`** (单次完成 2.1~4.4 + 写盘)
- 仅当用户明确要"一步到位"时使用,**默认走原子工具路径**
---
## 阶段 5: 写盘
### 5.1 调用写盘工具
> Phase 2.2 引入: 现阶段写盘逻辑在原子工具或 `db_codegen_generate` 内部。后续会拆出独立 `file_write_to_project` 工具。
### 5.2 渲染包结构树(MCP App)
写盘前/后用 `tree` 组件展示新生成文件的目录结构,让用户最后确认。
### 5.3 备份与回滚
如果目标文件已存在,生成 `*.codegen.bak` 备份,告诉用户怎么回滚(`mv x.bak x`)。
---
## 错误处理与重试规则
- **连接失败**: 不要无限重试,告诉用户检查 host/port/credentials
- **表不存在**: 调用 `db_query_table_exists` 二次确认,**不要假设**
- **依赖严重缺失** (health < 60): 暂停,问用户是否要看 `springboot_analyze_dependencies` 详细报告
- **写盘失败**: 报告具体 IO 错误,不要静默吞掉
- **模板渲染失败**: 检查 `template_context` 字段完整性(常见: `className`、`columns`、`primaryKeyType` 缺失)
## 工具调用清单速查
按调用顺序:
```
[预检] springboot_validate_project
springboot_analyze_dependencies
[schema] db_connect_test (若未连接)
db_query_tables (若未指定表)
db_table_describe (×N 张表)
db_table_foreign_keys (×N 张表)
- [语义] ai_infer_business_names (Phase 4 后启用)
- ai_recommend_template (Phase 4 后启用)
+ [语义] ai_summarize_schema (多表时推荐)
+ ai_infer_business_names (规则默认,可选 prefer_llm)
+ ai_recommend_template (按 schema 模式推荐)
[生成] codegen_build_context (×1 per 表)
codegen_render_entity (×1 per 表)
codegen_render_dao (×1 per 表)
codegen_render_service (×1 per 表)
codegen_render_controller (×1 per 表)
codegen_render_mapper (×1 per 表, 仅 MybatisPlus)
codegen_render_dto (×1 per 表, 仅 sb35-java21)
[写盘] (内置于上述工具,Phase 3 后拆出 file_write_to_project)
```
## 设计原则
1. **显式编排** > 黑盒自动: skill 把"做什么、按什么顺序、何时停"写死,LLM 不要自由发挥
2. **原子工具** > 大而全: 每个工具职责单一,返回值清晰
3. **用户决策点不可绕过**: 语义推断、模板选择、写盘三处必须 pause
4. **context 显式传递**: 工具间通过参数传 `context`,不依赖 server 内部状态
5. **失败要说人话**: 不要把堆栈直接糊给用户
## 与 iteration-plan 的对应
- 本 skill 实现 `iteration-plan/01-target-architecture.md` 第二章的工作流定义。Phase 2.2 拆分工具、Phase 4 引入 AI 工具后,本文件需同步更新阶段 3 和阶段 4。
+ 本 skill 实现 `iteration-plan/01-target-architecture.md` 第二章的工作流定义。工具契约变化时必须同步更新本文件,并由 Skill 契约测试校验关键工具仍可发现。