目录
背景
动手开干
需要的依赖包,需要注意mybatis-plus-generator的3.5+版本是没有兼容历史版本的。
定义一个CodeGenerator类,负责生成代码和配置属性
Entity模版
背景
MybatisPlus代码生成使用默认的velocity模版解决不了定制化的需求,不同的开发规范也会出现细节化的差异,在这种情况下我们需要自定义velocity模版达到实现定制化的目的,自定义模板可以让你根据项目的具体要求调整生成代码的格式、结构和内容等。
动手开干
这里不建议学习velocity语法然后直接开始盲写模版,既然是模版,优先需要的肯定是模子。所以可以先写出一套简单的通用CURD,然后根据包、类、方法、对象进行模版编辑,最后通过调试验证就完成了。
MybatisPlus代码生成,官网地址:代码生成器 | MyBatis-Plus
-
需要的依赖包,需要注意mybatis-plus-generator的3.5+版本是没有兼容历史版本的。
<properties><java.version>17</java.version><mybatis-plus.version>3.5.3.1</mybatis-plus.version></properties>
包依赖:
<!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><!-- MyBatis-Plus 代码生成器 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-core</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId><version>${mybatis-plus.version}</version></dependency><!-- 模板引擎(Velocity)--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency>
-
定义一个CodeGenerator类,负责生成代码和配置属性
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.config.builder.CustomFile; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine; import java.util.*; /*** @Author: kule* @Date: 2024/11/19 17:05* @Version: 1.0**/ public class CodeGenerator {public static void main(String[] args) {System.out.println(System.getProperty("user.dir"));generation("sys_role");} // module配置,多module需要指定对应private static String MODULE_NAME = "backend";// 数据库链接地址private static String URL = "jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC";// 数据库用户名private static String USERNAME = "root";// 数据库密码private static String PASSWORD = "123456"; public static void generation(String tableName) {// 6个主要的配置:pojo路径、dao路径、service路径、controller路径、mapper路径、xml文件路径FastAutoGenerator.create(URL, USERNAME, PASSWORD) // 全局配置.globalConfig(builder -> {builder.author("kule")// 用的knife4j,这里不需要启用swagger//.enableSwagger().disableOpenDir() // 禁止打开输出目录.dateType(DateType.TIME_PACK) // 时间类型为LocalDateTime.commentDate("yyyy-MM-dd HH:mm:ss") // 注释日期格式.outputDir(System.getProperty("user.dir") + "/" + MODULE_NAME + "/src/main/java").build(); // 指定输出目录}) // 包配置.packageConfig(builder -> {builder.parent("site.lwer").entity("domain.entity").mapper("mapper").service("service").serviceImpl("service.impl").controller("controller").pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/" + MODULE_NAME + "/src/main/resources/mapper")).build();}) // 策略配置.strategyConfig(builder -> {builder.addInclude(tableName) // 表名.addTablePrefix("sys_") // 表名前缀.enableSkipView() // 跳过视图 // 自定义实体类配置.entityBuilder()//.enableLombok() 使用自定义的entityLombokModel判断是否使用lombok 用@Data注解代替默认模版的 @Getter @Setter.naming(NamingStrategy.underline_to_camel) // 数据表映射实体命名: 驼峰命名.columnNaming(NamingStrategy.underline_to_camel) // 表字段映射实体命名: 驼峰命名.idType(IdType.ASSIGN_ID) // 主键策略 自增 // 自定义mapper配置.mapperBuilder().enableBaseResultMap()// 启用xml文件中的BaseResultMap 生成.enableBaseColumnList()// 启用xml文件中的BaseColumnList.formatMapperFileName("%sMapper")// 格式化Dao类名称 // 自定义service配置.serviceBuilder().formatServiceFileName("%sService")// 格式化 service 接口文件名称.formatServiceImplFileName("%sServiceImpl")// 格式化 service 接口文件名称 // 自定义controller配置.controllerBuilder().formatFileName("%sController") // 格式化 controller 文件名称.enableRestStyle() .build();}) // 自定义模板配置.templateConfig(builder -> {builder.entity("/templates/entity.java").mapper("/templates/mapper.java").service("/templates/service.java").serviceImpl("/templates/serviceImpl.java").controller("/templates/controller.java");}) // 注入自定义配置.injectionConfig(builder -> {String pack = tableName.substring(tableName.indexOf("_") + 1);//自定义生成模板参数,在vm模版里取值使用Map<String,Object> data = new HashMap<>();data.put("entityLombokModel", true);data.put("chainModel", true);builder.customMap(data); // 自定义DTO模版List<CustomFile> customFiles = new ArrayList(); // DTO实体CustomFile idReqFile = new CustomFile.Builder().fileName("IdReq.java")//生成java文件名称,要和vm模版里的文件名保持一致.templatePath("/templates/idReq.java.vm")//实体模板位置.packageName("domain.dto." + pack)//生成文件包名.build();customFiles.add(idReqFile); CustomFile queryFile = new CustomFile.Builder().fileName("Query.java")//生成java文件名称,要和vm模版里的文件名保持一致.templatePath("/templates/query.java.vm")//实体模板位置.packageName("domain.dto." + pack)//生成文件包名.build();customFiles.add(queryFile); CustomFile saveFile = new CustomFile.Builder().fileName("SaveReq.java")//生成java文件名称,要和vm模版里的文件名保持一致.templatePath("/templates/saveReq.java.vm")//实体模板位置.packageName("domain.dto." + pack)//生成文件包名.build();customFiles.add(saveFile); CustomFile updateFile = new CustomFile.Builder().fileName("UpdateReq.java")//生成java文件名称,要和vm模版里的文件名保持一致.templatePath("/templates/updateReq.java.vm")//实体模板位置.packageName("domain.dto." + pack)//生成文件包名.build();customFiles.add(updateFile); // Vo实体CustomFile customFileVO = new CustomFile.Builder().fileName("VO.java").templatePath("/templates/VO.java.vm").packageName("domain.vo").build();customFiles.add(customFileVO); builder.customFile(customFiles);}) .templateEngine(new VelocityTemplateEngine()).execute();} }
-
Entity模版
以entity模版举例,通过比对默认模版的语法和自定义entity的代码,模仿着先写出来我们需要的自定义模版,然后运行生成代码进行微调就可以了。
Tips:
-
Velocity模版里if中的判断有些在MybatisPlus对象中封装的,有些是通过injectionConfig自定义注入的
-
单纯自己用,逻辑性没必要写的太强,建议多数包引用或者注解直接写死
-
模板文件代码参考:登录 - Gitee.comhttps://gitee.com/qiuxl/kule-blog/commit/bea095147a4af43f3cf08218a00f3d956f212566