一、概述

官网:https://baomidou.com/

官方文档 :https://baomidou.com/pages/56bac0/

官方源码地址: https://gitee.com/baomidou/mybatis-plus

官方原话:

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成
Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

配置环境

  • 开发工具 IDEA
  • JDK 15
  • 数据库 Mysql 、Oracle …
  • 基于SpringBoot开发框架

特性

  • 无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性
  • 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring
  • 损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作
  • 预防Sql注入:内置Sql注入剥离器,有效预防Sql注入攻击
  • 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
  • 支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
  • 支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Entity、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 支持关键词自动转义:支持数据库关键词(order、key……)自动转义,还可自定义关键词
  • 内置分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询
  • 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作

二、配置说明

2.1 数据库配置(DataSourceConfig)

基础配置

属性说明示例
urljdbc路径jdbc:mysql://localhost:3306/(数据库名称)
username数据库账号root
password数据库密码123456

new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456")
    .build();
    

可选配置

方法说明示例 / 参数
dbQuery(IDbQuery)数据库查询new MySqlQuery()
schema(String)数据库schema(部分数据库适用) mybatis-plus
typeConvert(ITypeConvert)数据库类型转换器new MySqlTypeConvert()
keyWordsHandler(IKeyWordsHandler)数据库关键字处理器new MySqlKeyWordsHandler()

/**
 * 初始化数据源配置
 */
private static DataSourceConfig initDataSourceConfig() {
    return new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456")
    .dbQuery(new MySqlQuery())
    .schema("mybatis-plus")
    .typeConvert(new MySqlTypeConvert())
    .keyWordsHandler(new MySqlKeyWordsHandler())
    .build();
}

2.2 全局配置(GlobalConfig)

方法说明示例 / 参数
fileOverride覆盖已生成文件默认值:false
disableOpenDir禁止打开输出目录默认值:true
outputDir(String)指定输出目录projectPath + “/src/main/java”(当前工程路径+"/src/main/java")
author(String)作者名vinjcent
enableKotlin开启 kotlin 模式默认值:false
enableSwagger开启 swagger 模式默认值:false
dateType(DateType)时间类型ONLY_DATE、SQL_PACK、TIME_PACK(jdk1.8以上才支持,推荐使用)
commentDate(String)注释日期默认值:yyyy-MM-dd,可使用"“yyyy-MM-dd HH:mm:ss”"
/**
 * 初始化全局配置
 */
private static GlobalConfig initGlobalConfig(String projectPath) {
    return new GlobalConfig.Builder()
            .outputDir(projectPath + "/src/main/java")//指定生成文件的根目录
            .author("Jack")             //Author设置作者
            .disableOpenDir()           //禁止打开输出目录,禁止打开输出目录
            //.enableSwagger()            //开启 swagger 模式,开启 swagger 模式
            .fileOverride()             //禁止打开输出目录,默认值:false
            .dateType(DateType.ONLY_DATE)//设置时间类型
            .commentDate("yyyy-MM-dd") //注释日期
            .build();
}

2.3 包配置(PackageConfig)

