Skip to content

AI 辅助开发

传统的代码生成器在 AI 时代已经不再需要。死板的模板、千篇一律的代码、繁琐的配置...这些都可以交给 AI 来处理。


为什么不用代码生成器了

  • 模板固定: 传统生成器的代码风格单一,难以适应业务变化
  • 维护成本高: 每次框架升级都要同步更新模板
  • 学习成本: 新成员需要花时间理解模板规则
  • AI 更灵活: 自然语言交互,代码更贴合实际需求

拥抱 AI 开发工具

现在的 AI 编程工具已经非常成熟,完全可以替代传统的代码生成器:

工具特点
通义千问中文优化,国内首选
CursorIDE 深度集成,强烈推荐
GitHub Copilot生态完善
Claude长上下文,理解力强

如何用 AI 生成代码

第一步:告诉 AI 你的需求和项目规范

复制以下内容,告诉 AI:

我正在使用 MolanDev Cloud 项目开发一个企业级管理系统。

技术栈:
- Spring Boot 3.x + MyBatis Plus
- 实体类以 Entity 结尾,如 SysUserEntity
- Service 直接继承 ServiceImpl,不使用接口+实现类
- Controller 使用 JsonResult 统一返回
- SQL 使用 JDK 17 三引号 + @Select 注解,不使用 XML

请帮我生成一个商品管理模块,包含:
1. 实体类 ProductEntity
2. Mapper ProductMapper
3. Service ProductService
4. Controller ProductController

要求实现标准的增删改查接口:
- POST /product/info 查询详情
- POST /product/add 新增
- POST /product/edit 编辑
- POST /product/delete 删除
- POST /product/list 分页列表

第二步:根据实际业务调整细节

AI 生成的代码可能不完全符合你的需求,需要根据实际情况调整:

  • 添加业务逻辑
  • 修改字段名称
  • 增加参数校验
  • 添加权限注解

第三步:让 AI 解释或优化代码

请解释这段代码中的 LambdaQueryWrapper 是如何工作的?
这个 Service 方法的事务配置是否正确?如何优化?

实战示例:从表结构到完整接口

需求

创建一个商品管理模块,表结构如下:

sql
CREATE TABLE product (
    id VARCHAR(36) PRIMARY KEY,
    product_name VARCHAR(100) COMMENT '商品名称',
    price DECIMAL(10,2) COMMENT '价格',
    stock INT COMMENT '库存',
    category VARCHAR(50) COMMENT '分类',
    create_time DATETIME COMMENT '创建时间',
    update_time DATETIME COMMENT '更新时间',
    deleted TINYINT(1) DEFAULT 0 COMMENT '删除状态'
);

让 AI 生成代码

Prompt:

我有一个商品表,表结构如下:

CREATE TABLE product (
    id VARCHAR(36) PRIMARY KEY,
    product_name VARCHAR(100) COMMENT '商品名称',
    price DECIMAL(10,2) COMMENT '价格',
    stock INT COMMENT '库存',
    category VARCHAR(50) COMMENT '分类',
    create_time DATETIME COMMENT '创建时间',
    update_time DATETIME COMMENT '更新时间',
    deleted TINYINT(1) DEFAULT 0 COMMENT '删除状态'
);

请按照 MolanDev Cloud 规范生成完整代码:

1. 实体类 ProductEntity(使用 Lombok、MyBatis Plus 注解)
2. Mapper ProductMapper
3. Service ProductService(继承 ServiceImpl)
4. Controller ProductController(标准增删改查接口)

要求:
- Entity 以 Entity 结尾
- 使用 @TableLogic 标记逻辑删除
- createTime 和 updateTime 使用 FieldFill 自动填充
- Controller 使用 JsonResult 统一返回
- 使用 @ParameterObject 接收参数
- 分页接口返回 PageResult

AI 生成的代码

实体类:

java
@Getter
@Setter
@TableName("product")
@Schema(description = "商品")
public class ProductEntity {

    @Schema(description = "主键标识")
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    private String id;

    @Schema(description = "商品名称")
    @TableField("product_name")
    private String productName;

    @Schema(description = "价格")
    @TableField("price")
    private BigDecimal price;

    @Schema(description = "库存")
    @TableField("stock")
    private Integer stock;

    @Schema(description = "分类")
    @TableField("category")
    private String category;

    @Schema(description = "创建时间")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @Schema(description = "更新时间")
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    @Schema(description = "删除状态")
    @TableField(value = "deleted", fill = FieldFill.INSERT)
    @TableLogic
    private Boolean deleted;
}

Mapper:

java
public interface ProductMapper extends BaseMapper<ProductEntity> {
}

Service:

java
@Service
@Transactional(rollbackFor = Exception.class)
public class ProductService extends ServiceImpl<ProductMapper, ProductEntity> {
}

