ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

EasyCode插件实战:从数据库表一键生成CRUD代码

EasyCode插件实战:从数据库表一键生成CRUD代码 1. 项目概述1.1 为什么是EasyCode——先聊聊CRUD代码生成的痛点做了这么多年Java后端开发我相信绝大多数人对CRUD代码的编写都不陌生。一个典型的业务模块落地无外乎就是对着数据库表写entity、写mapper、写service、写controller有的项目还要加上DTO、VO、Query对象。这套流程熟练之后写起来倒是不难但架不住它量大、重复、枯燥。更让人头疼的是每个项目的基础代码结构还不一样有的团队用MyBatis有的用MyBatis-Plus有的用JPA有的项目要返回统一Result对象有的项目要加Swagger注解有的项目要把逻辑删除、创建时间、更新时间这些公共字段做进基类里。手写的结果就是——每个程序员敲出来的代码风格差异很大即使同一个团队张三的mapper写法和李四的也不太一样代码Review的时候就很痛苦。EasyCode这个插件解决的就是这个问题。它基于IDEA内置的数据库工具连接上数据库之后可以直接根据数据表结构一键生成整套CRUD代码包括entity、mapper、dao也就是mapper接口、service、service实现类、controller。不用手工写任何一行CRUD基础代码。最关键的是它的模板是完全开放、可定制的——生成出来的代码长什么样完全由你的模板决定。这个特性意味着什么意味着只要你把模板调整成符合自己团队规范的样子那么全团队任何人用这个插件生成代码出来的都是同一套风格。复用性、规范性、上手成本全都解决了。1.2 这篇文章能帮你解决什么问题本文面向的读者是正在使用或准备使用IDEA进行Java后端开发的朋友不管你是刚入行的新人还是写了好几年CRUD想提升效率的老手这篇文章都值得你看完。我会从零开始一步步讲解EasyCode插件的安装、配置、数据库连接、模板定制直到最终一键生成整套代码的完整流程。过程中会穿插我在实际项目中踩过的坑、调过的模板、优化过的细节。内容尽量做到看完就能照着操作操作就能跑通并且让你能根据自己的项目结构调整模板而不是停留在插件默认模板的水平上。2. 环境准备与插件安装2.1 IDEA版本与基础环境要求EasyCode是IDEA平台上的插件支持IntelliJ IDEA的社区版Community Edition和旗舰版Ultimate Edition。这里要特别说明一下很多朋友误以为数据库功能是旗舰版专属实际上EasyCode本身调用的是IDEA内置的Database工具窗口社区版在较新版本中同样可以使用基础的数据库连接功能。不过要把生成代码的能力发挥到最大我建议尽量使用旗舰版因为旗舰版对数据库驱动的支持更完善尤其是一些老旧的数据库驱动版本社区版偶尔会连接不上。IDEA版本方面EasyCode目前对2019.x以上的版本支持比较完善建议使用2020.3以上版本。太老的版本可能会出现插件加载异常、UI错位等小毛病。另外既然要做Java Web开发JDK 1.8及以上环境是必须的建议直接上JDK 8或者JDK 11这两个版本是当前企业项目中使用最广泛的。Maven也需要提前装好并配置好镜像源。因为生成的代码里会引用一大堆依赖比如MyBatis、MyBatis-Plus、Lombok、Swagger、PageHelper等等这些依赖都需要通过Maven从中央仓库拉取。如果你所在的网络环境访问Maven中央仓库比较慢建议在settings.xml里配置国内镜像源比如阿里云的Maven镜像这能省下大量等待时间。提示在开始安装插件之前先把IDEA、JDK、Maven这三样基础环境搞定是顺利操作的前置条件。环境不打好后面配置再正确也会因为各种莫名其妙的报错而卡住。2.2 插件安装的两种方式EasyCode插件的安装非常简单直接在IDEA里操作即可。第一种方式打开IDEA依次进入File - Settings - Plugins在搜索框中输入EasyCode找到名为EasyCode的插件注意别装成别的同名插件点击Install按钮等待安装完成后重启IDEA即可。第二种方式如果你因为网络原因无法在IDEA插件市场中搜索到插件可以到JetBrains插件官网直接下载插件的ZIP包然后在IDEA中通过Install Plugin from Disk选择该ZIP包进行离线安装。这种方式适合内网环境或者网络受限的场景。装好插件之后IDEA右侧会多出一个EasyCode的工具窗口同时右键菜单中也会出现EasyCode相关选项。到这一步插件本身已经装好了但距离真正生成代码还差一个关键环节——配置数据库连接。2.3 创建Spring Boot项目作为代码生成的落点生成代码总得有个工程放进去所以我建议先创建一个标准的Spring Boot工程。这里也一并解决很多新手朋友在热搜词里反复搜的问题如何在IDEA中创建Spring Boot项目。打开IDEA选择File - New - Project左侧选择Spring Initializr对应填写Group和Artifact信息比如Group填com.exampleArtifact填demo。然后点击Next选择Spring Boot版本建议选择2.x的最新稳定版本3.x版本目前生态兼容性还不够好MyBatis等组件的适配还不算完美勾选Web、MyBatis、MySQL Driver这几个依赖点击Finish即可。如果你的IDEA社区版不支持Spring Initializr个别版本有这个问题也可以直接到Spring官网的Spring Initializr页面生成一个工程压缩包下载后解压再用IDEA以Maven项目的方式打开。效果完全一样。创建完工程之后先在pom.xml中确认以下核心依赖至少是完整的dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.2.2/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency另外Lombok依赖也建议加上因为EasyCode默认的entity模板就是基于Lombok注解来简化getter/setter的dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency到这一步基础工程脚手架就已经搭建好了。接下来进入整个流程中最关键的一步——配置数据库连接。3. 数据库连接与表结构分析3.1 在IDEA中配置数据库数据源EasyCode生成代码的素材来源就是数据库的表结构信息。因此把数据库连接配置好是前置中的前置。在IDEA右侧找到Database工具窗口点击加号 - Data Source - MySQL。然后填写如下关键信息Host数据库服务器地址本地就填localhostPortMySQL默认3306Database要生成代码的目标数据库名称User、Password数据库账号、密码填完之后建议先点击Test Connection按钮确认能显示Connection successful再点OK。如果连接失败一般就是驱动没下载、账号密码错、数据库端口不通这三种情况。驱动问题可以在Data Source设置界面的Driver部分选择对应版本的MySQL驱动让IDEA自动下载。连接成功后在Database窗口中展开对应的数据库就能看到所有的表。这时候建议先不急着生成先花点时间检查一遍表结构每张表是否有主键、主键是否为自增、字段注释是否完善、字段命名是否规范比如下划线命名法。因为这些信息会直接决定后面生成出来的实体类质量。3.2 表结构设计对生成代码的影响——实话说在前面这里要提前打个预防针EasyCode是一个表结构驱动的代码生成器你表设计得乱生成出来的代码就乱表设计得规范代码就规范。别指望它能把烂表结构自动优化成好代码。具体来说有几个影响比较大的点第一主键。每张表都应该有一个明确的主键而且主键最好命名为id。EasyCode的默认模板会根据主键生成对应的实体属性并在mapper中生成根据主键查询、更新的方法。如果一张表没有主键或者主键是联合主键生成代码的时候可能会漏掉一些方法或者生成的代码逻辑不对。第二字段注释。数据库字段的COMMENT信息会直接映射为entity中字段上的注释。比如你在建表语句中写了remark varchar(255) COMMENT 备注那么生成的entity中remark字段上就会自动带着“备注”这个注释并且Swagger的ApiModelProperty注解描述也会自动使用这个注释。所以建表时多花几秒写注释后面能省下大量补注释的时间。第三字段类型。MySQL的datetime对应Java的Datevarchar对应Stringbigint对应Longint对应Integerdecimal对应BigDecimal。这些映射规则EasyCode内置好了一般不需要改。但如果你用的是特殊类型比如json、text、tinyint(1)这种容易产生歧义的类型就要留意一下生成结果必要时单独调整实体类。我在实际项目中踩过最深的坑是tinyint(1)字段。MySQL中tinyint(1)在连接串中如果配置了tinyInt1isBittrue某些版本的驱动默认开启那么读出来的类型是Boolean生成的实体属性就是Boolean类型而不是Integer。这在某些需要把该字段当作数字使用的场景下会造成类型不匹配的Bug。解决办法有两个一是在JDBC连接串中追加tinyInt1isBitfalse参数二是在生成代码前手动修改实体类属性类型。3.3 生成代码前的表选取策略在Database窗口中你可以选中一张表也可以Ctrl/Command键多选多张表然后右键选中EasyCode - Generate Code进入生成界面。但是这里我有一个建议不要一次选太多表。一批生成10张以上的表生成的代码文件会非常多散落在各个目录下反而不好检查。而且一旦模板有问题一次生成几十个文件再回头改工作量会翻倍。我个人的习惯是一个业务模块对应的几张表作为一批生成比如用户表、角色表、权限表三张表同时生成生成完先编译检查确认没有问题后再生成下一批。4. 模板配置深度拆解——理解EasyCode的模板机制4.1 模板文件的组织结构EasyCode插件的核心灵魂不是它本身有什么神级代码逻辑而是它那套开放的模板机制。理解了模板你才真正掌控了这个插件而不是被插件默认生成的东西束缚住手脚。打开IDEA的File - Settings - Other Settings - EasyCode你会看到一个模板管理界面。默认情况下插件内置了这些模板entity.java实体类模板dao.javaMapper接口模板service.javaService接口模板serviceImpl.javaService实现类模板controller.javaController类模板mapper.xmlMyBatis XML映射文件模板每个模板文件本质上是一个Velocity模板文件里面通过$符号引用各种变量。比如$tableInfo.name代表表名$tableInfo.obj.name代表表对应的实体类名$columnInfo.name代表字段名。这些变量是EasyCode框架封装好的模板文件可以调用它们来动态拼装代码。4.2 每个模板都干了哪些活entity.java模板负责生成实体类。默认模板会读取表信息遍历所有字段把字段名转换为驼峰命名然后加上对应的Java类型和Javadoc注释。用Lombok注解替代getter/setter方法用Swagger注解提供字段描述。模板中还会根据主键生成TableId注解根据字段生成TableField注解。dao.java模板负责生成Mapper接口。默认会定义基础的增删改查方法以及一个分页查询方法。如果项目用了MyBatis-Plus生成的dao接口会继承BaseMapper如果用的是原生MyBatis则会生成一系列方法签名。service.java和serviceImpl.java模板负责生成业务层。Service接口定义方法列表ServiceImpl实现类则注入Mapper接口通过调用Mapper的方法来实现具体的业务逻辑。这里默认实现的都是最基础的CRUD没有任何复杂业务逻辑——因为插件不可能知道你具体的业务规则它只做“地基”上面的“房子”由你来盖。controller.java模板负责生成控制层。默认会生成RESTful风格的接口常见的路径为/模块名/方法名。如果模板中配置了Swagger注解会在Controller上生成Api注解在每个接口方法上生成ApiOperation注解让生成的接口直接对接Swagger在线文档。mapper.xml模板负责生成MyBatis的XML映射文件。里面包含实体类和数据库表字段的映射关系ResultMap、基础的增删改查SQL语句以及分页查询SQL。对于复杂SQL生成的这些基础SQL就是很好的模板你在上面修改比从零写要快得多。4.3 自定义模板到底怎么操作说实话EasyCode默认模板生成的代码已经够用了但如果你希望生成的代码完全符合自己项目的分层规范、统一返回结构、全局异常处理规范那就必须学会改模板。这里我以“改造entity模板增加一个统一的BaseEntity基类继承”为例演示一下怎么改。在Settings - Other Settings - EasyCode中选中entity模板点击Edit进行修改。在类声明的开头加上继承BaseEntity的逻辑。比如默认生成代码可能是public class User {你把它改成public class User extends BaseEntity {。然后再把createTime、updateTime、deleted这几个公共字段的生成逻辑去掉因为这些字段在BaseEntity里在模板语法中用#if($columnInfo.name ! create_time $columnInfo.name ! update_time $columnInfo.name ! deleted)这样的条件判断来控制哪些字段不生成。保存模板后重新生成代码就能得到继承了BaseEntity的新实体类。完全不需要手工去改。注意修改模板时语法错误不会在编辑界面实时提示。所以保存前务必仔细检查。一旦模板有语法问题生成代码时会直接报错或者生成的代码文件内容错乱。建议每次改完模板先用一个小表测试性生成一遍确认无误后再大规模使用。4.4 模板中的公共属性配置在EasyCode设置界面里除了模板文件本身还有一个“Global Config”或“公共属性”面板。这里可以定义一些全局变量比如作者名、包路径、基础包名、类描述等。这些全局变量同样可以在模板中通过$符号访问。我习惯在这里配置以下几项authorName作者名称生成代码文件的头部注释会显示basePackage基础包名比如com.example.demo所有子包entity、mapper、service、controller都会基于此生成是否覆盖文件可以选择生成时遇到同名文件是覆盖还是跳过是否生成toString、equals、hashCode方法可选配合Lombok一般不用生成建议一次性把这些配置好免得生成出来的包名、作者名千奇百怪。5. 实操过程从连接到一键生成全套代码5.1 可视化生成操作全流程环境就绪、模板确认无误后接下来就是正式的生成环节。我用一个具体的用户表user来走一遍全流程。第一步在IDEA右侧Database窗口展开数据库连接找到user表右键点击该表。第二步在弹出的菜单中选择EasyCode - Generate Code如果你装了中文语言包菜单可能显示为“生成代码”。第三步弹出生成配置界面。这里需要选择模块Module选择代码要生成到哪个Maven模块包名Package确认基础包名是否正确比如com.example.demo模板选择默认会全选所有模板按需取消即可第四步点击确定。IDEA左下角会弹出进度条几秒钟后生成完成左侧Project窗口中就能看到新增的代码文件。生成的代码结构大概长这样com.example.demo ├── controller │ └── UserController.java ├── dao │ └── UserDao.java ├── entity │ └── User.java ├── mapper │ └── UserMapper.xml ├── service │ ├── UserService.java │ └── impl │ └── UserServiceImpl.java注意一下这里的dao和mapper目录在我这个工程中其实是同一个逻辑层。有的项目习惯把mapper接口放在dao包下把XML映射文件放在resources/mapper目录下。EasyCode默认的生成路径是在src/main/java/dao下生成Java接口在src/main/resources/mapper下生成XML文件。这个路径也是可以在模板配置里调整的。5.2 生成后的验收检查清单生成代码只是第一步真正关键的是要检查代码能不能用、够不够规范。我每次都按下面这个清单走一遍第一编译是否通过。生成完代码后立刻执行Maven编译Build - Rebuild Project看有没有语法错误、缺少依赖的报错。第二查看User.java实体类确认字段类型、注解、注释是否合理尤其关注日期类型、Decimal类型这种容易映射出错的字段。第三查看UserDao.java确认Mapper接口的方法和UserMapper.xml中的SQL一一对应。xml中每条SQL的id是否都能在接口中找到对应的方法签名。第四查看UserServiceImpl.java确认Service方法是否都正确调用了Mapper方法事务注解Transactional是否生成如果你在模板中配置了的话。第五查看UserController.java确认接口路径是否符合RESTful风格规范有没有把Swagger注解补齐。这一套检查下来基本能保证生成代码的质量是可靠的。5.3 实际生成案例从SQL到HTTP接口全链路展示我以一个实际业务表设计为例让大家更直观地感受EasyCode能帮我们省多少事。现有表结构如下CREATE TABLE user ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, username varchar(64) NOT NULL COMMENT 用户名, password varchar(128) NOT NULL COMMENT 密码, phone varchar(20) DEFAULT NULL COMMENT 手机号, email varchar(64) 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 更新时间, deleted tinyint(4) DEFAULT 0 COMMENT 逻辑删除标记, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4 COMMENT用户表;配置好数据源、使用默认模板点击生成后得到的实体类核心内容长这样我要说明的是根据你使用的模板不同生成的代码会有差异这里展示我自定义调整后的效果Data EqualsAndHashCode(callSuper true) ApiModel(value User对象, description 用户表) public class User extends BaseEntity { ApiModelProperty(value 主键) TableId(value id, type IdType.AUTO) private Long id; ApiModelProperty(value 用户名) private String username; ApiModelProperty(value 密码) private String password; ApiModelProperty(value 手机号) private String phone; ApiModelProperty(value 邮箱) private String email; ApiModelProperty(value 状态0禁用 1启用) private Integer status; }看到没create_time、update_time、deleted三个公共字段在entity模板中被我通过条件判断过滤掉了它们由BaseEntity基类统一管理。这样生成出来的代码既干净又统一。再看生成的Controller层关键代码Api(tags 用户表) RestController RequestMapping(/user) public class UserController { Autowired private UserService userService; ApiOperation(value 新增用户表) PostMapping(/add) public ResultBoolean add(RequestBody User user) { return Result.success(userService.add(user)); } ApiOperation(value 删除用户表) DeleteMapping(/delete/{id}) public ResultBoolean delete(PathVariable Long id) { return Result.success(userService.delete(id)); } ApiOperation(value 修改用户表) PutMapping(/update) public ResultBoolean update(RequestBody User user) { return Result.success(userService.update(user)); } ApiOperation(value 查询用户表分页列表) GetMapping(/page) public ResultPageInfoUser page(RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize) { return Result.success(userService.page(pageNum, pageSize)); } ApiOperation(value 查询用户表详情) GetMapping(/detail/{id}) public ResultUser detail(PathVariable Long id) { return Result.success(userService.detail(id)); } }从点击Generate到生成出来这套Controller全程不到10秒。如果手写至少要半小时。这就是EasyCode存在的意义。5.4 生成之后的必要工程配置代码生成完之后并不是启动项目就能跑的还有几个必要的配置步骤第一Spring Boot的启动类上要加上MapperScan注解。如果你使用MyBatis需要在启动类上配置Mapper接口扫描路径。比如我生成的dao接口在com.example.demo.dao包下那就在启动类上加上SpringBootApplication MapperScan(com.example.demo.dao) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }如果不加这行启动时会报“找不到Mapper”或“Mapper接口没有实现”之类的错误。第二application.yml中要配置数据源和MyBatis的XML映射路径。spring: datasource: url: jdbc:mysql://localhost:3306/demo?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.demo.entity configuration: map-underscore-to-camel-case: true这里特别提醒两个细节url中必须加上serverTimezone参数否则高版本的MySQL驱动连接时会报时区错误mybatis.mapper-locations必须指向mapper.xml实际存放的目录否则XML映射文件不会被加载SQL执行时会报“Invalid bound statement (not found)”错误。第三Lombok插件要装好并启用注解处理。IDEA中需要在Settings - Build, Execution, Deployment - Compiler - Annotation Processors中勾选Enable annotation processing否则Lombok不会生效编译会报找不到getter/setter方法。6. 常见问题排查与避坑指南6.1 生成代码时频繁出现的报错场景用EasyCode这个过程我不敢说所有人都一次顺遂但绝大多数问题其实都是重复出现的我把它们统一整理成了一张速查表供各位对照排查。报错现象可能原因解决办法无法连接数据库驱动未下载、账号密码错、端口不通在数据源设置中检查驱动配置测试连接生成代码后找不到文件未选择正确的Module或包名拼写错误在生成配置界面左侧仔细检查目标目录生成的entity缺少主键字段表没有设置主键或主键命名不规范在建表时设置明确的主键Mapper接口和XML映射报错mapper-locations路径配置错误检查application.yml中mybatis.mapper-locations路径启动报“Invalid bound statement”XML没有加载或namespace不对确认XML中namespace与Mapper接口全类名一致编译报Date类型错误模板中日期类型映射有问题调整模板中的字段类型映射规则Ctrl右键不能跳转到XML没装MyBatis插件或IDEA索引异常安装Free Mybatis plugin插件重建索引6.2 我在实际项目中遇到过的刁钻问题有些坑不在真实项目中踩过一遍是真的想不到。我这里分享三个第一个坑MySQL中的text类型字段生成后实体类是String类型这本身没问题但在mapper.xml的ResultMap映射中有时会把text类型字段忽略掉导致查询结果中该字段为null。排查了很久才发现是模板里ResultMap生成逻辑对text类型的映射处理不完整。解决办法是手动在模板中补充text类型的映射规则。第二个坑表名称或者字段名称如果用了MySQL的保留字比如order、Group、desc这些生成出来的SQL语句执行时会直接报语法错误。因为模板生成的SQL默认不会加反引号。解决办法有两个要么在建表时避免使用保留字要么手动修改模板在列名上统一加上反引号。第三个坑如果你的项目使用了MyBatis-Plus的逻辑删除TableLogic注解和自动填充TableField(fill FieldFill.INSERT)注解EasyCode默认模板并不会生成这些。需要在模板中手工加上对这些注解的支持逻辑否则逻辑删除字段在删除操作中不会被自动处理也是会埋雷的。6.3 插件卸载和升级注意事项EasyCode插件版本更新不算频繁但偶尔需要升级。升级前建议先备份自定义模板。因为有些版本升级后模板文件的格式或者变量名可能会发生变化导致模板加载失败。备份方法很简单去IDEA的设置目录下找到EasyCode相关的模板配置文件复制一份保存在本地。具体路径一般在IDEA配置目录下的options/easyCode目录中Windows系统通常是C:\Users\你的用户名\AppData\Roaming\JetBrains\IntelliJIdea2023.2\options\easyCodemacOS系统类似在~/Library/Application Support/JetBrains/IntelliJIdea2023.2/options/下。升级前把这个目录拷贝出来升级后如果模板异常就把备份覆盖回去。至于卸载在Plugins设置中直接禁用或卸载即可但要注意的是卸载插件并不会删除已经生成的代码文件这些文件会留在项目中。所以卸载前先确认生成产物已经纳入版本管理避免误删。7. 进阶技巧让EasyCode为你的团队规范服务7.1 模板复用与团队共享EasyCode允许你导出、导入模板配置这个功能天生适合团队共享。你在自己电脑上精心调好的模板可以导出为一个配置文件通过代码仓库提交到团队共享目录或者直接发到群里团队成员导入之后人人生成的代码风格一致。具体操作在EasyCode设置界面找到“Export”或“导入导出”按钮把当前所有模板保存为一个压缩包或JSON文件。别的同事在同样的设置界面点击“Import”选择你导出的文件即可一键套用你的模板配置。这其实就是把团队编码规范通过工具的方式固化下来。新人入职不用背规范文档模板往IDEA里一导生成出来的代码天然符合团队要求。带过团队的人应该都懂这有多省心。7.2 结合MyBatis-Plus增强生成能力可能很多朋友注意到我在前面多次提到MyBatis-Plus。这里专门展开讲一下。EasyCode默认的mapper接口生成的是标准MyBatis风格——每个方法对应XML中的一条SQL。但如果你用了MyBatis-Plus就可以少写很多东西MyBatis-Plus的BaseMapper已经内置了insert、deleteById、updateById、selectById等基础方法你的Mapper接口只要继承BaseMapper这些方法直接就有连XML都不用写。所以如果你的项目用了MyBatis-Plus我强烈建议把dao模板改成继承BaseMapper 的形式。模板核心代码大概长这样public interface ${tableInfo.name}Dao extends BaseMapper${tableInfo.name} { }同时serviceImpl模板也相应调整让Service实现类继承ServiceImpl类Service public class ${tableInfo.name}ServiceImpl extends ServiceImpl${tableInfo.name}Dao, ${tableInfo.name} implements ${tableInfo.name}Service { }这样改造之后生成的代码量会进一步减少。Service层自带page查询、批量插入等方法几乎没有为空壳代码而烦恼的情况。7.3 自定义代码模板时的Velocity语法速记如果你之前没接触过Velocity模板改起来可能有点摸不着头脑。这里快速补充几个最常用的语法点$tableInfo.name表名比如user_info$tableInfo.obj.name转换后的实体类名比如UserInfo$tableInfo.obj.comment表注释$columnInfo.name字段名比如create_time$columnInfo.obj.name转换后的属性名比如createTime$columnInfo.obj.typeJava类型比如String、Integer$columnInfo.obj.comment字段注释条件判断语法#if、#else、#end循环遍历用#foreach($column in $tableInfo.fullColumn)输出变量用$variable。举个例子判断字段名是否以createTime开头在模板里就写#if($columnInfo.obj.name.startsWith(create)) // 这里是公共字段不生成 #else // 这里是正常字段正常生成 #end掌握了这几个语法你就已经能修改90%的模板逻辑了。8. 写在最后的实践经验8.1 我对EasyCode的总体评价用EasyCode这些年我最大的感受是它是那种“越用越离不开”的工具。刚开始你可能只是拿它省一点手写CRUD的时间但当你真正把模板调好、把团队规范融进去之后它就从一个代码生成器变成了团队规范落地的工具。当然它也有自己的边界复杂业务逻辑它管不了报错信息不够友好模板语法让人上手时需要一点学习成本。但这并不妨碍它成为IDEA生态里效率最高、最值得装的插件之一。8.2 从一次熬夜重构得到的教训分享一段真实经历。前年我接手一个老项目代码风格非常混乱——有的Controller返回Map有的返回自定义Result有的Service方法命名是拼音缩写让人看得头大。当时我花了一周时间梳理规范然后花了一个下午把EasyCode模板全部按新规范调整好再往团队里一推。从那时起团队里所有新模块的代码生成出来就是一套风格哪怕是个刚毕业的应届生写的CRUD代码也不会比五年经验的老手差太多。这件事给我的启发是工具本身并不稀奇稀奇的是怎么让工具为你的规范服务。如果你只会用默认模板那EasyCode只是一个很普通的代码生成器如果你能掌握模板定制它就是一把能把你从重复劳动中解放出来的利器。8.3 给刚开始上手的朋友一句实在话如果你想最快地上手EasyCode不要一上来就折腾模板。先装好插件用默认模板生成一套代码跑通流程看看生成的代码长什么样。然后带着“哪里不符合我的需求”这个问题去改模板。这样学起来最快也最不容易被教程里的各种细节劝退。等你把第一套自定义模板调试好之后你会发现自己写CRUD的时间直接砍半甚至更多。省下来的时间拿去研究业务、搞搞数据库优化、学点新东西不是比每天敲那几千行重复代码强多了最后再分享一个小技巧模板不要一次改太多一点点来。改一个部分生成一个测试表验证一下确认没问题再改下一个。很多人觉得模板改起来难其实就是被“一次性改动量太大导致爆了一堆错”这种场面吓退的。其实拆开来看每次只动一点点事情就简单得多。按这个方法操作半个小时你就能改出一套完全属于你自己的EasyCode模板。
返回列表