方法说明示例 / 参数
parent(String)父包名默认值:com.vinjcent
moduleName(String)父包模块名默认值:无
entity(String)实体类 Entity 包名默认值:entity
service(String)Service 包名默认值:service
serviceImpl(String)实现类 Service Impl 包名默认值:service.impl
mapper(String)Mapper 包名默认值:mapper
mapperXml(String)Mapper XML 包名默认值:mapper.xml
controller(String)Controller 包名默认值:controller
other(String)自定义文件包名可使用"other",生产一个other文件目录
pathInfo(Map<OutputFile, String>)路径配置信息Collections.singletonMap(OutputFile.mapperXml, “D://”)
/**
 * 初始化包配置
 */
private static PackageConfig initPackageConfig(String projectPath,String moduleName) {
    Props props = new Props("generator.properties");
    Map<OutputFile, String> pathInfo = new HashMap();
    pathInfo.put(OutputFile.mapperXml, projectPath + "/src/main/resources/mapper/" + moduleName);
    pathInfo.put(OutputFile.other,     projectPath + "/src/main/resources/other/" + moduleName);
    return new PackageConfig
            .Builder()
            .parent(props.getStr("package.base"))  // 父包名
            .moduleName(moduleName)      //父包模块名
            .entity("model")             //实体类 Entity 包名,默认值:entity
            .service("service")          //Service 包名,默认值:entity
            .serviceImpl("service.impl") //实现类 Service Impl 包名	默认值:service.impl
            .mapper("mapper")            //Mapper 包名	默认值:mapper
            .xml("mapper.xml")           //Mapper XML 包名	默认值:mapper.xml
            .controller("controller")    //Controller 包名	默认值:controller
            .other("other")              //自定义文件包名	可使用"other",生产一个other文件目录
            .pathInfo(pathInfo)          //路径配置信息
            .build();
}

2.4 模板配置(TemplateConfig)

方法说明示例 / 参数
disable禁用所有模板
disable(TemplateType…)禁用模板TemplateType.ENTITY
entity(String)设置实体模板路径(JAVA)/templates/entity.java
entityKt(String)设置实体模板路径(kotlin)/templates/entity.java
service(String)设置 service 模板路径/templates/service.java
serviceImpl(String)设置 serviceImpl 模板路径/templates/serviceImpl.java
mapper(String)设置 mapper 模板路径/templates/mapper.java
mapperXml(String)设置 mapperXml 模板路径/templates/mapper.xml
controller(String)设置 controller 模板路径/templates/controller.java
/**
 * 初始化模板配置
 * 可以对controller、service、entity模板进行配置
 */
private static TemplateConfig initTemplateConfig() {
    return new TemplateConfig.Builder()
            .entity("/templates/vue/entity.java")
            .service("/templates/vue/service.java")
            .serviceImpl("/templates/vue/serviceImpl.java")
            .mapper("/templates/vue/mapper.java")
            .mapperXml("/templates/vue/mapper.xml")
            .controller("/templates/vue/controller.java")
            .build();
}

MyBatis-Plus 原生默认模板:

在这里插入图片描述

2.5 注入配置(InjectionConfig)

方法说明示例 / 参数
beforeOutputFile(BiConsumer<TableInfo, Map<String, Object>>)输出文件之前消费者
customMap(Map<String, Object>)自定义配置 Map 对象Collections.singletonMap(“test”, “baomidou”)
customFile(Map<String, String>)自定义配置模板文件Collections.singletonMap(“test.txt”, “/templates/test.vm”)
/**
 * 初始化自定义配置
 */
private static InjectionConfig initInjectionConfig(String projectPath) {
    /**自定义生成模板参数**/
    Map<String,Object> paramMap = new HashMap<>();
    /** 自定义 生成类**/
    Map<String, String> customFileMap = new HashMap();
    customFileMap.put("/api/%sApi.js", "templates/vue/api.js.vm");
    customFileMap.put("/%s/index.vue", "templates/vue/index.vue.vm");
    // 自定义配置
    return new InjectionConfig.Builder()
            .beforeOutputFile((tableInfo, objectMap) -> {
                customFileMap.forEach((key, value) -> {
                    System.out.println(key+ " : " + value);
                });
                System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
            })
            .customMap(paramMap)
            .customFile(customFileMap)
            .build();
}

注意 : 使用时注意,自定义模板中使用 %s 转译符不会被替换,要想实现自定义模板的文件名自动替换需要重新模板引擎

在这里插入图片描述

这个是原本模板引擎源码部分:

在这里插入图片描述

这部分是重写后模板引擎源码部分:

在这里插入图片描述

2.6 策略配置(StrategyConfig)

方法说明示例 / 参数
enableCapitalMode开启大写命名默认值:false
enableSkipView开启跳过视图默认值:false
disableSqlFilter禁用 sql 过滤默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关
enableSchema启用 schema默认值:false,多 schema 场景的时候打开
likeTable(LikeTable)模糊表匹配(sql 过滤)likeTable 与 notLikeTable 只能配置一项
notLikeTable(LikeTable)模糊表排除(sql 过滤)likeTable 与 notLikeTable 只能配置一项
addInclude(String…)增加表匹配(内存过滤)include 与 exclude 只能配置一项
addExclude(String…)增加表排除匹配(内存过滤)include 与 exclude 只能配置一项
addTablePrefix(String…)增加过滤表前缀
addTablePrefix(String…)增加过滤表前缀
addTableSuffix(String…)增加过滤表后缀
addFieldPrefix(String…)增加过滤字段前缀
addFieldSuffix(String…)增加过滤字段后缀
entityBuilder实体策略配置
controllerBuildercontroller 策略配置
mapperBuildermapper 策略配置
serviceBuilderservice 策略配置
new StrategyConfig.Builder()
    .enableCapitalMode()
    .enableSkipView()
    .disableSqlFilter()
    .likeTable(new LikeTable("USER"))
    .addInclude("t_simple")
    .addTablePrefix("t_", "c_")
    .addFieldSuffix("_flag")
    .build();

2.6.1 Entity 策略配置

方法说明示例 / 参数
nameConvert(INameConvert)名称转换实现
superClass(Class<?>)设置父类BaseEntity.class
superClass(String)设置父类com.baomidou.global.BaseEntity
disableSerialVersionUID禁用生成 serialVersionUID默认值:true
enableColumnConstant开启生成字段常量默认值:false
enableChainModel开启链式模型默认值:false
enableLombok开启 lombok 模型默认值:false
enableRemoveIsPrefix开启 Boolean 类型字段移除 is 前缀默认值:false
enableTableFieldAnnotation开启生成实体时生成字段注解默认值:false
enableActiveRecord开启 ActiveRecord 模型默认值:false
versionColumnName(String)乐观锁字段名(数据库)
versionPropertyName(String)乐观锁属性名(实体)
logicDeleteColumnName(String)逻辑删除字段名(数据库)
logicDeletePropertyName(String)逻辑删除属性名(实体)
naming数据库表映射到实体的命名策略默认下划线转驼峰命名:NamingStrategy.underline_to_camel
columnNaming数据库表字段映射到实体的命名策略默认为 null,未指定按照 naming 执行
addSuperEntityColumns(String…)添加父类公共字段
addIgnoreColumns(String…)添加忽略字段
addTableFills(IFill…)添加表字段填充
addTableFills(List)添加表字段填充
idType(IdType)全局主键类型
convertFileName(ConverterFileName)转换文件名称
formatFileName(String)格式化文件名称
new StrategyConfig.Builder()
    .entityBuilder()
    .superClass(BaseEntity.class)
    .disableSerialVersionUID()
    .enableChainModel()
    .enableLombok()
    .enableRemoveIsPrefix()
    .enableTableFieldAnnotation()
    .enableActiveRecord()
    .versionColumnName("version")
    .versionPropertyName("version")
    .logicDeleteColumnName("deleted")
    .logicDeletePropertyName("deleteFlag")
    .naming(NamingStrategy.no_change)
    .columnNaming(NamingStrategy.underline_to_camel)
    .addSuperEntityColumns("id", "created_by", "created_time", "updated_by", "updated_time")
    .addIgnoreColumns("age")
    .addTableFills(new Column("create_time", FieldFill.INSERT))
    .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))
    .idType(IdType.AUTO)
    .formatFileName("%sEntity")
    .build();

