零碎04 MybatisPlus自定义模版生成代码

目录

背景

动手开干

需要的依赖包,需要注意mybatis-plus-generator的3.5+版本是没有兼容历史版本的。

定义一个CodeGenerator类,负责生成代码和配置属性

Entity模版


背景

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:

相关推荐
zquwei7 分钟前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
TT哇13 分钟前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
火烧屁屁啦36 分钟前
【JavaEE进阶】初始Spring Web MVC
java·spring·java-ee
w_31234541 小时前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安1 小时前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA1 小时前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
北辰浮光1 小时前
[spring]XML配置文件标签
xml·spring
Q_19284999061 小时前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟1 小时前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S2 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring