目录
需要的依赖包,需要注意mybatis-plus-generator的3.5+版本是没有兼容历史版本的。
定义一个CodeGenerator类,负责生成代码和配置属性
背景
MybatisPlus代码生成使用默认的velocity模版解决不了定制化的需求,不同的开发规范也会出现细节化的差异,在这种情况下我们需要自定义velocity模版达到实现定制化的目的,自定义模板可以让你根据项目的具体要求调整生成代码的格式、结构和内容等。
动手开干
这里不建议学习velocity语法然后直接开始盲写模版,既然是模版,优先需要的肯定是模子。所以可以先写出一套简单的通用CURD,然后根据包、类、方法、对象进行模版编辑,最后通过调试验证就完成了。
MybatisPlus代码生成,官网地址:代码生成器 | MyBatis-Plus
需要的依赖包,需要注意mybatis-plus-generator的3.5+版本是没有兼容历史版本的。
XML
<properties>
<java.version>17</java.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
</properties>
包依赖:
XML
<!-- 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类,负责生成代码和配置属性
java
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