2.6.2 Controller 策略配置

方法说明示例 / 参数
superClass(Class<?>)设置父类BaseController.class
superClass(String)设置父类com.baomidou.global.BaseController
enableHyphenStyle开启驼峰转连字符默认值:false
enableRestStyle开启生成@RestController 控制器默认值:false
convertFileName(ConverterFileName)转换文件名称
formatFileName(String)格式化文件名称
new StrategyConfig.Builder()
    .controllerBuilder()
    .superClass(BaseController.class)
    .enableHyphenStyle()
    .enableRestStyle()
    .formatFileName("%sAction")
    .build();

2.6.3 Service 策略配置

方法说明示例 / 参数
superServiceClass(Class<?>)设置 service 接口父类BaseService.class
superServiceClass(String)设置 service 接口父类com.baomidou.global.BaseService
superServiceImplClass(Class<?>)设置 service 实现类父类BaseServiceImpl.class
superServiceImplClass(String)设置 service 实现类父类com.baomidou.global.BaseServiceImpl
convertServiceFileName(ConverterFileName)转换 service 接口文件名称
convertServiceImplFileName(ConverterFileName)转换 service 实现类文件名称
formatServiceFileName(String)格式化 service 接口文件名称
formatServiceImplFileName(String)格式化 service 实现类文件名称
new StrategyConfig.Builder()
    .serviceBuilder()
    .superServiceClass(BaseService.class)
    .superServiceImplClass(BaseServiceImpl.class)
    .formatServiceFileName("%sService")
    .formatServiceImplFileName("%sServiceImp")
    .build();

