AI 帮你写了 480 个文件 接着你发现加一个字段要改好几处

作者:袖梨 2026-06-27

AI 帮你写了 480 个文件,然后你发现加一个字段要改好几个地方


一、AI 写 CRUD 最大的坑:它只管生,不管养

先给你看一个标准 MyBatis-Plus 项目的表结构。一张 user 表,常规需要这些文件:

AI 帮你写了 480 个文件,然后你发现加一个字段要改好几个地方

 复制代码UserEntity.java       → 实体类
UserDTO.java          → 传输对象
UserMapper.java       → Mapper 接口
UserMapper.xml        → SQL 映射文件
UserService.java      → 业务接口
UserServiceImpl.java  → 业务实现

6 个文件。AI 帮你一次性生成,很快。80 张表就是 480 个文件——AI 也不慢,几分钟的事。

问题出在后面。

产品说:「用户表加一个 remark 字段。」

你做下面这件事:

 复制代码1. UserEntity.java — 加字段 → AI 能帮你改
2. UserDTO.java — 加字段 → AI 也能帮你改,但你得告诉它
3. UserMapper.xml — 检查 SQL 是否用到 select *
4. UserServiceImpl.java — 检查是否手动拼接了字段

然后同样的事,在其他 79 张表的关联查询里再做一遍——因为可能有 JOIN user 表的 SQL 散落在各张表的 Mapper.xml 里。

AI 帮你生成代码的时候,你省了时间。AI 不帮你维护代码一致性的时候,你花的时间全还回去了。

核心矛盾不在「AI 写的代码好不好」,在代码的变更面有多大。 一个字段散落在 6 个文件里,你改就要改 6 个文件——不管这 6 个文件是谁写的。


二、不是 MyBatis 的锅,是「文件数」本身就是变更成本

有人会说这是 MyBatis 的设计问题,用 JPA 就没这事。来看:

方案一个表最少几个文件加一个字段要检查几处
MyBatis 手动写4-6 个Entity + DTO + Mapper.java + Mapper.xml + 手工拼接处
MyBatis-Plus 代码生成4-6 个Entity + DTO + Mapper + Service(生成器可能漏改)
JPA / Hibernate2-3 个Entity + DTO + 自定义 @Query
jOOQ 代码生成1-2 个Entity 由数据库驱动,但 DTO 和业务层仍需手动

每一个方案,文件数至少是 2 个。因为「数据定义」和「数据传输」长期被当成两件事。

但仔细想想:对一张只做 CRUD 的表来说,你定义 UserEntityUserDTO,它们 90% 的字段是一样的。你在维护双份信息。

变更成本 = 文件数 × 耦合度。

文件越多,耦合越散,AI 越帮不上忙。因为 AI 不理解「你改 Entity 的时候应该同步改 DTO 吗?」——它不知道你的项目约定,它只知道当前打开的文件。


三、如果一张表只有一个文件

回到同一个需求。一张表只需要一个类:

 复制代码// UserService.java —— 一个表只写这一个类
public class UserService {
    // 查一个
    public User getById(Long id) {
        return DB.Pojo.select(User.class).eq("id", id).queryBean();
    }    // 查列表
    public Page<User> list(String keyword) {
        return DB.Pojo.select(User.class)
                .like("name", keyword)
                .page(1, 20)
                .queryBeanPage();
    }    // 增
    public User add(User user) {
        return DB.Pojo.insert(user);
    }    // 改
    public User modify(Long id, User user) {
        return DB.Pojo.updateById(User.class, id);
    }
}

remark 字段:

  1. 数据库加一列:ALTER TABLE user ADD COLUMN remark VARCHAR(255);
  2. user 表对应的这个类——什么都不用改。

因为 DB.Pojo.select(User.class) 自动从表结构拿到列信息,DB.Pojo.insert(user) 把 JSON 里的 remark 字段自动映射到数据库列。没有 Entity 要改,没有 DTO 要同步,没有 Mapper.xml 要检查。

