零碎04 MybatisPlus自定义模版生成代码
目录
需要的依赖包,需要注意mybatis-plus-generator的3.5+版本是没有兼容历史版本的。
定义一个CodeGenerator类,负责生成代码和配置属性
背景
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
原文地址:https://blog.csdn.net/Elaine2391/article/details/143976131
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!