2.6.4 Mapper 策略配置

方法说明示例 / 参数
superClass(Class<?>)设置父类BaseMapper.class
superClass(String)设置父类com.baomidou.global.BaseMapper
enableMapperAnnotation开启 @Mapper 注解默认值:false
enableBaseResultMap启用 BaseResultMap 生成默认值:false
enableBaseColumnList启用 BaseColumnList默认值:false
cache(Class<? extends Cache>)设置缓存实现类MyMapperCache.class
convertMapperFileName(ConverterFileName)转换 mapper 类文件名称
convertXmlFileName(ConverterFileName)转换 xml 文件名称
formatMapperFileName(String)格式化 mapper 文件名称
formatXmlFileName(String)格式化 xml 实现类文件名称
new StrategyConfig.Builder()
    .mapperBuilder()
    .superClass(BaseMapper.class)
    .enableMapperAnnotation()
    .enableBaseResultMap()
    .enableBaseColumnList()
    .cache(MyMapperCache.class)
    .formatMapperFileName("%sDao")
    .formatXmlFileName("%sXml")
    .build();

注意 : 使用时,先看清楚归于哪一类的配置,避免出现找不到的情况!

三、MyBatis-Plus Generator

2.1、导入依赖

  <!--使用Controller注解需要使用-->
    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <!--Lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!--自动生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--pagehelper分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.3.2</version>
        </dependency>
        <!--velocity模板引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
        <!--freemarker模板引擎-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.29</version>
        </dependency>
        <!--springboot测试类-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--Swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
    </dependencies>

2.2、运行类(放在测试类中即可)

package generator;

import cn.hutool.core.util.StrUtil;
import cn.hutool.setting.dialect.Props;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
import com.baomidou.mybatisplus.generator.config.querys.OracleQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.baomidou.mybatisplus.generator.function.ConverterFileName;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;
import config.TimerVelocityTemplateEngine;

import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.function.Consumer;

/**
 * MyBatisPlus代码生成器
 * 3.5.1
 */
public class MyBatisPlusGenerator {

    public static void main(String[] args) {
        // 获取当前目录路径
        String projectPath = System.getProperty("user.dir");
        String moduleName = "cctv";//scanner("模块名");
        String[] tableNames = {"MVNO_TARIFF_TABLE"};//scanner("表名,多个英文逗号分割").split(",");
        // 代码生成器: 数据源配置
        AutoGenerator autoGenerator = new AutoGenerator(initDataSourceConfig());
        // 全局配置
        autoGenerator.global(initGlobalConfig(projectPath));
        // 包配置,如模块名、实体、mapper、service、controller等
        autoGenerator.packageInfo(initPackageConfig(projectPath,moduleName));
        // 模板配置
        autoGenerator.template(initTemplateConfig());
        // 自定义配置
        autoGenerator.injection(initInjectionConfig(projectPath));
        // 策略配置
        autoGenerator.strategy(initStrategyConfig(tableNames));
        // 使用Freemarker引擎模板,默认的是Velocity引擎模板
        //autoGenerator.execute(new VelocityTemplateEngine());
        autoGenerator.execute(new TimerVelocityTemplateEngine());
    }