变更面从 6 个文件压缩到 1 个文件。AI 在这个基础上帮你改代码,错误率从「大概率漏改」变成「基本不出错」。


四、压力测试:同一个需求,不同方案要改几个地方

操作MyBatis-PlusJPA此方案
加一个字段Entity + DTO + Mapper.xml + ServiceImpl + 前端DTO ≈ 5 处Entity + DTO + @Query检查 ≈ 3 处数据库 1 处(框架自动映射)
改字段类型同上 5 处同上 3 处数据库 1 处
加一个查询条件Mapper.java + Mapper.xml + ServiceImpl ≈ 3 处Repository + Service ≈ 2 处改 Service 的方法参数即可
新增一张表生成 4-6 个文件生成 2-3 个文件1 个文件

不是在比「谁的代码写得更短」。在比**「加一个字段,要改几个地方」**。因为你不是每天都在加新表,但你可能每天都在被产品要求加字段。


五、为什么文件少会让 AI 的准确率翻倍

这不是推测。有一个简单的解释:

当你让 AI 改一个字段,它需要同时理解 EntityDTOMapper.xmlServiceImpl 四个文件的上下文。上下文越长,注意力越分散,漏改的概率越高。

而当你只有一个 UserService.java,上下文是高度内聚的。AI 在这个文件里改代码,不需要跨文件猜测影响范围。

少文件 = 少上下文 = 少出错。这不是代码风格问题,是 AI 辅助编程时代的工程成本问题。

换句话说:你项目的文件结构,正在直接决定 AI 帮你写代码的质量上限。


六、AI 生成 480 个文件 vs AI 这方案管理 80 个文件

做个终极对比:

 复制代码项目规模:80 张表的业务系统MyBatis-Plus + AI:
  生成 480 个文件(80表 × 6文件)
  加一个字段平均改 5 个文件
  AI 漏改概率:你每次都要人工检查 4-5 个文件此方案:
  维护 80 个 Service 文件(80表 × 1文件)
  加一个字段:数据库 1 处
  AI 漏改概率:一个文件前后一读就看清了

不是 480 和 80 的代码量差距。是变更时你需要排查 5 个文件还是 1 个文件的差距。 而这个差距在 AI 写代码的时代被放大了——因为文件越多,AI 越容易漏改,你越需要花时间人工校验。


七、什么时候这样不行

不是。

这种写法的边界很清楚:

  • 标准 CRUD 表:80% 以上的业务表只做增删改查,单文件最合适

  • 单表查询为主:按 ID 查、按条件查、分页查

  • 字段和数据库列一一对应:不需要复杂的映射转换

  • 复杂多表关联 + 聚合查询:该写 SQL 还是要写 SQL,该建专门的查询 Service 还是要建

  • 需要和第三方 API 做字段转换:DTO 层的存在是有意义的,不要为了省文件而省文件

  • 对缓存、事务有复杂编排的业务:单文件只负责数据访问,业务编排另起一个 Service

这里的「单文件」省的是重复定义,不是业务编排。你仍然可以有 OrderBizService 来编排订单流转逻辑——但它不需要再对应一个 OrderMapper.java + OrderMapper.xml


八、如果只记一句话

下次你用 AI 写 CRUD,别光看它生成了多快。数一数它生成了几个文件。文件数就是你下一次产品改需求时的排查面。


你用 AI 写 CRUD 的时候,加一个字段通常要改几个文件?有没有 AI 漏改 Mapper.xml 导致线上报错的经历?评论区聊聊——你说不定正在帮别人少踩一个坑。


文中提到的工具:

  • 项目名:dlz-db(一个表只写一个 Service,不需要 Entity、DTO、Mapper、XML)
  • Maven:top.dlzio:dlz-db
  • GitHub:github.com/dingkui/dlz…
  • Gitee:gitee.com/dlzio/dlz-d…

相关文章

精彩推荐