@rdmind/rdmind 0.0.9-alpha.1 → 0.0.9-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.knowledge/.ext/.bmad-core/agent-teams/team-all.yaml +15 -0
- package/.knowledge/.ext/.bmad-core/agent-teams/team-fullstack.yaml +19 -0
- package/.knowledge/.ext/.bmad-core/agent-teams/team-ide-minimal.yaml +11 -0
- package/.knowledge/.ext/.bmad-core/agent-teams/team-no-ui.yaml +14 -0
- package/.knowledge/.ext/.bmad-core/agents/analyst.md +84 -0
- package/.knowledge/.ext/.bmad-core/agents/architect.md +85 -0
- package/.knowledge/.ext/.bmad-core/agents/bmad-master.md +110 -0
- package/.knowledge/.ext/.bmad-core/agents/bmad-orchestrator.md +147 -0
- package/.knowledge/.ext/.bmad-core/agents/dev.md +81 -0
- package/.knowledge/.ext/.bmad-core/agents/pm.md +84 -0
- package/.knowledge/.ext/.bmad-core/agents/po.md +79 -0
- package/.knowledge/.ext/.bmad-core/agents/qa.md +90 -0
- package/.knowledge/.ext/.bmad-core/agents/ra.md +74 -0
- package/.knowledge/.ext/.bmad-core/agents/sm.md +65 -0
- package/.knowledge/.ext/.bmad-core/agents/ux-expert.md +69 -0
- package/.knowledge/.ext/.bmad-core/checklists/architect-checklist.md +440 -0
- package/.knowledge/.ext/.bmad-core/checklists/change-checklist.md +184 -0
- package/.knowledge/.ext/.bmad-core/checklists/pm-checklist.md +372 -0
- package/.knowledge/.ext/.bmad-core/checklists/po-master-checklist.md +434 -0
- package/.knowledge/.ext/.bmad-core/checklists/story-dod-checklist.md +96 -0
- package/.knowledge/.ext/.bmad-core/checklists/story-draft-checklist.md +155 -0
- package/.knowledge/.ext/.bmad-core/checklists/trd-checklist.md +226 -0
- package/.knowledge/.ext/.bmad-core/core-config.yaml +22 -0
- package/.knowledge/.ext/.bmad-core/data/bmad-kb.md +809 -0
- package/.knowledge/.ext/.bmad-core/data/brainstorming-techniques.md +38 -0
- package/.knowledge/.ext/.bmad-core/data/elicitation-methods.md +156 -0
- package/.knowledge/.ext/.bmad-core/data/technical-preferences.md +5 -0
- package/.knowledge/.ext/.bmad-core/data/test-levels-framework.md +148 -0
- package/.knowledge/.ext/.bmad-core/data/test-priorities-matrix.md +174 -0
- package/.knowledge/.ext/.bmad-core/enhanced-ide-development-workflow.md +248 -0
- package/.knowledge/.ext/.bmad-core/install-manifest.yaml +512 -0
- package/.knowledge/.ext/.bmad-core/tasks/advanced-elicitation.md +119 -0
- package/.knowledge/.ext/.bmad-core/tasks/analyze-prd.md +123 -0
- package/.knowledge/.ext/.bmad-core/tasks/apply-qa-fixes.md +150 -0
- package/.knowledge/.ext/.bmad-core/tasks/brownfield-create-epic.md +162 -0
- package/.knowledge/.ext/.bmad-core/tasks/brownfield-create-story.md +149 -0
- package/.knowledge/.ext/.bmad-core/tasks/correct-course.md +72 -0
- package/.knowledge/.ext/.bmad-core/tasks/create-brownfield-story.md +314 -0
- package/.knowledge/.ext/.bmad-core/tasks/create-deep-research-prompt.md +280 -0
- package/.knowledge/.ext/.bmad-core/tasks/create-doc.md +103 -0
- package/.knowledge/.ext/.bmad-core/tasks/create-next-story.md +114 -0
- package/.knowledge/.ext/.bmad-core/tasks/document-project.md +345 -0
- package/.knowledge/.ext/.bmad-core/tasks/execute-checklist.md +88 -0
- package/.knowledge/.ext/.bmad-core/tasks/facilitate-brainstorming-session.md +138 -0
- package/.knowledge/.ext/.bmad-core/tasks/generate-ai-frontend-prompt.md +53 -0
- package/.knowledge/.ext/.bmad-core/tasks/index-docs.md +175 -0
- package/.knowledge/.ext/.bmad-core/tasks/kb-mode-interaction.md +77 -0
- package/.knowledge/.ext/.bmad-core/tasks/nfr-assess.md +345 -0
- package/.knowledge/.ext/.bmad-core/tasks/qa-gate.md +163 -0
- package/.knowledge/.ext/.bmad-core/tasks/review-story.md +316 -0
- package/.knowledge/.ext/.bmad-core/tasks/risk-profile.md +355 -0
- package/.knowledge/.ext/.bmad-core/tasks/shard-doc.md +187 -0
- package/.knowledge/.ext/.bmad-core/tasks/test-design.md +176 -0
- package/.knowledge/.ext/.bmad-core/tasks/trace-requirements.md +266 -0
- package/.knowledge/.ext/.bmad-core/tasks/validate-next-story.md +136 -0
- package/.knowledge/.ext/.bmad-core/tasks/validate-trd.md +158 -0
- package/.knowledge/.ext/.bmad-core/templates/architecture-tmpl.yaml +651 -0
- package/.knowledge/.ext/.bmad-core/templates/brainstorming-output-tmpl.yaml +156 -0
- package/.knowledge/.ext/.bmad-core/templates/brownfield-architecture-tmpl.yaml +478 -0
- package/.knowledge/.ext/.bmad-core/templates/brownfield-prd-tmpl.yaml +281 -0
- package/.knowledge/.ext/.bmad-core/templates/competitor-analysis-tmpl.yaml +349 -0
- package/.knowledge/.ext/.bmad-core/templates/front-end-architecture-tmpl.yaml +273 -0
- package/.knowledge/.ext/.bmad-core/templates/front-end-spec-tmpl.yaml +360 -0
- package/.knowledge/.ext/.bmad-core/templates/fullstack-architecture-tmpl.yaml +947 -0
- package/.knowledge/.ext/.bmad-core/templates/market-research-tmpl.yaml +253 -0
- package/.knowledge/.ext/.bmad-core/templates/prd-tmpl.yaml +203 -0
- package/.knowledge/.ext/.bmad-core/templates/project-brief-tmpl.yaml +222 -0
- package/.knowledge/.ext/.bmad-core/templates/qa-gate-tmpl.yaml +103 -0
- package/.knowledge/.ext/.bmad-core/templates/story-tmpl.yaml +138 -0
- package/.knowledge/.ext/.bmad-core/templates/trd-tmpl.yaml +198 -0
- package/.knowledge/.ext/.bmad-core/user-guide.md +530 -0
- package/.knowledge/.ext/.bmad-core/utils/bmad-doc-template.md +327 -0
- package/.knowledge/.ext/.bmad-core/utils/workflow-management.md +71 -0
- package/.knowledge/.ext/.bmad-core/workflows/brownfield-fullstack.yaml +298 -0
- package/.knowledge/.ext/.bmad-core/workflows/brownfield-service.yaml +188 -0
- package/.knowledge/.ext/.bmad-core/workflows/brownfield-ui.yaml +198 -0
- package/.knowledge/.ext/.bmad-core/workflows/greenfield-fullstack.yaml +241 -0
- package/.knowledge/.ext/.bmad-core/workflows/greenfield-service.yaml +207 -0
- package/.knowledge/.ext/.bmad-core/workflows/greenfield-ui.yaml +236 -0
- package/.knowledge/.ext/.bmad-core/working-in-the-brownfield.md +606 -0
- package/.knowledge/.ext/coding/ddd-architecture.md +223 -0
- package/.knowledge/.ext/coding/java-standards.md +308 -0
- package/.knowledge/.ext/coding/mybatis-standards.md +407 -0
- package/.knowledge/.ext/coding/sql-standards.md +263 -0
- package/.knowledge/.ext/coding/thrift-service.md +292 -0
- package/.knowledge/BMAD.md +255 -0
- package/.knowledge/coding.md +135 -0
- package/dist/package.json +4 -3
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/ui/components/Tips.js +1 -1
- package/dist/src/ui/components/Tips.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js +2 -2
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
# MyBatis代码生成规范
|
|
2
|
+
|
|
3
|
+
## 文件位置规范
|
|
4
|
+
|
|
5
|
+
### 文件生成位置
|
|
6
|
+
|
|
7
|
+
- `{Entity}Mapper.xml` → `infrastructure/resources/mapper/`
|
|
8
|
+
- `{Entity}Mapper.java` → `infrastructure/mapper/`
|
|
9
|
+
- `{Entity}DO.java` → `infrastructure/model/`
|
|
10
|
+
|
|
11
|
+
### 目录结构示例
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
infrastructure/
|
|
15
|
+
├── src/
|
|
16
|
+
│ ├── main/
|
|
17
|
+
│ │ ├── java/
|
|
18
|
+
│ │ │ └── com/
|
|
19
|
+
│ │ │ └── xiaohongshu/
|
|
20
|
+
│ │ │ └── sns/
|
|
21
|
+
│ │ │ └── demo/
|
|
22
|
+
│ │ │ └── infrastructure/
|
|
23
|
+
│ │ │ ├── mapper/ ← Mapper.java
|
|
24
|
+
│ │ │ └── model/ ← DO.java
|
|
25
|
+
│ │ └── resources/
|
|
26
|
+
│ │ └── mapper/ ← Mapper.xml
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Mapper.java规范
|
|
32
|
+
|
|
33
|
+
### 强制要求
|
|
34
|
+
|
|
35
|
+
1. **注解标注**:必须使用 `@Mapper` 和 `@Repository` 注解
|
|
36
|
+
2. **方法命名**:使用业务语义命名,如 `findBy{Field}`、`selectBy{Field}`
|
|
37
|
+
3. **参数类型**:使用DO对象或基本类型,避免使用Map等不明确类型
|
|
38
|
+
|
|
39
|
+
### 代码示例
|
|
40
|
+
|
|
41
|
+
```java
|
|
42
|
+
@Mapper
|
|
43
|
+
@Repository
|
|
44
|
+
public interface CircleMapper {
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 根据ID查询圈子
|
|
48
|
+
*/
|
|
49
|
+
CircleDO findById(Long id);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 根据名称查询圈子
|
|
53
|
+
*/
|
|
54
|
+
CircleDO findByName(String name);
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 根据状态查询圈子列表
|
|
58
|
+
*/
|
|
59
|
+
List<CircleDO> findByStatus(Integer status);
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 插入圈子
|
|
63
|
+
*/
|
|
64
|
+
int insert(CircleDO circle);
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 更新圈子
|
|
68
|
+
*/
|
|
69
|
+
int updateById(CircleDO circle);
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* 根据ID删除圈子
|
|
73
|
+
*/
|
|
74
|
+
int deleteById(Long id);
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 统计圈子数量
|
|
78
|
+
*/
|
|
79
|
+
int count();
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 根据状态统计圈子数量
|
|
83
|
+
*/
|
|
84
|
+
int countByStatus(Integer status);
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 方法命名规范
|
|
89
|
+
|
|
90
|
+
- **基础CRUD**:`findById`、`insert`、`updateById`、`deleteById`
|
|
91
|
+
- **业务查询**:`findBy{Field}`、`findBy{Field}And{Field}`、`findBy{Field}Like`
|
|
92
|
+
- **分页查询**:`findBy{Field}AndPage`、`findByPage`
|
|
93
|
+
- **统计查询**:`count`、`countBy{Field}`、`existsBy{Field}`
|
|
94
|
+
- **批量操作**:`findBy{Field}s`、`deleteBy{Field}s`
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Mapper.xml规范
|
|
99
|
+
|
|
100
|
+
### 强制要求
|
|
101
|
+
|
|
102
|
+
1. **结果映射**:定义 `BaseResultMap` 覆盖全量字段,显式指定 `jdbcType`
|
|
103
|
+
2. **字段列表**:定义 `Base_Column_List`,查询通过 `<include refid="Base_Column_List"/>` 引用
|
|
104
|
+
3. **插入操作**:使用 `useGeneratedKeys="true" keyProperty="id"`
|
|
105
|
+
4. **查询条件**:使用 `<where>` + `<if>` 构造条件,防止全表扫描
|
|
106
|
+
5. **禁用`select *`**:必须显式引用字段列表
|
|
107
|
+
|
|
108
|
+
### 代码示例
|
|
109
|
+
|
|
110
|
+
```xml
|
|
111
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
112
|
+
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
|
113
|
+
<mapper namespace="com.xiaohongshu.sns.demo.infrastructure.mapper.CircleMapper">
|
|
114
|
+
|
|
115
|
+
<!-- 结果映射 -->
|
|
116
|
+
<resultMap id="BaseResultMap" type="com.xiaohongshu.sns.demo.infrastructure.model.CircleDO">
|
|
117
|
+
<id column="id" jdbcType="BIGINT" property="id"/>
|
|
118
|
+
<result column="name" jdbcType="VARCHAR" property="name"/>
|
|
119
|
+
<result column="description" jdbcType="VARCHAR" property="description"/>
|
|
120
|
+
<result column="status" jdbcType="TINYINT" property="status"/>
|
|
121
|
+
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
|
|
122
|
+
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
|
|
123
|
+
</resultMap>
|
|
124
|
+
|
|
125
|
+
<!-- 字段列表 -->
|
|
126
|
+
<sql id="Base_Column_List">
|
|
127
|
+
id, name, description, status, create_time, update_time
|
|
128
|
+
</sql>
|
|
129
|
+
|
|
130
|
+
<!-- 根据ID查询 -->
|
|
131
|
+
<select id="findById" parameterType="java.lang.Long" resultMap="BaseResultMap">
|
|
132
|
+
SELECT
|
|
133
|
+
<include refid="Base_Column_List"/>
|
|
134
|
+
FROM circle
|
|
135
|
+
WHERE id = #{id,jdbcType=BIGINT}
|
|
136
|
+
</select>
|
|
137
|
+
|
|
138
|
+
<!-- 根据名称查询 -->
|
|
139
|
+
<select id="findByName" parameterType="java.lang.String" resultMap="BaseResultMap">
|
|
140
|
+
SELECT
|
|
141
|
+
<include refid="Base_Column_List"/>
|
|
142
|
+
FROM circle
|
|
143
|
+
WHERE name = #{name,jdbcType=VARCHAR}
|
|
144
|
+
</select>
|
|
145
|
+
|
|
146
|
+
<!-- 根据状态查询列表 -->
|
|
147
|
+
<select id="findByStatus" parameterType="java.lang.Integer" resultMap="BaseResultMap">
|
|
148
|
+
SELECT
|
|
149
|
+
<include refid="Base_Column_List"/>
|
|
150
|
+
FROM circle
|
|
151
|
+
WHERE status = #{status,jdbcType=TINYINT}
|
|
152
|
+
</select>
|
|
153
|
+
|
|
154
|
+
<!-- 插入 -->
|
|
155
|
+
<insert id="insert" parameterType="com.xiaohongshu.sns.demo.infrastructure.model.CircleDO" useGeneratedKeys="true" keyProperty="id">
|
|
156
|
+
INSERT INTO circle (name, description, status, create_time, update_time)
|
|
157
|
+
VALUES (#{name,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{status,jdbcType=TINYINT},
|
|
158
|
+
#{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})
|
|
159
|
+
</insert>
|
|
160
|
+
|
|
161
|
+
<!-- 更新 -->
|
|
162
|
+
<update id="updateById" parameterType="com.xiaohongshu.sns.demo.infrastructure.model.CircleDO">
|
|
163
|
+
UPDATE circle
|
|
164
|
+
<set>
|
|
165
|
+
<if test="name != null">
|
|
166
|
+
name = #{name,jdbcType=VARCHAR},
|
|
167
|
+
</if>
|
|
168
|
+
<if test="description != null">
|
|
169
|
+
description = #{description,jdbcType=VARCHAR},
|
|
170
|
+
</if>
|
|
171
|
+
<if test="status != null">
|
|
172
|
+
status = #{status,jdbcType=TINYINT},
|
|
173
|
+
</if>
|
|
174
|
+
update_time = #{updateTime,jdbcType=TIMESTAMP}
|
|
175
|
+
</set>
|
|
176
|
+
WHERE id = #{id,jdbcType=BIGINT}
|
|
177
|
+
</update>
|
|
178
|
+
|
|
179
|
+
<!-- 删除 -->
|
|
180
|
+
<delete id="deleteById" parameterType="java.lang.Long">
|
|
181
|
+
DELETE FROM circle
|
|
182
|
+
WHERE id = #{id,jdbcType=BIGINT}
|
|
183
|
+
</delete>
|
|
184
|
+
|
|
185
|
+
<!-- 统计数量 -->
|
|
186
|
+
<select id="count" resultType="java.lang.Integer">
|
|
187
|
+
SELECT COUNT(1) FROM circle
|
|
188
|
+
</select>
|
|
189
|
+
|
|
190
|
+
<!-- 根据状态统计数量 -->
|
|
191
|
+
<select id="countByStatus" parameterType="java.lang.Integer" resultType="java.lang.Integer">
|
|
192
|
+
SELECT COUNT(1) FROM circle
|
|
193
|
+
WHERE status = #{status,jdbcType=TINYINT}
|
|
194
|
+
</select>
|
|
195
|
+
|
|
196
|
+
</mapper>
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 关键规范说明
|
|
200
|
+
|
|
201
|
+
#### 结果映射规范
|
|
202
|
+
|
|
203
|
+
- 必须定义 `BaseResultMap` 覆盖全量字段
|
|
204
|
+
- 显式指定 `jdbcType` 和 `property`
|
|
205
|
+
- 主键使用 `<id>` 标签,其他字段使用 `<result>` 标签
|
|
206
|
+
|
|
207
|
+
#### 字段列表规范
|
|
208
|
+
|
|
209
|
+
- 定义 `Base_Column_List` 包含所有字段
|
|
210
|
+
- 查询时通过 `<include refid="Base_Column_List"/>` 引用
|
|
211
|
+
- 禁止使用 `SELECT *`
|
|
212
|
+
|
|
213
|
+
#### 插入操作规范
|
|
214
|
+
|
|
215
|
+
- 使用 `useGeneratedKeys="true" keyProperty="id"`
|
|
216
|
+
- 显式指定字段列表
|
|
217
|
+
- 为每个参数指定 `jdbcType`
|
|
218
|
+
|
|
219
|
+
#### 更新操作规范
|
|
220
|
+
|
|
221
|
+
- 使用 `<set>` 和 `<if>` 构造动态更新
|
|
222
|
+
- 自动更新 `update_time` 字段
|
|
223
|
+
- 避免更新空值
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## DO规范
|
|
228
|
+
|
|
229
|
+
### 强制要求
|
|
230
|
+
|
|
231
|
+
1. **字段对应**:字段与表结构严格对应
|
|
232
|
+
2. **中文注释**:必须带中文注释,来源于表字段注释
|
|
233
|
+
3. **Lombok注解**:必须使用 `@Data`、`@AllArgsConstructor`、`@NoArgsConstructor`
|
|
234
|
+
|
|
235
|
+
### 代码示例
|
|
236
|
+
|
|
237
|
+
```java
|
|
238
|
+
package com.xiaohongshu.sns.demo.infrastructure.model;
|
|
239
|
+
|
|
240
|
+
import lombok.AllArgsConstructor;
|
|
241
|
+
import lombok.Data;
|
|
242
|
+
import lombok.NoArgsConstructor;
|
|
243
|
+
import java.time.LocalDateTime;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* 圈子数据对象
|
|
247
|
+
*/
|
|
248
|
+
@Data
|
|
249
|
+
@AllArgsConstructor
|
|
250
|
+
@NoArgsConstructor
|
|
251
|
+
public class CircleDO {
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* 主键ID
|
|
255
|
+
*/
|
|
256
|
+
private Long id;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* 圈子名称
|
|
260
|
+
*/
|
|
261
|
+
private String name;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* 圈子描述
|
|
265
|
+
*/
|
|
266
|
+
private String description;
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* 圈子状态:0-禁用,1-启用
|
|
270
|
+
*/
|
|
271
|
+
private Integer status;
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* 创建时间
|
|
275
|
+
*/
|
|
276
|
+
private LocalDateTime createTime;
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* 更新时间
|
|
280
|
+
*/
|
|
281
|
+
private LocalDateTime updateTime;
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### 字段类型映射
|
|
286
|
+
|
|
287
|
+
| 数据库类型 | Java类型 | 说明 |
|
|
288
|
+
| ------------ | --------------- | -------------- |
|
|
289
|
+
| **BIGINT** | `Long` | 主键ID、外键ID |
|
|
290
|
+
| **VARCHAR** | `String` | 字符串字段 |
|
|
291
|
+
| **TEXT** | `String` | 长文本字段 |
|
|
292
|
+
| **TINYINT** | `Integer` | 状态字段 |
|
|
293
|
+
| **INT** | `Integer` | 整数字段 |
|
|
294
|
+
| **DECIMAL** | `BigDecimal` | 金额字段 |
|
|
295
|
+
| **DATETIME** | `LocalDateTime` | 时间字段 |
|
|
296
|
+
| **DATE** | `LocalDate` | 日期字段 |
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 常见MyBatis错误
|
|
301
|
+
|
|
302
|
+
### 缺少注解错误
|
|
303
|
+
|
|
304
|
+
❌ **错误**:Mapper接口缺少必要的注解
|
|
305
|
+
✅ **正确**:必须使用@Mapper和@Repository注解
|
|
306
|
+
|
|
307
|
+
**解决方案**:
|
|
308
|
+
|
|
309
|
+
```java
|
|
310
|
+
❌ 错误示例:
|
|
311
|
+
public interface CircleMapper { // 错误:缺少注解
|
|
312
|
+
CircleDO findById(Long id);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
✅ 正确示例:
|
|
316
|
+
@Mapper
|
|
317
|
+
@Repository
|
|
318
|
+
public interface CircleMapper { // 正确:包含必要注解
|
|
319
|
+
CircleDO findById(Long id);
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### 使用select \*错误
|
|
324
|
+
|
|
325
|
+
❌ **错误**:在Mapper.xml中使用SELECT \*
|
|
326
|
+
✅ **正确**:必须显式引用字段列表
|
|
327
|
+
|
|
328
|
+
**解决方案**:
|
|
329
|
+
|
|
330
|
+
```xml
|
|
331
|
+
❌ 错误示例:
|
|
332
|
+
<select id="findById" resultMap="BaseResultMap">
|
|
333
|
+
SELECT * FROM circle WHERE id = #{id} <!-- 错误:使用SELECT * -->
|
|
334
|
+
</select>
|
|
335
|
+
|
|
336
|
+
✅ 正确示例:
|
|
337
|
+
<select id="findById" resultMap="BaseResultMap">
|
|
338
|
+
SELECT
|
|
339
|
+
<include refid="Base_Column_List"/> <!-- 正确:引用字段列表 -->
|
|
340
|
+
FROM circle WHERE id = #{id}
|
|
341
|
+
</select>
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### 缺少jdbcType错误
|
|
345
|
+
|
|
346
|
+
❌ **错误**:参数缺少jdbcType指定
|
|
347
|
+
✅ **正确**:必须为每个参数指定jdbcType
|
|
348
|
+
|
|
349
|
+
**解决方案**:
|
|
350
|
+
|
|
351
|
+
```xml
|
|
352
|
+
❌ 错误示例:
|
|
353
|
+
<select id="findById" resultMap="BaseResultMap">
|
|
354
|
+
SELECT * FROM circle WHERE id = #{id} <!-- 错误:缺少jdbcType -->
|
|
355
|
+
</select>
|
|
356
|
+
|
|
357
|
+
✅ 正确示例:
|
|
358
|
+
<select id="findById" resultMap="BaseResultMap">
|
|
359
|
+
SELECT
|
|
360
|
+
<include refid="Base_Column_List"/>
|
|
361
|
+
FROM circle WHERE id = #{id,jdbcType=BIGINT} <!-- 正确:指定jdbcType -->
|
|
362
|
+
</select>
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### 缺少useGeneratedKeys错误
|
|
366
|
+
|
|
367
|
+
❌ **错误**:插入操作缺少useGeneratedKeys配置
|
|
368
|
+
✅ **正确**:必须配置useGeneratedKeys和keyProperty
|
|
369
|
+
|
|
370
|
+
**解决方案**:
|
|
371
|
+
|
|
372
|
+
```xml
|
|
373
|
+
❌ 错误示例:
|
|
374
|
+
<insert id="insert" parameterType="CircleDO">
|
|
375
|
+
INSERT INTO circle (name, description) VALUES (#{name}, #{description}) <!-- 错误:缺少useGeneratedKeys -->
|
|
376
|
+
</insert>
|
|
377
|
+
|
|
378
|
+
✅ 正确示例:
|
|
379
|
+
<insert id="insert" parameterType="CircleDO" useGeneratedKeys="true" keyProperty="id"> <!-- 正确:配置useGeneratedKeys -->
|
|
380
|
+
INSERT INTO circle (name, description) VALUES (#{name,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR})
|
|
381
|
+
</insert>
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## 质量检查清单
|
|
387
|
+
|
|
388
|
+
### MyBatis代码检查
|
|
389
|
+
|
|
390
|
+
- [ ] Mapper.java是否使用了@Mapper和@Repository注解?
|
|
391
|
+
- [ ] 方法命名是否遵循了业务语义规范?
|
|
392
|
+
- [ ] 是否避免了使用Map等不明确类型?
|
|
393
|
+
- [ ] Mapper.xml是否定义了BaseResultMap?
|
|
394
|
+
- [ ] 是否定义了Base_Column_List?
|
|
395
|
+
- [ ] 是否避免了使用SELECT \*?
|
|
396
|
+
- [ ] 是否为每个参数指定了jdbcType?
|
|
397
|
+
- [ ] 插入操作是否配置了useGeneratedKeys?
|
|
398
|
+
- [ ] 更新操作是否使用了动态SQL?
|
|
399
|
+
- [ ] DO类是否使用了Lombok注解?
|
|
400
|
+
- [ ] 字段类型是否与数据库类型对应?
|
|
401
|
+
- [ ] 是否添加了必要的中文注释?
|
|
402
|
+
|
|
403
|
+
### 数据库规范检查
|
|
404
|
+
|
|
405
|
+
- [ ] 是否生成了完整的MyBatis映射文件?
|
|
406
|
+
- [ ] 是否包含了必要的注释和校验?
|
|
407
|
+
- [ ] 是否实现了领域对象与DO的双向转换?
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
# SQL建表规范
|
|
2
|
+
|
|
3
|
+
## 基本要求
|
|
4
|
+
|
|
5
|
+
在 `infra` 模块的 `resources/sql` 目录中,依据业务描述生成对应的 `.sql` 建表文件。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 标准字段
|
|
10
|
+
|
|
11
|
+
### 必须包含的字段
|
|
12
|
+
|
|
13
|
+
```sql
|
|
14
|
+
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
|
|
15
|
+
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
16
|
+
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 字段说明
|
|
20
|
+
|
|
21
|
+
- **id**:主键ID,使用BIGINT UNSIGNED AUTO_INCREMENT
|
|
22
|
+
- **create_time**:创建时间,自动设置为当前时间
|
|
23
|
+
- **update_time**:更新时间,自动更新为当前时间
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 字段规范
|
|
28
|
+
|
|
29
|
+
### 字段定义规则
|
|
30
|
+
|
|
31
|
+
- **非空约束**:除自增主键或业务确需可空字段外,字段应尽量声明 `NOT NULL`
|
|
32
|
+
- **默认值**:数值`0`、字符串`''`、布尔`TINYINT(1) DEFAULT 0`
|
|
33
|
+
- **索引约束**:**禁止**在字段定义中直接添加PRIMARY KEY、UNIQUE、INDEX等约束
|
|
34
|
+
- **字段定义**:字段定义只包含数据类型、非空约束、默认值和注释
|
|
35
|
+
|
|
36
|
+
### 字段类型规范
|
|
37
|
+
|
|
38
|
+
| 数据类型 | 使用场景 | 示例 |
|
|
39
|
+
| ------------------- | -------------- | --------------------------------------------------------- |
|
|
40
|
+
| **BIGINT UNSIGNED** | 主键ID、外键ID | `id BIGINT UNSIGNED AUTO_INCREMENT` |
|
|
41
|
+
| **VARCHAR(n)** | 字符串字段 | `name VARCHAR(100) NOT NULL` |
|
|
42
|
+
| **TEXT** | 长文本字段 | `description TEXT` |
|
|
43
|
+
| **TINYINT(1)** | 布尔字段 | `status TINYINT(1) NOT NULL DEFAULT 0` |
|
|
44
|
+
| **INT** | 整数字段 | `count INT NOT NULL DEFAULT 0` |
|
|
45
|
+
| **DECIMAL(p,s)** | 金额字段 | `amount DECIMAL(10,2) NOT NULL DEFAULT 0.00` |
|
|
46
|
+
| **DATETIME** | 时间字段 | `create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP` |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 索引定义规范
|
|
51
|
+
|
|
52
|
+
### 强制要求
|
|
53
|
+
|
|
54
|
+
**重要:所有索引必须在建表语句末尾单独定义,不得在字段上直接约束**
|
|
55
|
+
|
|
56
|
+
### 索引定义位置
|
|
57
|
+
|
|
58
|
+
```sql
|
|
59
|
+
CREATE TABLE {table_name} (
|
|
60
|
+
-- 字段定义(不包含索引约束)
|
|
61
|
+
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
|
|
62
|
+
name VARCHAR(100) NOT NULL COMMENT '名称',
|
|
63
|
+
status TINYINT(1) NOT NULL DEFAULT 0 COMMENT '状态',
|
|
64
|
+
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
65
|
+
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
66
|
+
|
|
67
|
+
-- 索引定义(单独在末尾定义)
|
|
68
|
+
PRIMARY KEY (id),
|
|
69
|
+
UNIQUE KEY uk_name (name),
|
|
70
|
+
KEY idx_status (status),
|
|
71
|
+
KEY idx_create_time (create_time)
|
|
72
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表注释';
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 索引命名规范
|
|
76
|
+
|
|
77
|
+
- **主键索引**:`PRIMARY KEY (id)` - 不命名
|
|
78
|
+
- **唯一索引**:`UNIQUE KEY uk_{field_name} ({field_name})`
|
|
79
|
+
- **普通索引**:`KEY idx_{field_name} ({field_name})`
|
|
80
|
+
- **复合索引**:`KEY idx_{field1}_{field2} ({field1}, {field2})`
|
|
81
|
+
- **外键索引**:`KEY idx_{field_name} ({field_name})`
|
|
82
|
+
|
|
83
|
+
### 索引创建策略
|
|
84
|
+
|
|
85
|
+
基于常用查询和性能因素,考虑创建以下索引:
|
|
86
|
+
|
|
87
|
+
1. **主键索引**:必须创建,通常为id字段
|
|
88
|
+
2. **唯一索引**:业务唯一字段(如用户名、邮箱、手机号等)
|
|
89
|
+
3. **查询索引**:高频查询字段(如状态、类型、创建时间等)
|
|
90
|
+
4. **排序索引**:经常用于排序的字段(如创建时间、更新时间等)
|
|
91
|
+
5. **复合索引**:多字段组合查询(如状态+类型+时间范围等)
|
|
92
|
+
6. **外键索引**:关联查询字段(如用户ID、分类ID等)
|
|
93
|
+
|
|
94
|
+
### 索引性能考虑
|
|
95
|
+
|
|
96
|
+
- **选择性**:优先为选择性高的字段创建索引
|
|
97
|
+
- **查询模式**:根据实际查询SQL创建合适的索引
|
|
98
|
+
- **更新频率**:避免为频繁更新的字段创建过多索引
|
|
99
|
+
- **索引数量**:单表索引数量控制在5个以内
|
|
100
|
+
- **复合索引顺序**:遵循最左前缀原则
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 技术标准
|
|
105
|
+
|
|
106
|
+
### 数据库标准
|
|
107
|
+
|
|
108
|
+
- 遵循 MySQL 5.7 语法
|
|
109
|
+
- 统一使用 InnoDB 存储引擎
|
|
110
|
+
- 统一使用 utf8mb4 字符集
|
|
111
|
+
- 统一使用 utf8mb4_general_ci 排序规则
|
|
112
|
+
|
|
113
|
+
### 建表语句模板
|
|
114
|
+
|
|
115
|
+
```sql
|
|
116
|
+
CREATE TABLE {table_name} (
|
|
117
|
+
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
|
|
118
|
+
-- 业务字段定义
|
|
119
|
+
name VARCHAR(100) NOT NULL COMMENT '名称',
|
|
120
|
+
status TINYINT(1) NOT NULL DEFAULT 0 COMMENT '状态',
|
|
121
|
+
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
122
|
+
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
123
|
+
|
|
124
|
+
-- 索引定义
|
|
125
|
+
PRIMARY KEY (id),
|
|
126
|
+
UNIQUE KEY uk_name (name),
|
|
127
|
+
KEY idx_status (status),
|
|
128
|
+
KEY idx_create_time (create_time)
|
|
129
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表注释';
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 常见SQL错误
|
|
135
|
+
|
|
136
|
+
### 索引定义错误
|
|
137
|
+
|
|
138
|
+
❌ **错误**:在字段定义中直接添加索引约束
|
|
139
|
+
✅ **正确**:在建表语句末尾单独定义索引
|
|
140
|
+
|
|
141
|
+
**解决方案**:
|
|
142
|
+
|
|
143
|
+
```sql
|
|
144
|
+
❌ 错误示例:
|
|
145
|
+
CREATE TABLE circle (
|
|
146
|
+
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 错误:在字段上直接约束
|
|
147
|
+
name VARCHAR(100) NOT NULL UNIQUE, -- 错误:在字段上直接约束
|
|
148
|
+
status TINYINT(1) NOT NULL DEFAULT 0
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
✅ 正确示例:
|
|
152
|
+
CREATE TABLE circle (
|
|
153
|
+
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
|
|
154
|
+
name VARCHAR(100) NOT NULL COMMENT '名称',
|
|
155
|
+
status TINYINT(1) NOT NULL DEFAULT 0 COMMENT '状态',
|
|
156
|
+
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
157
|
+
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
158
|
+
|
|
159
|
+
PRIMARY KEY (id),
|
|
160
|
+
UNIQUE KEY uk_name (name),
|
|
161
|
+
KEY idx_status (status)
|
|
162
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='圈子表';
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 缺少标准字段错误
|
|
166
|
+
|
|
167
|
+
❌ **错误**:缺少create_time和update_time字段
|
|
168
|
+
✅ **正确**:必须包含标准字段
|
|
169
|
+
|
|
170
|
+
**解决方案**:
|
|
171
|
+
|
|
172
|
+
```sql
|
|
173
|
+
❌ 错误示例:
|
|
174
|
+
CREATE TABLE circle (
|
|
175
|
+
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
|
|
176
|
+
name VARCHAR(100) NOT NULL COMMENT '名称'
|
|
177
|
+
-- 缺少create_time和update_time字段
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
✅ 正确示例:
|
|
181
|
+
CREATE TABLE circle (
|
|
182
|
+
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
|
|
183
|
+
name VARCHAR(100) NOT NULL COMMENT '名称',
|
|
184
|
+
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
185
|
+
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
|
|
186
|
+
);
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 索引命名错误
|
|
190
|
+
|
|
191
|
+
❌ **错误**:索引命名不规范
|
|
192
|
+
✅ **正确**:遵循索引命名规范
|
|
193
|
+
|
|
194
|
+
**解决方案**:
|
|
195
|
+
|
|
196
|
+
```sql
|
|
197
|
+
❌ 错误示例:
|
|
198
|
+
CREATE TABLE circle (
|
|
199
|
+
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
|
|
200
|
+
name VARCHAR(100) NOT NULL COMMENT '名称',
|
|
201
|
+
status TINYINT(1) NOT NULL DEFAULT 0 COMMENT '状态',
|
|
202
|
+
|
|
203
|
+
PRIMARY KEY (id),
|
|
204
|
+
UNIQUE KEY name_unique (name), -- 错误:命名不规范
|
|
205
|
+
KEY status_index (status) -- 错误:命名不规范
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
✅ 正确示例:
|
|
209
|
+
CREATE TABLE circle (
|
|
210
|
+
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
|
|
211
|
+
name VARCHAR(100) NOT NULL COMMENT '名称',
|
|
212
|
+
status TINYINT(1) NOT NULL DEFAULT 0 COMMENT '状态',
|
|
213
|
+
|
|
214
|
+
PRIMARY KEY (id),
|
|
215
|
+
UNIQUE KEY uk_name (name), -- 正确:遵循命名规范
|
|
216
|
+
KEY idx_status (status) -- 正确:遵循命名规范
|
|
217
|
+
);
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### 字符集错误
|
|
221
|
+
|
|
222
|
+
❌ **错误**:使用错误的字符集或存储引擎
|
|
223
|
+
✅ **正确**:使用标准的技术配置
|
|
224
|
+
|
|
225
|
+
**解决方案**:
|
|
226
|
+
|
|
227
|
+
```sql
|
|
228
|
+
❌ 错误示例:
|
|
229
|
+
CREATE TABLE circle (
|
|
230
|
+
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
|
|
231
|
+
name VARCHAR(100) NOT NULL COMMENT '名称'
|
|
232
|
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='圈子表'; -- 错误:使用MyISAM和utf8
|
|
233
|
+
|
|
234
|
+
✅ 正确示例:
|
|
235
|
+
CREATE TABLE circle (
|
|
236
|
+
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
|
|
237
|
+
name VARCHAR(100) NOT NULL COMMENT '名称'
|
|
238
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='圈子表'; -- 正确:使用InnoDB和utf8mb4
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## 质量检查清单
|
|
244
|
+
|
|
245
|
+
### SQL建表检查
|
|
246
|
+
|
|
247
|
+
- [ ] 是否包含了标准字段(id、create_time、update_time)?
|
|
248
|
+
- [ ] 是否在字段定义中避免了索引约束?
|
|
249
|
+
- [ ] 是否在建表语句末尾单独定义了索引?
|
|
250
|
+
- [ ] 是否遵循了索引命名规范?
|
|
251
|
+
- [ ] 是否使用了正确的数据类型?
|
|
252
|
+
- [ ] 是否设置了合适的默认值?
|
|
253
|
+
- [ ] 是否使用了InnoDB存储引擎?
|
|
254
|
+
- [ ] 是否使用了utf8mb4字符集?
|
|
255
|
+
- [ ] 是否添加了必要的注释?
|
|
256
|
+
- [ ] 是否考虑了索引性能?
|
|
257
|
+
|
|
258
|
+
### 数据库规范检查
|
|
259
|
+
|
|
260
|
+
- [ ] 是否遵循了MySQL 5.7语法?
|
|
261
|
+
- [ ] 是否使用了InnoDB存储引擎?
|
|
262
|
+
- [ ] 是否使用了utf8mb4字符集?
|
|
263
|
+
- [ ] 是否使用了utf8mb4_general_ci排序规则?
|