自学内容网 自学内容网

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

目录

背景

动手开干

需要的依赖包,需要注意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:


原文地址:https://blog.csdn.net/Elaine2391/article/details/143976131

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!