1. 从“手搓”到“起飞”:为什么我们需要一个趁手的代码生成器
如果你和我一样,是个常年泡在Spring Boot和MyBatis项目里的Java后端开发,那你肯定对下面这个场景不陌生:产品经理拿着原型图过来,说“这个需求很简单,就加一张表,几个字段”。你心里一咯噔,知道“简单”两个字背后,是一整套的体力活——打开数据库客户端,建表;回到IDE,在entity包里新建一个实体类,把字段一个个敲进去,配上Lombok注解;在mapper包里新建一个接口,定义几个基础的增删改查方法;最后,在resources的mapper目录下,新建一个同名的XML文件,开始写<resultMap>、<sql>片段和那一套<insert>,<select>,<update>,<delete>标签。
这一套流程下来,哪怕表结构再简单,没有十几二十分钟也搞不定。更别提字段名要遵循驼峰转下划线的约定,稍不留神就写错;XML里的resultMap配置繁琐且容易遗漏;每次新增字段,都需要在Entity、Mapper接口、XML里同步修改三处地方,简直是滋生Bug的温床。这种重复、机械、低价值的劳动,我们戏称为“手搓代码”,它不仅消耗开发者的热情,更拖慢了整个项目的迭代速度。
所以,一个“嘎嘎好用”的代码生成器,对于MyBatis开发者而言,绝不是一个“锦上添花”的玩具,而是一个能让你从重复劳动中解放出来,把精力真正投入到业务逻辑设计的“生产力倍增器”。它解决的痛点非常明确:将数据库表结构自动、准确、一致地映射为Java领域的实体类、数据访问接口和SQL映射文件。今天要聊的MyBatisX Generator,就是IntelliJ IDEA插件生态里,针对MyBatis和MyBatis-Plus框架量身定做的一款利器。它不像一些需要独立运行、配置复杂的命令行工具,而是深度集成在IDE中,让你在熟悉的开发环境里,通过几次点击和简单的配置,就能完成整套基础代码的生成,体验非常顺滑。
2. MyBatisX Generator核心能力拆解:它到底能帮你做什么?
在深入使用之前,我们得先搞清楚MyBatisX Generator的定位和能力边界。它不是一个全能的代码脚手架,不会帮你生成Controller、Service或者前端页面。它的核心职责非常聚焦:基于数据库表,生成与之对应的持久层代码。具体来说,主要包括以下四个部分,这也是MyBatis标准开发模式的核心组件:
2.1 实体类(Entity)的精准生成
这是代码生成的基础。MyBatisX Generator会根据你选中的数据库表,读取其所有字段的元数据信息,包括字段名、数据类型、长度、是否可为空、默认值、注释等。然后,它会按照你预设的规则,生成一个标准的Java实体类。
关键特性与配置解析:
命名与映射规则:
- 类名:默认将表名转换为大驼峰形式(例如,
user_info->UserInfo)。你可以在生成前进行修改。 - 字段名:默认将数据库字段名(下划线风格)转换为小驼峰形式(例如,
user_name->userName)。这是Java和MyBatis中公认的最佳实践。 - 类型映射:插件内置了常见的数据库类型到Java类型的映射关系。例如,
varchar->String,int->Integer,datetime->LocalDateTime(如果你使用了Java 8+的时间API)。对于不常见的类型或自定义映射,通常需要在更高级的全局配置或模板中调整。
- 类名:默认将表名转换为大驼峰形式(例如,
注解支持:
- Lombok:这是现代Java项目的标配。MyBatisX Generator默认支持生成
@Data、@Getter、@Setter、@NoArgsConstructor、@AllArgsConstructor等注解,极大简化了实体类的代码量。你需要在生成时勾选相应的选项。 - Swagger/Validation注解:部分高级配置或自定义模板可以支持生成
@ApiModelProperty(Swagger)或@NotBlank(Validation)等注解,将字段注释直接转化为API文档或校验规则,进一步提升开发效率。 - MyBatis-Plus注解:如果你使用的是MyBatis-Plus,插件可以生成
@TableName、@TableId、@TableField等注解,用于指定表名、主键策略和字段映射关系。
- Lombok:这是现代Java项目的标配。MyBatisX Generator默认支持生成
字段注释:数据库表中的字段注释会被提取,并作为Java字段的注释(Javadoc)生成。这对于后续维护和阅读代码至关重要。
2.2 Mapper接口的智能生成
实体类承载数据,而Mapper接口则定义了操作数据的方法契约。MyBatisX Generator会根据表的主键等信息,生成一个包含常用CRUD方法声明的接口。
生成的方法通常包括:
insert(T entity): 插入一条记录。insertBatch(List<T> list): 批量插入(如果插件或模板支持)。deleteById(Serializable id): 根据主键删除。updateById(T entity): 根据主键更新。selectById(Serializable id): 根据主键查询。selectList(@Param(“ew”) Wrapper<T> queryWrapper): 条件查询(MyBatis-Plus风格,使用QueryWrapper)。selectPage(Page<T> page, @Param(“ew”) Wrapper<T> queryWrapper): 分页查询。
注意:生成的接口方法只是声明,其具体的SQL实现依赖于对应的XML文件或注解(如MyBatis-Plus的
@Select等)。MyBatisX Generator的价值在于保证了接口方法与XML中SQL语句ID的一致性,避免了手写可能出现的“找不到Statement”的运行时错误。
2.3 Mapper XML文件的配套生成
这是MyBatis将Java方法调用与具体SQL绑定起来的关键。MyBatisX Generator会生成一个与Mapper接口同名的XML文件,里面包含了上述接口方法对应的SQL实现。
XML文件的核心内容:
<resultMap>:定义了查询结果集字段到实体类属性的映射关系。这是MyBatis中最容易出错的部分之一。生成器会根据实体类字段和数据库字段的对应关系,自动生成精确的<result>映射,包括jdbcType和property的匹配。- SQL片段:可能会生成一个
<sql id=”Base_Column_List”>,列出所有字段,方便在<select>语句中引用,避免写*和字段列表不一致的问题。 - 完整的CRUD SQL:为每一个生成的Mapper接口方法,生成对应的
<insert>,<select>,<update>,<delete>标签,并包含基本的动态SQL支持(如<if>标签判断非空字段)。
2.4 配套的Service层脚手架(可选增强)
一些更强大的代码生成器或自定义模板,还能进一步生成Service接口及其实现类。这通常不是MyBatisX Generator最核心的默认功能,但通过自定义模板可以轻松实现。生成的Service层通常会注入对应的Mapper,并封装一些简单的业务逻辑或事务管理,为Controller提供更友好的调用接口。
总结其核心价值:MyBatisX Generator通过自动化,确保了Entity、Mapper接口、XML文件三者之间的强一致性。你不再需要担心字段名写错、resultMap配置遗漏、方法名与SQL id不匹配这些低级错误。它将你的启动成本从“十几分钟”降低到“几十秒”,并且生成的代码规范、标准,符合团队协作的要求。
3. 手把手实战:在IDEA中配置与使用MyBatisX Generator
理论讲完了,我们来点实际的。下面我将以在IntelliJ IDEA中,为一个Spring Boot项目新增一张product(产品)表并生成代码为例,展示完整流程。
3.1 环境与前置条件准备
- IDE:确保你使用的是IntelliJ IDEA(社区版或旗舰版均可),这是MyBatisX插件运行的基础。
- 安装MyBatisX插件:
- 打开IDEA,进入
File -> Settings -> Plugins(Windows/Linux) 或IntelliJ IDEA -> Preferences -> Plugins(macOS)。 - 在Marketplace中搜索“MyBatisX”。
- 找到由“MyBatisX”发布的插件,点击“Install”进行安装。安装完成后需要重启IDEA。
- 打开IDEA,进入
- 项目准备:一个已经配置好数据库连接和MyBatis依赖的Spring Boot项目。你的
pom.xml里应该已经有类似下面的依赖:<!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- MyBatis Spring Boot Starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>你的版本,如 3.0.3</version> </dependency> <!-- 数据库驱动,例如MySQL --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <!-- Lombok (可选但强烈推荐) --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- 如果使用MyBatis-Plus,还需添加 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>你的版本,如 3.5.6</version> </dependency> - 配置数据库连接:在IDEA右侧的“Database”工具窗口(如果没看到,可通过
View -> Tool Windows -> Database打开),点击“+”号,添加你的项目数据库。正确配置URL、用户名、密码并测试连接成功。这一步至关重要,因为MyBatisX Generator需要读取数据库的元信息。
3.2 连接数据库并定位目标表
- 在“Database”工具窗口,展开你已连接的数据源,找到对应的数据库和表。
- 假设我们要为
product表生成代码。这张表结构如下:CREATE TABLE `product` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `product_name` varchar(100) NOT NULL COMMENT '产品名称', `price` decimal(10,2) NOT NULL COMMENT '价格', `stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存', `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:1-上架,0-下架', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产品表'; - 右键点击
product表,在弹出的菜单中,你会看到“MyBatisX-Generator”选项。点击它,代码生成的旅程就正式开始了。
3.3 生成器配置界面详解
点击“MyBatisX-Generator”后,会弹出一个配置对话框。这个界面是定制化生成结果的核心,我们逐一解析:
基础配置(Basic Config):
- Module:选择代码要生成到哪个项目模块(如果是多模块项目)。
- Package:设置生成文件的基础包路径。例如
com.example.demo。生成的Entity、Mapper等会放在这个包对应的子目录下。 - Base Path:设置生成文件的基础资源路径(通常是
src/main/resources)。 - Language:选择Java语言版本。
- Comment:是否生成注释。强烈建议勾选,这会把数据库的字段注释带到代码里。
策略配置(Strategy Config):
- Super Class:可以为生成的Entity、Mapper、Service设置一个共同的父类,用于抽取公共字段(如
BaseEntity中的id,createTime,updateTime)。 - Ignore Table Prefix:忽略表前缀。例如,如果所有表都以
t_开头,这里填写t_,生成实体类时就会自动去掉这个前缀。 - Field Annotation:字段注解。这里可以勾选
@Data、@Getter/@Setter等Lombok注解,以及@TableName、@TableField等MyBatis-Plus注解。根据你的项目实际使用的技术栈勾选。 - Actual Column:这个选项很重要。如果勾选,生成的实体类字段名会保持和数据库列名一致(下划线风格);如果不勾选,则会转换为小驼峰。通常我们不勾选,以符合Java编码规范。
- JSR310: Date API:如果勾选,时间类型(如
datetime)会映射为LocalDateTime,否则可能映射为旧的Date类型。Java 8+项目建议勾选。
- Super Class:可以为生成的Entity、Mapper、Service设置一个共同的父类,用于抽取公共字段(如
模板配置(Template Config):
- 这里列出了可以生成的文件类型模板。默认通常包括:
entity.java.vm: 实体类模板。mapper.java.vm: Mapper接口模板。mapper.xml.vm: Mapper XML模板。service.java.vm/serviceImpl.java.vm: Service层模板(可能需要手动勾选或自定义)。
- 你可以取消勾选你不需要生成的文件类型。
- 这里列出了可以生成的文件类型模板。默认通常包括:
表配置(Table Config):
- 这里会列出你刚才右键点击的表(
product)。你可以修改生成的文件名、类名。例如,你可以把Product改成ProductEntity,或者把ProductMapper改成ProductDao(虽然不推荐,但插件支持)。
- 这里会列出你刚才右键点击的表(
一个典型的配置示例:
- Package:
com.example.demo.module.product - Base Path:
src/main/java - 勾选
Comment、@Data、@TableName(如果用MyBatis-Plus)、JSR310: Date API。 - 不勾选
Actual Column。 - 在表配置里,确认类名为
Product,Mapper名为ProductMapper。
配置完成后,点击对话框右下角的“Generate”按钮。
3.4 生成结果验收与微调
生成完成后,IDEA会自动在项目结构中打开生成的文件夹。你应该能看到类似如下的文件结构:
src/main/java/com/example/demo/module/product/ ├── entity/ │ └── Product.java └── mapper/ ├── ProductMapper.java └── (如果生成了Service) ├── ProductService.java └── impl/ProductServiceImpl.java src/main/resources/mapper/product/ └── ProductMapper.xml现在,打开Product.java实体类检查一下:
package com.example.demo.module.product.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("product") // MyBatis-Plus注解 public class Product { /** * 主键ID */ private Long id; /** * 产品名称 */ private String productName; /** * 价格 */ private BigDecimal price; /** * 库存 */ private Integer stock; /** * 状态:1-上架,0-下架 */ private Integer status; /** * 创建时间 */ private LocalDateTime createTime; /** * 更新时间 */ private LocalDateTime updateTime; }可以看到,字段名正确转换(product_name->productName),类型映射准确(decimal->BigDecimal,datetime->LocalDateTime),注释完整,Lombok和MyBatis-Plus注解也已就位。
再打开ProductMapper.xml,检查<resultMap>和基础的SQL语句是否都已生成无误。至此,一张新表的基础持久层代码已经全部就绪,你可以立刻开始在Service或Controller中注入ProductMapper进行使用了。
4. 进阶玩法与深度定制:让生成器更懂你的项目
默认的生成模板已经能满足大部分基础需求,但每个团队、每个项目都有自己的规范和特殊要求。MyBatisX Generator的强大之处在于其可定制性。
4.1 自定义生成模板(Velocity Templates)
MyBatisX Generator使用的是Apache Velocity模板引擎。你可以在IDEA的设置中,找到MyBatisX插件的配置项,里面有一个“Templates”或“Template Configuration”的路径。在这个路径下,存放着.vm格式的模板文件。
自定义流程:
- 找到默认模板的存放位置(通常在插件安装目录下),将其复制到你的项目目录或一个自定义目录。
- 在IDEA的MyBatisX设置中,将“Template Path”指向你自定义的模板目录。
- 修改
.vm模板文件。例如,你希望所有实体类都实现Serializable接口,可以在entity.java.vm模板的开头加上implements Serializable,并在顶部添加import java.io.Serializable;。你还可以修改生成的代码风格,比如调整字段和注解的顺序,增加自定义的类注释头(如作者、日期、版权信息)等。
一个简单的自定义entity.java.vm片段示例:
package ${package.Entity}; import java.io.Serializable; ## 导入其他包... import lombok.Data; #if(${table.convert}) import ${cfg.tableAnnotation}; #end /** * <p> * $!{table.comment} 实体类 * </p> * * @author ${author} // 这里可以从配置中读取作者变量 * @since ${date} */ @Data #if(${table.convert}) @${cfg.tableAnnotation}(name = "${table.name}") #end public class ${entity} implements Serializable { // 实现了Serializable private static final long serialVersionUID = 1L; // 添加序列化ID ## 原有字段生成逻辑... #foreach($field in ${table.fields}) /** * ${field.comment} */ private ${field.propertyType} ${field.propertyName}; #end }通过自定义模板,你可以让生成的代码100%符合团队的编码规范,无需每次生成后再手动调整。
4.2 处理复杂表关系与特殊字段
- 逻辑删除字段:很多项目会使用逻辑删除(如
is_deleted字段)。在MyBatis-Plus中,你可以在实体类的对应字段上添加@TableLogic注解。你可以在自定义模板中判断,如果字段名是deleted或is_deleted,则自动为其添加@TableLogic注解。 - 乐观锁版本字段:类似地,对于
version字段,可以自动添加@Version注解。 - 枚举类型映射:对于像
status这样的状态字段,数据库存的是tinyint,但Java中我们更希望使用枚举。生成器本身可能不会直接生成枚举类,但你可以:- 在生成实体类后,手动将
Integer status改为ProductStatusEnum status,并创建对应的枚举类。 - 更高级的做法是,在自定义模板中,通过读取数据库字段的注释(例如注释里写明“1-上架,0-下架”),尝试自动生成一个内部的枚举类或生成枚举字段的映射提示。这需要更复杂的模板逻辑。
- 在生成实体类后,手动将
- 一对一、一对多关系:MyBatisX Generator主要处理单表映射,不直接生成关联查询的复杂SQL。对于关联关系,通常需要在生成基础代码后,手动在XML中编写
<association>或<collection>标签。不过,一些更高级的代码生成器或通过扩展模板,可以基于外键关系初步生成关联查询的骨架代码。
4.3 与MyBatis-Plus的深度结合
如果你使用MyBatis-Plus,MyBatisX Generator的体验会更好。除了生成@TableName等注解,更重要的是要理解MyBatis-Plus的“Active Record”模式和“Service CRUD 接口”。
- Active Record模式:可以让实体类直接继承
Model<T>类,从而拥有insert(),updateById(),selectById()等方法。你可以在生成实体类时,修改模板使其继承Model<T>。 - Service CRUD接口:MyBatis-Plus提供了一个
IService<T>接口和其实现类ServiceImpl<M, T>。你可以配置生成器,直接生成实现了IService的ProductService接口和继承了ServiceImpl的ProductServiceImpl类。这样,你的Service层就自动拥有了大量强大的CRUD和链式查询方法,几乎无需编写任何SQL即可完成复杂操作。这需要你找到或编写支持生成MyBatis-Plus风格Service的模板。
配置示例(在生成时勾选或模板中预设):生成ProductService.java:
public interface ProductService extends IService<Product> { // 可以在这里定义自定义的业务方法 }生成ProductServiceImpl.java:
@Service public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService { // 自动拥有了父类所有的CRUD方法 }5. 避坑指南与最佳实践:我踩过的那些“坑”
工具虽好,但用不对地方或者不理解其原理,也会带来麻烦。下面分享几个我在使用MyBatisX Generator过程中总结的经验和常见问题。
5.1 生成代码后的“第一件事”:仔细检查与二次确认
千万不要生成代码后看都不看就直接运行。务必做一次快速的人工审查:
- 检查字段映射:特别是对于
decimal,datetime,tinyint等类型,确认生成的Java类型(BigDecimal,LocalDateTime,Integer)是否符合你的预期。对于boolean类型的字段,数据库可能是tinyint(1)或bit(1),生成器可能映射为Integer或Boolean,需要你根据业务逻辑确认。 - 检查主键策略:如果使用MyBatis-Plus,确认
@TableId注解是否正确生成,主键策略(IdType.AUTO,IdType.ASSIGN_ID等)是否配置正确。这直接影响数据的插入操作。 - 检查XML中的SQL:打开生成的XML文件,快速浏览一下
<resultMap>和基础的CRUD SQL。虽然生成器很可靠,但检查一下jdbcType的映射(如VARCHAR,INTEGER)和动态SQL标签的闭合,总没有坏处。 - 包路径与导入:确认生成的类所在的包路径是否正确,没有多余的或错误的
import语句。
5.2 当数据库表结构变更时:是覆盖还是合并?
这是最常遇到的问题。比如,你在product表里新增了一个description字段。如何同步到代码?
错误做法:直接重新运行生成器,覆盖原有的Product.java和ProductMapper.xml。这会覆盖掉你之前在手写过程中添加的所有自定义方法、注解和SQL!
正确做法:
- 仅生成缺失的部分(推荐):MyBatisX Generator通常支持“增量生成”。在配置界面,你可以只选择生成新的字段对应的代码片段,或者只生成Entity文件,然后手动将新增的字段复制到已有的Entity类中。对于XML,可以手动将新字段添加到
Base_Column_List的<sql>片段和<resultMap>中,并在insert和update语句的字段列表里加上它。 - 使用版本控制工具:在重新生成前,先提交(commit)你现有的、包含自定义代码的文件。然后生成覆盖,再使用Git等工具的对比(diff)功能,将生成的新代码(主要是新增字段)与你的自定义代码进行合并。这需要一些Git操作技巧,但非常安全。
- 自定义模板与字段同步工具:更高级的做法是,维护一个高度自定义的模板,并配合使用一些IDE插件或脚本,能够智能地对比数据库和实体类的差异,只进行增量更新。但这通常需要较高的定制成本。
核心原则:生成器只负责生成“基础”的、通用的、不变的代码。任何业务相关的、自定义的代码,都应该与生成器生成的代码物理分离或逻辑隔离。例如,自定义的查询方法写在另一个Mapper接口中(通过继承或组合),或者使用MyBatis-Plus的
@Interceptor等方式扩展。
5.3 多模块项目与代码存放位置的规划
在大型项目中,我们常采用多模块架构,比如demo-api(接口定义)、demo-service(业务实现)、demo-dao(数据访问)。那么,生成的Entity、Mapper、XML应该放在哪个模块?
常见实践:
- Entity (POJO):通常放在一个独立的模块(如
demo-common或demo-model)中,因为实体类是所有层(Controller, Service, Dao)都可能用到的数据载体。也可以放在demo-dao模块里,如果Dao层是唯一使用它的地方。 - Mapper接口与XML:毫无疑问,应该放在数据访问层模块(
demo-dao或demo-mapper)中。 - Service接口及实现:放在业务层模块(
demo-service)中。
在MyBatisX Generator配置时,你需要仔细选择“Module”和“Package”,确保生成的代码被放置到正确的模块和包路径下。一个清晰的模块化划分,能极大提升项目的可维护性和团队协作效率。
5.4 性能与可维护性的权衡
使用代码生成器可能会带来一些可维护性上的考量:
- 生成的代码是否应该被提交到版本库?我的建议是:应该提交。原因有三:首先,它保证了任何克隆项目的人都能立即获得一套完整、可编译的代码,无需自己再运行生成器(生成器可能依赖特定的数据库连接或配置)。其次,它是项目在某个时间点状态的准确记录。最后,在代码评审时,可以清晰地看到数据库表结构变更对代码的影响。当然,你需要确保团队都使用相同版本的生成器和模板。
- XML文件过大问题:如果一个表的字段非常多(几十上百个),生成的XML文件可能会非常庞大,特别是
<resultMap>会很长。这可能会影响IDE的解析速度。一个优化方案是,对于超宽表,考虑将其拆分为多个逻辑实体,或者使用MyBatis的<resultMap>继承特性,将基础字段映射提取到父<resultMap>中。 - 动态SQL的灵活性:生成器生成的SQL通常是静态的。对于复杂的多条件组合查询,你可能需要手动编写或使用MyBatis-Plus的
QueryWrapper来构建动态SQL。不要试图让生成器生成所有可能的查询变体,那样会导致代码爆炸。生成器提供基础,你在此基础上进行扩展,这才是正确的使用姿势。
6. 横向对比:MyBatisX Generator与其他代码生成方案
市面上并非只有MyBatisX Generator这一种选择。了解其他工具,能帮助你更好地做出技术选型。
| 工具/方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| MyBatisX Generator (IDEA插件) | 1. 无缝集成IDE,操作流畅,无需离开开发环境。 2. 配置可视化,通过图形界面配置,上手简单。 3. 实时预览,部分配置可实时看到生成效果。 4. 模板可定制,支持Velocity模板,灵活性高。 | 1. 依赖特定IDE,必须在IntelliJ IDEA中使用。 2. 批处理能力弱,通常一次操作一张表,对大量表操作效率较低。 3. 高级功能(如生成Service)可能需要自定义模板。 | 日常开发、快速原型、单表CRUD生成。适合在IDEA中进行日常开发的个人或团队,追求开发时的便捷和流畅体验。 |
| MyBatis Generator (MBG) | 1. 官方出品,历史悠久,生态成熟,文档丰富。 2. 独立运行,可通过Maven插件、命令行、Java程序调用,不依赖IDE。 3. 功能强大,支持生成Example类、带复杂条件的CRUD,插件体系丰富。 4. 批处理能力强,可一次性生成整个数据库或指定表。 | 1. 配置复杂,需要编写XML配置文件,学习成本较高。 2. 与项目构建流程耦合,通常集成在Maven/Gradle构建生命周期中。 3. 生成代码风格固定,定制化需要编写插件,门槛高。 | 项目初始化、数据库反向工程、需要高度定制化生成逻辑。适合在项目搭建初期,需要一次性为大量表生成基础代码,或者有非常特殊生成需求的场景。 |
| MyBatis-Plus 代码生成器 | 1. 与MyBatis-Plus深度绑定,生成的代码天然支持MP的所有特性(如Service CRUD接口、Active Record)。 2. 配置相对简单,通常通过一个 FastAutoGenerator类进行链式配置。3. 功能全面,默认支持生成Entity、Mapper、XML、Service、Controller甚至前端代码。 | 1. 强耦合于MyBatis-Plus,如果你不用MP,则无法使用。 2. 代码侵入性较强,生成的Controller等可能不符合你的项目架构。 3. 同样需要编写配置代码,不如图形界面直观。 | MyBatis-Plus项目、快速搭建全栈CRUD后台。适合那些采用MyBatis-Plus作为ORM框架,并且希望快速生成包含前后端代码的完整功能的项目。 |
| 手工编写 | 1. 绝对控制,代码完全符合个人或团队习惯。 2. 无任何依赖,不需要学习额外工具。 3. 灵活性最高,可以处理任何复杂的、生成器无法处理的场景。 | 1. 效率极低,重复劳动,容易出错。 2. 一致性难以保证,不同人、不同时间写的代码风格可能有差异。 3. 维护成本高,表结构变更时需要同步修改多处。 | 极其特殊的表结构、探索性项目、或团队严格禁止使用生成器。一般情况下不推荐。 |
如何选择?
- 如果你是IntelliJ IDEA用户,并且开发节奏快,需要频繁应对单张表的增删改查需求,那么MyBatisX Generator是你的不二之选,它的便捷性无与伦比。
- 如果你在项目初始化阶段,需要为几十上百张表一次性生成基础代码,或者需要集成到CI/CD流程中,那么MyBatis Generator (MBG)更合适。
- 如果你的项目核心框架就是MyBatis-Plus,并且希望快速搭建一个标准的管理后台,那么MyBatis-Plus自带的代码生成器可能是最配套的。
- 最终,很多团队会采用“组合拳”:在项目初期用MBG或MyBatis-Plus生成器做批量初始化;在后续迭代中,开发人员使用MyBatisX插件进行单表的快速增删和微调。