Controller:

java
@Tag(name = "商品管理")
@RestController
@RequestMapping("/product")
public class ProductController {

    @Autowired
    private ProductService productService;

    @Operation(summary = "商品信息")
    @PostMapping("/info")
    public JsonResult<ProductEntity> info(@RequestParam String id) {
        if (StringUtils.isEmpty(id)) {
            return JsonResult.invalid("主键不能为空");
        }
        return JsonResult.success(productService.getById(id));
    }

    @Operation(summary = "新增商品")
    @PostMapping("/add")
    @HasPermission("product:add")
    @OpLog(title = "新增商品", type = OpTypes.ADD, module = "商品管理")
    public JsonResult<String> add(@ParameterObject ProductEntity product) {
        if (StringUtils.isNotEmpty(product.getId())) {
            return JsonResult.invalid("主键不能有值");
        }
        productService.save(product);
        return JsonResult.success(product.getId());
    }

    @Operation(summary = "编辑商品")
    @PostMapping("/edit")
    @HasPermission("product:edit")
    @OpLog(title = "编辑商品", type = OpTypes.UPDATE, module = "商品管理")
    public JsonResult<Void> edit(@ParameterObject ProductEntity product) {
        if (StringUtils.isEmpty(product.getId())) {
            return JsonResult.invalid("主键不能为空");
        }
        productService.saveOrUpdate(product);
        return JsonResult.success();
    }

    @Operation(summary = "删除商品")
    @PostMapping("/delete")
    @HasPermission("product:delete")
    @OpLog(title = "删除商品", type = OpTypes.DELETE, module = "商品管理")
    public JsonResult<Void> delete(@RequestParam String id) {
        if (StringUtils.isEmpty(id)) {
            return JsonResult.invalid("主键不能为空");
        }
        productService.removeById(id);
        return JsonResult.success();
    }

    @Operation(summary = "分页查询商品")
    @PostMapping("/list")
    public JsonResult<PageResult<ProductEntity>> list(
            @ParameterObject PageQuery pageQuery,
            @ParameterObject ProductEntity product) {
        Page<ProductEntity> page = productService.page(
            DbQueryUtils.toPage(pageQuery),
            Wrappers.query(product)
        );
        return JsonResult.success(DbQueryUtils.pageResult(page));
    }
}

验证和调整

生成的代码可以直接使用,根据实际需求调整:

  • 添加参数校验(如 @Validated)
  • 增加业务逻辑(如库存检查)
  • 添加自定义查询方法
  • 优化 SQL(如多表关联)

常用 Prompt 模板

生成实体类

请按照 MolanDev Cloud 规范生成实体类:

表名: xxx
字段: [列出字段]

要求:
- 以 Entity 结尾
- 使用 Lombok @Getter @Setter
- 使用 @TableName、@TableId、@TableField
- 使用 @TableLogic 标记逻辑删除
- createTime 和 updateTime 使用 FieldFill 自动填充

生成 Service

请生成 Service 类:

实体类: XxxEntity
Mapper: XxxMapper

要求:
- 继承 ServiceImpl<XxxMapper, XxxEntity>
- 使用 @Service 和 @Transactional
- 添加自定义业务方法(描述你的需求)

生成 Controller

请生成 Controller 类:

Service: XxxService
实体类: XxxEntity
路径: /xxx

要求:
- 标准增删改查接口(info/add/edit/delete/list)
- 使用 @Tag、@Operation
- 使用 @HasPermission 和 @OpLog
- 使用 JsonResult 统一返回
- 使用 @ParameterObject 接收参数

调试技巧

1. 使用 IDEA 调试

  • 在 Service 方法打断点
  • 使用 Debug 模式启动
  • 查看变量值和执行流程

2. 查看日志

yaml
# application-local.yml
logging:
  level:
    com.molandev: debug  # 查看框架日志
    org.springframework: info  # 查看 Spring 日志

3. 使用接口文档

访问 Knife4j 接口文档: http://localhost:9099/doc.html

  • 测试接口是否正常
  • 查看请求参数和返回结构
  • 快速调试前端

4. 常见问题

问题: 接口返回 404
解决: 检查 @RequestMapping 路径是否正确

问题: 数据库查询为空
解决: 检查数据源配置、表名是否正确

问题: 权限不足
解决: 检查 @HasPermission 权限码是否已分配给用户


总结

AI 辅助开发的优势:

  • 灵活: 自然语言描述需求,代码贴合业务
  • 高效: 秒级生成,无需手动编写模板
  • 易学: 无需理解复杂的模板规则
  • 智能: AI 可以解释代码、优化代码

忘掉那些复杂的模板配置吧,选择一个顺手的 AI 工具,用自然语言描述你的需求,让 AI 帮你生成符合规范的代码。

下一步