    /**
     * 读取控制台内容信息
     */
    private static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        System.out.println(("请输入" + tip + ":"));
        if (scanner.hasNext()) {
            String next = scanner.next();
            if (StrUtil.isNotEmpty(next)) {
                return next;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    /**
     * 初始化数据源配置
     */
    private static DataSourceConfig initDataSourceConfig() {
        // 读取当前源文件配置
        Props props = new Props("generator.properties");
        // jdbc路径
        String url = props.getStr("dataSource.url");
        // 数据库账号
        String username = props.getStr("dataSource.username");
        // 数据库账号
        String password = props.getStr("dataSource.password");
        return new DataSourceConfig
                .Builder(url,username,password) //设置数据源
                .dbQuery(new OracleQuery())     //设置数据库查询器
                .build();
    }

    /**
     * 初始化全局配置
     */
    private static GlobalConfig initGlobalConfig(String projectPath) {
        return new GlobalConfig.Builder()
                .outputDir(projectPath + "/src/main/java")//指定生成文件的根目录
                .author("Jack")             //Author设置作者
                .disableOpenDir()           //禁止打开输出目录,禁止打开输出目录
                //.enableSwagger()            //开启 swagger 模式,开启 swagger 模式
                .fileOverride()             //禁止打开输出目录,默认值:false
                .dateType(DateType.ONLY_DATE)//设置时间类型
                .commentDate("yyyy-MM-dd") //注释日期
                .build();
    }

    /**
     * 初始化包配置
     */
    private static PackageConfig initPackageConfig(String projectPath,String moduleName) {
        Props props = new Props("generator.properties");
        Map<OutputFile, String> pathInfo = new HashMap();
        pathInfo.put(OutputFile.mapperXml, projectPath + "/src/main/resources/mapper/" + moduleName);
        pathInfo.put(OutputFile.other,     projectPath + "/src/main/resources/other/" + moduleName);
        return new PackageConfig
                .Builder()
                .parent(props.getStr("package.base"))  // 父包名
                .moduleName(moduleName)      //父包模块名
                .entity("model")             //实体类 Entity 包名,默认值:entity
                .service("service")          //Service 包名,默认值:entity
                .serviceImpl("service.impl") //实现类 Service Impl 包名	默认值:service.impl
                .mapper("mapper")            //Mapper 包名	默认值:mapper
                .xml("mapper.xml")           //Mapper XML 包名	默认值:mapper.xml
                .controller("controller")    //Controller 包名	默认值:controller
                .other("other")              //自定义文件包名	可使用"other",生产一个other文件目录
                .pathInfo(pathInfo)          //路径配置信息
                .build();
    }

    /**
     * 初始化模板配置
     * 可以对controller、service、entity模板进行配置
     */
    private static TemplateConfig initTemplateConfig() {
        return new TemplateConfig.Builder()
                .entity("/templates/vue/entity.java")
                .service("/templates/vue/service.java")
                .serviceImpl("/templates/vue/serviceImpl.java")
                .mapper("/templates/vue/mapper.java")
                .mapperXml("/templates/vue/mapper.xml")
                .controller("/templates/vue/controller.java")
                .build();
    }

    /**
     * 初始化自定义配置
     */
    private static InjectionConfig initInjectionConfig(String projectPath) {
        /**自定义生成模板参数**/
        Map<String,Object> paramMap = new HashMap<>();
        /** 自定义 生成类**/
        Map<String, String> customFileMap = new HashMap();
        customFileMap.put("/api/%sApi.js", "templates/vue/api.js.vm");
        customFileMap.put("/%s/index.vue", "templates/vue/index.vue.vm");
        // 自定义配置
        return new InjectionConfig.Builder()
                .beforeOutputFile((tableInfo, objectMap) -> {
                    customFileMap.forEach((key, value) -> {
                        System.out.println(key+ " : " + value);
                    });
                    System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
                })
                .customMap(paramMap)
                .customFile(customFileMap)
                .build();
    }
    private static Consumer<InjectionConfig.Builder> getInjectionConfigBuilder() {
        return consumer -> {
        };
    }

    /**
     * 初始化策略配置
     */
    private static StrategyConfig initStrategyConfig(String[] tableNames) {
        StrategyConfig.Builder builder = new StrategyConfig.Builder();
        builder
                .enableCapitalMode()//开启大写命名,默认值:false
                //.enableSkipView()//开启跳过视图,默认值:false
                //.disableSqlFilter()//禁用sql过滤,默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关
                //.enableSchema()//启用 schema, 默认值:false,多 schema 场景的时候打开

                .entityBuilder()
                .naming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略,默认下划线转驼峰命名:NamingStrategy.underline_to_camel
                .columnNaming(NamingStrategy.underline_to_camel)//数据库表字段映射到实体的命名策略,	默认为 null,未指定按照 naming 执行
                //.superClass()//设置父类: BaseEntity.class || com.baomidou.global.BaseEntity
                //.idType(IdType.ASSIGN_ID) //全局主键类型
                .disableSerialVersionUID() // 禁用生成 serialVersionUID,默认值:true
                //.enableColumnConstant()//开启生成字段常量,默认值:false
                .enableChainModel()//开启链式模型,默认值:false
                .enableLombok()//开启 lombok 模型,默认值:false
                .enableRemoveIsPrefix()//开启 Boolean 类型字段移除 is 前缀,默认值:false
                .enableTableFieldAnnotation()//开启生成实体时生成字段注解,默认值:false
                //.enableActiveRecord()//开启 ActiveRecord 模型,默认值:false
                //.logicDeleteColumnName("deleted")   // 逻辑删除字段名(数据库)
                //.logicDeletePropertyName("deleted") // 逻辑删除属性名(实体)
                //.addTableFills(new Column("create_time", FieldFill.INSERT)) // 自动填充配置  create_time  update_time 两种方式
                //.addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))
                //.versionColumnName("version")   // 开启乐观锁
                .formatFileName("%s")//格式化文件名称

                .controllerBuilder()
                //.superClass()//设置父类: BaseController.class || com.baomidou.global.BaseController
                .enableHyphenStyle() //开启驼峰转连字符,默认值:false
                .enableRestStyle()//开启生成@RestController 控制器,默认值:false
                .formatFileName("%sController")//格式化文件名称

                .serviceBuilder()
                //.superServiceClass() //设置 service 接口父类: BaseService.class || com.baomidou.global.BaseService
                //.superServiceImplClass()//设置 service 实现类父类 : BaseServiceImpl.class || com.baomidou.global.BaseServiceImpl
                .formatServiceFileName("%sService")//格式化 service 接口文件名称
                .formatServiceImplFileName("%sServiceImpl")//格式化 service 实现类文件名称


                .mapperBuilder()
                //.superClass()//设置父类: BaseMapper.class || com.baomidou.global.BaseMapper
                .enableMapperAnnotation()//开启 @Mapper 注解,默认值:false
                .enableBaseResultMap()  //启用 BaseResultMap 生成,默认值:false
                .enableBaseColumnList() //启用 BaseColumnList,默认值:false
                //.convertXmlFileName()
                .formatMapperFileName("%sMapper")//格式化 mapper 文件名称
                .formatXmlFileName("%sMapper");//格式化 xml 实现类文件名称

        //当表名中带*号时可以启用通配符模式
        if (tableNames.length == 1 && tableNames[0].contains("*")) {
            String[] likeStr = tableNames[0].split("_");
            String likePrefix = likeStr[0] + "_";
            builder.likeTable(new LikeTable(likePrefix));
        } else {
            builder.addInclude(tableNames);
        }
        return builder.build();
    }

}

2.3、自定义模板引擎

package config;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

import java.io.File;
import java.util.Map;

public class TimerVelocityTemplateEngine extends VelocityTemplateEngine {
    @Override
    protected void outputCustomFile(Map<String, String> customFile, TableInfo tableInfo, Map<String, Object> objectMap) {
        //数据库表映射实体名称
        String entityName = tableInfo.getEntityName();

        String otherPath = this.getPathInfo(OutputFile.other);
        //System.out.println(JsonUtils.toJSONString(tableInfo));

        //数据库表映射实体名称 驼峰命名法
        objectMap.put("humpEentityName",toLowerCaseFirstOne(entityName));

        customFile.forEach((key, value) -> {
            String fileName = String.format(otherPath + File.separator +key,entityName);
            this.outputFile(new File(fileName), objectMap, value);
        });
    }

    /**
     * 首字母转为小写
     * @param s
     * @return
     */
    private  String toLowerCaseFirstOne(String s){
        if(Character.isLowerCase(s.charAt(0))) {
            return s;
        }else {
            return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
        }
    }

}

2.4、运行结果

在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