做过 Java 后端开发的同学都熟悉这套流程:每写一个业务模块,就要重复创建 Entity.java、Mapper.java、Mapper.xml、Service.java、ServiceImpl.java、Controller.java 这 6 个文件。每个文件里的字段映射、CRUD 方法、注解配置基本都是模板化的——一个 10 张表的中型项目,光是写这些脚手架代码就要花掉 2-3 天。
更痛的是数据库字段改了:实体类要改、Mapper.xml 要改、Service 要改、Controller 可能也要改。漏改一个字段就是 bug,回过头排查浪费的时间比手写还多。代码生成器就是解决这个痛点的工具——输入 CREATE TABLE SQL,自动产出符合规范的三层架构代码,10 张表的脚手架从 2 天压缩到 10 分钟。
一、主流方案对比:哪种 Java 代码生成方式最适合你?
| 方案 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| 手写 | 完全可控 | 效率低、易出错、改字段痛苦 | 1-2 张表的极小项目 |
| MyBatis Generator(MBG) | 官方出品、稳定 | 配置 XML 麻烦、不生成 Service/Controller | 传统 MyBatis 项目 |
| IDEA 插件(EasyCode) | 集成开发环境 | 依赖 IDEA、模板自定义门槛高 | 固定一台电脑开发 |
| 在线生成器(优途66) | 免安装、浏览器即用、完整三层架构 | 需联网 | 绝大多数项目(推荐) |
我个人现在主力用 优途66 Java 代码生成器——免安装、跨设备、生成的代码质量稳定,关键是一个工具能同时生成 Entity、Mapper、Mapper.xml、Service、ServiceImpl、Controller 全套代码,不用再拼接多个工具的输出。
二、5 分钟生成一个完整模块:四步极简操作
工具采用"输入 SQL → 选框架 → 配选项 → 一键生成"的极简流程,全程浏览器完成,无需安装任何软件。
- 第 1 步:准备 CREATE TABLE SQL:写好建表语句,每个字段加 COMMENT 注释;
- 第 2 步:粘贴到工具,选择框架:MyBatis-Plus / MyBatis / JPA 三选一;
- 第 3 步:配置包名、类名、选项:包路径、Lombok、Swagger、Controller 返回类型;
- 第 4 步:一键生成并复制:6 个文件代码同时产出,独立复制按钮,直接粘贴到 IDE。
三、SQL 输入示例:用户表建表语句
代码生成器的输入是标准的 DDL 语句。以一个用户表为例:
📄 sys_user.sql(建表语句)
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`status` tinyint(4) DEFAULT 1 COMMENT '状态:0禁用 1启用',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
💡 关键点:每个字段都要写 COMMENT,生成器会自动把注释写到 Entity 字段和 Swagger @ApiModelProperty 上。
四、生成的代码示例(MyBatis-Plus 完整套件)
工具会同时产出 6 个文件,下面是核心 4 个文件的代码示例,可直接复制到 IDE 使用。
@TableName + @TableId + @TableField + Lombok @Data + Swagger 注解齐全
继承 BaseMapper,自带 insert/updateById/selectById 等 CRUD 方法
继承 IService 和 ServiceImpl,自带 save/page/list 等方法
RESTful 接口 + @Api 文档 + CommonResult 统一返回
📄 SysUser.java(Entity 实体类)
@Data
@TableName("sys_user")
@ApiModel(value = "用户表", description = "用户表")
public class SysUser implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "用户ID")
private Long id;
@TableField("username")
@ApiModelProperty(value = "用户名")
private String username;
@TableField("password")
@ApiModelProperty(value = "密码")
private String password;
@TableField("email")
@ApiModelProperty(value = "邮箱")
private String email;
@TableField("status")
@ApiModelProperty(value = "状态:0禁用 1启用")
private Integer status;
@TableField(value = "create_time", fill = FieldFill.INSERT)
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
}
📄 SysUserMapper.java(Mapper 接口)
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
}
📄 SysUserService.java + SysUserServiceImpl.java(Service 层)
public interface SysUserService extends IService<SysUser> {
}
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
implements SysUserService {
}
📄 SysUserController.java(Controller 接口层)
@RestController
@RequestMapping("/sys/user")
@Api(tags = "用户管理")
public class SysUserController {
@Resource
private SysUserService sysUserService;
@PostMapping("/add")
@ApiOperation("新增用户")
public CommonResult<Boolean> add(@RequestBody SysUser sysUser) {
return CommonResult.success(sysUserService.save(sysUser));
}
@GetMapping("/list")
@ApiOperation("分页查询用户")
public CommonResult<IPage<SysUser>> list(
@RequestParam(defaultValue = "1") Integer current,
@RequestParam(defaultValue = "10") Integer size) {
return CommonResult.success(
sysUserService.page(new Page<>(current, size)));
}
}
这套代码可以直接跑——继承 BaseMapper 后自带 insert/updateById/selectById/deleteById 等方法,IService 自带 save/saveBatch/page/list 等方法,不用写一行 SQL 就能完成基础 CRUD。
五、进阶技巧:让生成的代码更规范
- SQL 字段用下划线:生成器自动把
create_time转成createTime,user_id转成userId; - 主键策略要选对:AUTO_INCREMENT 用
IdType.AUTO,雪花算法用IdType.ASSIGN_ID,UUID 用IdType.ASSIGN_UUID; - 自动填充字段:create_time 和 update_time 勾选"自动填充",配合 MetaObjectHandler 实现自动注入;
- 包名按阿里规范:controller / service / mapper / entity / config 五层分包。
📁 推荐包结构
com.example.demo
├── controller // Controller 层
├── service // Service 接口
│ └── impl // Service 实现
├── mapper // Mapper 接口
├── entity // 实体类
└── config // 配置类
六、常见问题 FAQ
Q1:生成的代码报"Invalid bound statement"怎么办?
这是 MyBatis 找不到 Mapper.xml 的常见问题。检查 application.yml 配置:mybatis-plus.mapper-locations: classpath*:/mapper/**/*.xml
Q2:能生成 LambdaQueryWrapper 风格的查询吗?
可以。LambdaQueryWrapper 不需要生成器支持,直接在 Service 里用 sysUserService.lambdaQuery().eq(SysUser::getStatus, 1).list() 即可。
Q3:支持生成 Vue/React 前端代码吗?
当前版本只生成 Java 后端代码。前端代码建议用 优途66 其他工具配合手写,或者用若依、JeecgBoot 这类开源后台框架。
Q4:商业项目能用吗?
能。优途66 Java 代码生成器完全免费、免登录、无水印,生成的代码归你自己所有,可商用、可修改、可闭源。
七、总结:把重复劳动交给工具
Java 后端开发里,脚手架代码是 100% 模板化的——既然是模板化的,就不该用手写。用代码生成器把 2 天的工作压缩到 10 分钟,省下的时间用来写真正有业务逻辑的代码、做架构设计、或者干脆早下班。
如果你在用 MyBatis(非 Plus 版),可以看我的另一篇教程:MyBatis Mapper.xml 手写常见坑与避坑指南。