Java 实体类怎么自动生成?MyBatis-Plus 三层架构代码一键生成方案(含完整示例)

做过 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 → 选框架 → 配选项 → 一键生成"的极简流程,全程浏览器完成,无需安装任何软件。

三、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 使用。

📄 Entity 实体类

@TableName + @TableId + @TableField + Lombok @Data + Swagger 注解齐全

🔌 Mapper 接口

继承 BaseMapper,自带 insert/updateById/selectById 等 CRUD 方法

⚙️ Service + ServiceImpl

继承 IService 和 ServiceImpl,自带 save/page/list 等方法

🎯 Controller

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 转成 createTimeuser_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 分钟,省下的时间用来写真正有业务逻辑的代码、做架构设计、或者干脆早下班。

立即使用优途66 Java 代码生成器

免安装 · 免登录 · 浏览器打开即用

👉 点击立即使用

如果你在用 MyBatis(非 Plus 版),可以看我的另一篇教程:MyBatis Mapper.xml 手写常见坑与避坑指南