ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

EasyCode插件实战:从数据库表到实体类一键生成,告别手写痛苦

EasyCode插件实战:从数据库表到实体类一键生成,告别手写痛苦 写实体类这事乍一看没什么技术含量但真正在项目里待过的人都知道一个几十张表的业务系统光是对着表结构手敲实体类就能把人敲到怀疑人生。字段多、类型多、注释还不统一最难受的是数据库一改字段代码里的实体类、Mapper、XML又要跟着手工同步一遍漏一个就是线上事故。所以当我第一次在 IDEA 里用 EasyCode 这个插件右键点了一下数据库表整套实体类代码直接生成出来的时候那个感觉就是四个字早该如此。EasyCode 的核心能力很简单它通过读取 IDEA 数据库面板里的表结构信息再套用你预先定义好的 Velocity 模板自动生成 entity、mapper、service、controller 等代码。说白了它就是把“照着数据库表敲代码”这件事变成了“配置一次模板之后一直复用”。这篇文章我就用我实际项目中从 MySQL 表到实体类生成的完整流程把 EasyCode 从安装、连接数据库、自定义模板到最后的坑位排查一次性讲清楚。不管你是刚用 IDEA 的 Java 新手还是已经在用 MyBatis-Plus 但受够了手写重复代码的老手这篇内容都能直接拿来落地。1. 为什么我劝你别再手动写实体类1.1 手动写实体类的三个痛点先说最现实的痛点效率低。数据库里一张表十几个字段每个字段要写对应的驼峰属性、Java 类型、注释看起来很简单但是一张表一张表去写写个二十张表之后你的耐心基本就清零了。我自己经历过一个项目光核心表就五六十张当时团队里两个人分工手动建实体类整整写了两天半而且写完还得自己复查一遍字段有没有少、类型有没有对错。第二个痛点是数据库结构和代码不同步。产品经理说加一个字段DBA 把表改了开发人员如果没及时同步实体类编译不报错但运行时查出来的对象永远是缺字段的。这种情况非常隐蔽我第一次踩的时候是查订单数据列表里始终少一个“支付方式”找了一下午才发现是实体类没有同步表结构。自动生成就能很大程度避免这种“人肉同步”的失误。第三个痛点是项目规范很难统一。有人喜欢用 Lombok 的Data有人喜欢手写 getter/setter有人主键用Long有人用Integer类型映射五花八门。手动写代码每个人的习惯不一样代码风格就乱了。而用 EasyCode 生成模板是统一固化的Java 类型映射也是统一配置的生成出来的实体类一眼看过去全项目一个风格代码评审的时候能少吵很多架。1.2 EasyCode 是怎么把这事变简单的EasyCode 本质上是由两部分组成的一部分是 IDEA 内置的数据库连接能力另一部分是插件自带的 Velocity 模板引擎。你在 IDEA 右侧的 Database 面板里配置好数据库连接后IDEA 就能拿到每张表的字段名、字段类型、注释、主键信息。EasyCode 干的事就是把这些元数据按固定规则取出来塞到模板里渲染成 Java 文件。因为模板是你自己控制的所以理论上你不仅能用它生成实体类还能生成 Mapper 接口、XML 文件、Service、Controller甚至生成前端表单页只要你会写 Velocity 模板它都能批量输出。这也是我第一次用的时候感受到的“质感”它不只是帮你省了手敲时间而是把整个代码生成的规则沉淀成了团队资产。换人也好新项目也好模板一配全部项目统一风格效率和安全都上来了。2. 出发前先做好这些准备2.1 安装 EasyCode 插件安装这一步没有任何难度打开 IDEA进入 File → Settings → Plugins在 Marketplace 搜索栏里输入 EasyCode找到图标是一个闪电样子的插件作者是 makejava点击 Install 安装然后重启 IDEA 就可以了。社区版和付费版 IDEA 都支持不存在版本上大的兼容问题我用的是 2023.2 版本实测没有问题。安装完成之后可以看到工具栏多了一些 EasyCode 相关设置入口位置在 Settings → Other Settings → EasyCode。如果没有看到这个菜单大概率是插件没装成功或者 IDEA 没重启先重启一次再说。这里提醒一句插件市场里可能有名字相似的其他代码生成插件比如 EasyCode MybatisPlus 扩展之类的你可以根据自己的需要选但基础核心还是这个 EasyCode。团队里如果多个人协作建议每个人装同一个版本避免模板变量差异导致生成结果不一致。2.2 让 IDEA 连上你的数据库EasyCode 本身不管理数据库连接它依赖的是 IDEA 自带的 Database 面板所以像接线一样先把这一步打通后面才能生成代码。操作路径是IDEA 右侧栏找到 Database → 点左上角的 → 选择 Data Source → 选 MySQL。然后填这几项Host数据库地址本地就是 localhost 或 127.0.0.1Port默认 3306Database要连接的库名User / Password数据库账号密码填完之后建议先点一下 Test Connection 做连接测试。如果这里都报错后面所有步骤都不用做了。我第一次连接生产库的时候遇到过一个问题本地 IDEA 连不上测试环境数据库报错信息是连接超时或者 Access denied。超时一般是网络权限或防火墙问题Access denied 就是账号密码不对或者该账号没有远程访问权限。这种情况找 DBA 开一下当前 IP 的白名单就行注意让 DBA 顺手确认下账号有没有对应库的 SELECT、SHOW VIEW 权限EasyCode 读取表结构需要这些权限。连接成功之后左侧会列出库里的所有表到这一步准备工作就做完了。3. 核心配置模板和类型映射才是灵魂3.1 理解 EasyCode 的执行流程和模板变量很多人用 EasyCode 只点下一步生成出来的代码风格自己不满意就开始吐槽插件不好用。其实 EasyCode 真正厉害的地方不在于开箱即用的模板而在于模板完全开放你想让它生成什么样它就能生成什么样。EasyCode 模板语言用的是 Velocity它的本质是一个文本渲染过程。EasyCode 会把表信息封装成一系列对象然后模板里用$符号引用这些对象循环拼接出最终代码。最常用的变量就这么几个${tableInfo.name}表名经过驼峰转换后的实体类名比如表t_user生成后是User${tableInfo.obj.name}数据库里的原始表名比如t_user${tableInfo.comment}表注释${tableInfo.fullColumn}所有字段的集合每个元素里有字段名、字段类型、注释等信息${packageName}你在生成时填写的包路径${importList}根据字段类型推断出来的需要 import 的 Java 包列表字段集合里的每个字段常用的属性有${column.name}驼峰转换后的属性名比如userName${column.obj.name}数据库原始字段名比如user_name${column.shortType}Java 类型简写比如Long、String${column.comment}字段注释理解这些变量的最简单方式就是先看插件内置的模板。打开 Settings → Other Settings → EasyCode → Template Config里面预置了好几个模板文件后缀都是.vm你点开看一遍就知道它大概是怎么写的了。3.2 自定义一套实体类模板根据实际项目对接 MyBatis-Plus 的情况我自己常用的实体模板简化后大概是下面这个样子package ${packageName}.entity; ## 导入相关包 #foreach($import in $importList) import $!{import}; #end import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; Data TableName(${tableInfo.obj.name}) public class ${tableInfo.name} { private static final long serialVersionUID 1L; #foreach($column in $tableInfo.fullColumn) /** * $!{column.comment} */ private $!{column.shortType} $!{column.name}; #end }这段模板的核心逻辑很简单先声明包名然后用#foreach循环把importList里的包逐个 import 进来再通过一次#foreach遍历fullColumn的每个字段输出注释和私有属性。表名上通过TableName(${tableInfo.obj.name})直接把实体类和物理表名做映射这样哪怕实体类叫User、表叫t_userMyBatis-Plus 也能精确对应上不用额外写注解。你说这个模板是不是最好的不一定。但它至少能做到两件事一是实体类风格统一二是字段和表结构严格对齐。你拿到模板之后完全可以根据自己的项目继续加比如给主键字段加TableId注解给逻辑删除字段加TableLogic给乐观锁字段加Version这些都是在一个小模板改动里就能完成的。3.3 Type Mapper数据库类型到 Java 类型的映射模板负责生成代码的“形状”但字段到底映射成Long还是Integer映射成LocalDateTime还是Date这是 Type Mapper 管的。打开 Settings → Other Settings → EasyCode → Type Mapper能看到一张映射表左边是数据库类型右边是 Java 类型。默认的一些映射怎么说呢能用但不够现代。比如我见过有的项目默认把datetime映射成Date现在主流项目基本都用LocalDateTime所以我会把映射改成这样数据库类型默认 Java 类型推荐 Java 类型bigintLongLongintIntegerIntegervarcharStringStringdatetimeDateLocalDateTimetimestampDateLocalDateTimedecimalBigDecimalBigDecimaltinyintIntegerInteger改成LocalDateTime之后模板里的importList会自动带上java.time.LocalDateTime不需要你手动去补。这里有一个小提醒Type Mapper 的修改是全局生效的影响所有使用该 IDEE 配置的项目。如果不同项目之间对类型的要求不一样比如有个老项目还在用Date新项目想用LocalDateTime那就建议在项目根目录放.idea配置或者切换项目时手动检查一下映射。别小看这一步我用 EasyCode 的时候十次有八次生成的实体类不满意的原因都是 Type Mapper 没调好。4. 实操从数据库表到实体类只要三步4.1 选定表和包路径生成代码现在进入正题。假设我们有这样一张用户表CREATE TABLE t_user ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID, user_name varchar(64) DEFAULT NULL COMMENT 用户名, age int(11) DEFAULT NULL COMMENT 年龄, create_time datetime DEFAULT NULL COMMENT 创建时间, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表;在 Database 面板里右键点击这张t_user表菜单里选择 EasyCode → Generate Code。接下来会弹出一个生成配置窗口需要确认的核心有这几项Package name你要生成的包路径比如com.example.demo勾选要生成的模板这里只勾 Entity 就行生成方式选择按包路径生成到模块 src/main/java 目录点击 OK 之后IDEA 会自动创建com/example/demo/entity/User.java文件内容大概长这样package com.example.demo.entity; import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; Data TableName(t_user) public class User { private static final long serialVersionUID 1L; /** * 主键ID */ private Long id; /** * 用户名 */ private String userName; /** * 年龄 */ private Integer age; /** * 创建时间 */ private LocalDateTime createTime; }整个过程不需要你敲一行业务代码表结构里的注释也一并生成成了 Javadoc非常清楚。4.2 生成之后的检查清单代码生成出来不等于结束我会根据自己的经验做一个快速检查清单强烈建议你也养成这个习惯第一检查主键字段。如果你的实体类后续要对接 MyBatis-Plus那主键建议加上TableId(type IdType.AUTO)注解否则默认主键策略容易和你表里的 AUTO_INCREMENT 对不上。这个在模板里可以直接写但默认模板不一定有。第二检查类型映射。看createTime是不是LocalDateTime、金额字段是不是BigDecimal这些最容易出错因为数据库里的decimal(10,2)如果 Type Mapper 没配置好可能会被映射成double精度问题在钱上可不是小事。第三检查序列化版本号。实体类如果实现了Serializable最好有一个固定的serialVersionUID模板里建议直接写死一个比如1L省得每个类都是生成器随机出来的值看着不统一。第四检查无参构造和全参构造。如果项目的工具类里依赖 JSON 反序列化最好确保实体类有无参构造。用 Lombok 的Data注解会帮你生成无参构造但如果手写 getter/setter 的话无参构造可能就没有了这个要看业务场景。4.3 批量生成多张表时的建议单表生成你会了之后批量生成其实很简单在 Database 面板里用 Ctrl 或 Shift 多选几张表甚至全选然后右键 EasyCode → Generate Code配置一次包名所有选中的表就会一次性生成。不过批量之前我建议你先单表跑通一次模板确认生成的代码风格没问题再批量执行。如果模板有问题批量生成出来的所有代码都有问题返工很痛苦。我个人的习惯是第一天先在测试环境用一张业务表试跑确认没问题后再对全量表批量生成并且生成完只提交到本地等 review 之后才推远程。另外批量生成时要特别注意包路径。EasyCode 会把每张表生成独立的类文件如果你勾选了 Controller、Service、Mapper 等多个模板一次生成可能产生四五个文件包路径千万要看清楚别一股脑生成到了测试目录甚至resources底下。5. 实战中踩过的坑和排查技巧5.1 数据库连接失败这是 EasyCode 使用过程中最容易遇到、也最劝退新手的一关。常见报错无非两种一种是连接超时一种是Access denied for user。超时的话先确认是不是本地网络无法访问目标数据库。我自己遇到过一个情况公司的测试库只开了内网访问而我连的是外网 WiFi自然是连不上的。这种情况让你的电脑接入公司内网或者用跳板机转发是运维层面的问题。Access denied就相对简单就是账号权限有问题。先检查密码再检查账号是否有访问指定库的权限。还有一个隐藏点MySQL 8.0 之后默认加密插件是caching_sha2_password老版本的驱动可能不兼容如果你用的还是若干年前的连接驱动建议更新一下或者让 DBA 确认连接用户能用对应协议。5.2 生成的实体类字段没有转驼峰如果你生成出来的属性名还是user_name这种下划线风格说明命名策略没生效。EasyCode 本身是带驼峰转换的但前提是设置里没有关掉。在 Settings → Other Settings → EasyCode 里注意看 “Use Camel Case” 之类的选项确保它是开启状态。如果开了还是不行那你可能是把模板里写成了$!{column.obj.name}而不是$!{column.name}。这两个变量的区别我前面说过前者是原始列名后者是转换后的属性名。找一下模板改成$!{column.name}就好了。5.3 生成出来的代码风格“又老又土”默认模板生成的实体类经常带Getter Setter注解然后手写一个toString格式化也让人不顺眼。这不是插件的问题而是你没改模板。我建议拿到插件之后第一件事不是急着生成而是先花半小时把模板改成自己项目的风格。把 Lombok 的Data换上把序列化版本号写死把逻辑删除字段处理逻辑加到模板里等这些都调顺了后面生成一次爽一次。网上有很多人的 EasyCode 模板分享搜一下关键词就能找到不少可以参考的但你得能看懂模板变量不然抄过来也不知道为什么这么写。5.4 生成的文件不在预期目录这种事我也遇到过。明明填了 Package name 是com.example.entity但生成完去src/main/java下面找没找到文件跑到了别的模块或者直接生成到了src/main/resources下。原因基本是两个一是生成配置窗口里没选对 Module 路径EasyCode 允许你指定生成到哪个模块下的哪个目录二是 IDEE 打开的项目没有正确识别为 Maven/Gradle 工程导致它把根路径判断错了。检查一下生成路径配置点 Generate Code 之前看预览确认生成路径逻辑没问题再执行。5.5 编译报错提示找不到 Lombok 相关方法生成出来的代码用了Data但项目里没有引入 Lombok 依赖编译直接报找不到符号 getXxx()。这不是 EasyCode 的问题是你项目环境的问题。用 Maven 的话在pom.xml里加依赖dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency并且确认 IDEA 里安装了 Lombok 插件然后开启 Annotation ProcessingSettings → Build, Execution, Deployment → Compiler → Annotation Processors勾选 Enable annotation processing。这一步不做即使依赖加了IDEA 编译阶段也识别不了 Lombok 注解。5.6 想生成更完整的体系代码怎么办实体类只是 EasyCode 的起点。实际项目里你完全可以把 Mapper 接口、Mapper XML、Service、ServiceImpl、Controller 都通过模板生成出来。我自己现在的项目里就是一条 SQL 都不用写基础 CRUD 的模板里生成 Mapper 接口继承BaseMapperTService 继承IServiceTController 里自动拼出标准 RESTful 接口。如果你刚接触 EasyCode我建议你先从 Entity 模板下手把它调通再逐步加 Mapper 模板最后再上 Controller。一口吃不成胖子模板这东西一旦加多了变量之间的依赖关系容易乱分步来反而稳。最后再分享一个我个人的体会任何自动代码生成工具本质是“把人的规范翻译成机器能执行的规则”。它最大的价值不是让你少写那几十行字段而是逼着你把代码规范、命名规范、类型规范想清楚。你在模板上花的时间会在之后每一个生成的文件里连本带利赚回来。EasyCode 是我用过的 IDEA 里最实在的生产力插件之一越早把它配置成自己顺手的样子后面的开发就越省心。
返回列表