背景

代码生成器一共有6个配置,每一个配置对象里面有很多的属性,现在开始解读每一个配置对象里面的具体属性代表什么意思

1 dataSourceConfig 数据源配置


这个数据源配置里面有8个属性,以MySQL数据库为例

//数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        //驱动连接的URL
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatisplus?useUnicode=true&useSSL=false&characterEncoding=utf8");
        //驱动名称
        dsc.setDriverName("com.mysql.jdbc.Driver");
        //数据库连接用户名
        dsc.setUsername("root");
        //数据库连接密码
        dsc.setPassword("123456");

以上代码里面的4个属性,好理解,固定格式那样写就可以了,其实这个数据源的配置,只配置以上的4个属性就可以了,其他的属性的配置是额外的。

dbType属性


我们看源码,这个dbType的参数是什么
参数类型是 DbType,这个是一个枚举类型

具体的值我们可以写:

  dsc.setDbType(DbType.MYSQL);  //设置数据库类型,比如是MySQL,
  还是oracle的数据库

设置这个属性的目的就是 设置数据库类型
默认是MySQL,我们现在对MySQL数据库进行驱动,可以不配置这个属性

typeConvert属性

为什么设置这个属性

数据库字段类型转化为Java实体类的数据类型,内置转换类型无法满足。
我们需要自定义转换类型,就需要设置这个参数

当生成的model实体类,java类型不满足时可以自定义转换

如何写这个参数


我们看看这个属性的参数类型
根据源码看,这个参数类型是一个接口

这个接口的实现类有哪些?

因为现在的数据库是MySQL,我们使用MySqlTypeConvert这个实现类。

既然知道了这个typeConvert这个属性的参数是一个接口,我们也创建了这个接口的实现类,以上代码也创建这个类的对象。但是我们要自定义类型转化,如何实现?

看这个MySqlTypeConvert实现类的源码


源码里面已经将数据库字段类型 和 Java实体类字段类型进行了转换,可是源码里面的转换太少,我们想要自定义,所以我们得重写这个方法。并且方法里面的格式要和源码里面的一样

举个例子:

MySQL数据库的datetime这个字段类型,代码生成器里面没有实现转换,
我们现在需要,我们我们自能自定义,我们将数据库的这个类型转为data类型
    //类型转换
        dsc.setTypeConvert(new MySqlTypeConvert() {
   
            @Override
            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
   
                String t = fieldType.toLowerCase();
                if(t.contains("datetime")){
   
                    return DbColumnType.DATE;
                }


                //其它字段采用默认转换(非mysql数据库可以使用其它默认的数据库转换器)
                return new MySqlTypeConvert().processTypeConvert(globalConfig,fieldType);
            }});

schemaName属性


我们看看源码,这个属性的参数类型是什么
是字符串

那这个参数可以写什么值?
这个不清楚了,网上找的是说// dsc.setSchemaName(“testMyBatisPlus”); 指定数据库的名字,不用在URL里面写,但是我试了一下,报错,不知道有哪位大佬知道,比如我连接MySQL数据库,这个参数可以是什么

dbQuery属性


竟然不需要参数,从官网上看

不需要我们再代码里面写,但是这个属性有什么用?有大佬知道吗

2 strategy(这个类是数据库表配置)

一个数据库里面有很多的表,就是对这些表进行配置,也叫策略配置

一般设置几个属性就可以:

StrategyConfig stConfig = new StrategyConfig();
stConfig.setCapitalMode(true) //全局大写命名
        .setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
        .setTablePrefix("t_")
        .setInclude("t_student"); // 生成的表,多个表继续传递即可,String类型的可变参数

capitalMode属性

官网解释,官网错误,不是isCapitalMode,应该是capitalMode

看源码中这个属性的参数是 Boolean类型

stConfig.setCapitalMode(true) //全局大写命名

naming属性


查看源码,找这个参数是什么


参数是一个枚举,枚举的值是

 .setNaming(NamingStrategy.underline_to_camel)

以上设置是驼峰命名,将数据库表名转为驼峰命名

 .setNaming(NamingStrategy.no_change)


以上设置是什么都不变,数据库字段是什么,转为pojo实体类就是什么格式

columnNaming属性


读源码,看参数是什么类型?


和nameing属性一样,是元组,具体看nameing属性里面的介绍

那这个属性写了与没写有什么区别?
对表里面的字段进行是否转为驼峰命名。

tablePrefix属性

比如数据库表有前缀,生成的实体类对象的名字要把这个前缀去掉,那么就把前缀作为参数给这个属性,生成的实体类就去掉了前缀


数据库表前缀是 t_


设置了这个属性
最后生成的表名是:

fieldPrefix 属性

设置这个属性,实体类里面去掉字段的前缀
这个属性的参数可以传多个参数


include属性


一个数据库里面有多个表,想要选择特定的表进行生成代码,就设置这个属性,里面的参数是表名

exclude属性


一个数据库里面有多个表,想要排除一些特定的表进行生成代码,就设置这个属性,里面的参数是表名

skipView属性


看这个属性的源码,参数是Boolean,默认是false。

数据库现在有一个视图,我们不设置这个属性,那么默认是false,不会跳过这个视图,会生成实体类。前提是不设置include属性,因为只要设置了这个属性,只会生成这个include属性里面的表。


不设置include属性,并且不设置skipView属性,数据库中有视图,最后执行代码,生成了这个视图的实体类

不设置include属性,并且设置skipView属性为TRUE,数据库中有视图,最后执行代码


数据库中有实体,设置了这个属性为TRUE,没有生成这个视图的实体类

entityLombokModel属性


我们设置为true,

在生成的实体类上面,就会生成lombok的注解

entitySerialVersionUID属性

默认是true,我们不管这个属性,会在生成的实体类里面生成这个

如果手动设置为false,那么


实体类里面的那个就不会生成了

entityColumnConstant属性


如果我们手动设置为true,

生成的实体类里面,会多这个


以上这个是表里面每一个字段的静态变量。在业务层可疑直接使用类名.静态变量名,获取到数据库里面的字段名字。

不清楚获取到有什么用,有知道的吗?欢迎评论里面解答

EntityBooleanColumnRemoveIsPrefix属性


但是MySQL数据库是没有Boolean类型的,

也就是说 mysql把boolean=tinyInt(1) 了。
MYSQL保存boolean值时用1代表TRUE,0代表FALSE,boolean在MySQL里的类型为tinyint(1)。

所以,知道是去除is前缀的就可以,我们MySQL不使用这个属性

entityTableFieldAnnotationEnable属性


默认为false

当我们设置了true

生成的实体类里面的每一个字段上面
都有mybatisplus的字段注解

controllerMappingHyphenStyle属性


参数是Boolean类型,默认是false
数据库字段是驼峰,我们设置为true之后,转为的实体类里面就是变为下划线的字符串,比如
数据库中字段是dFu,生成的实体类里面字段变为 d_fu

3 packageInfo配置(包名配置)

这个配置下有很多的属性

我们的每一层就是一个文件夹,就是一个包,现在就是设置这个包的名字的,

// 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com")
                .setMapper("mapper")
                .setService("service")
                .setController("controller")
                .setEntity("pojo")
                .setXml("mapper");


以上就是生成的包名

moduleName属性

父包里面的模块名

        pc.setModuleName("blog")
                .setParent("com")
                .setMapper("mapper")
                .setService("service")
                .setController("controller")
                .setEntity("pojo")
                .setServiceImpl("Impll")
                .setXml("mapper");

以上代码父包是com,里面有一个模块blog,这个模块下才是各个层

serviceImpl属性


生成的是:

pathInfo属性

这个属性不知道干嘛的,好像没用

4 template 模板配置

5 globalConfig 全局策略 globalConfig 配置

outputDir属性



首先获取项目根目录,就是你的项目在哪个文件夹下,那个文件夹的路径

当前输出的根目录是:

G:\导出\源码

我们利用这个代码生成器是生成controller层,mapper层,pojo层,service层,这个层的文件夹要生成在哪里?
就是利用这个配置,配置输出的路径

   //全局配置策略
        GlobalConfig gc = new GlobalConfig();
        String path = System.getProperty("user.dir");//动态获取当前项目的路径
        System.out.println(path);
        gc.setOutputDir(path+"/03_mp_code/src");

author属性

如果不写这个属性,生成的文件上是


如果写了这个属性


生成的文件上是:

open属性

默认为TRUE,我们一执行完这个生成的代码,就会打开生成的文件所在的文件夹。
没什么用,我们手动设置为FALSE

fileOverride属性


如果我们一直执行生成代码的这个文件,是否覆盖之前同名的,默认是false,不覆盖,我们可以不写这个,一般就是不覆盖,如果你想每一次生成,都覆盖之前生成的,就改为TRUE。我是一般就是默认。

设置名字格式的属性


这些属性都是,只是生成不同层的名字格式。

如果不设置这些属性,那么生成的是


格式就是 表名+ 每层的后缀

如果设置了某一个


生成的是:

设置的参数中%s 就是数据库的表名

idType属性

gc.setIdType(IdType.AUTO);//设置主键策略

这个属性的参数是一个枚举类型(看源码可知)

具体的枚举值是:(看源码可知)

我们一般设置

gc.setIdType(IdType.AUTO);//设置主键策略

写了这个,执行之后,生成的实体类主键就会有一个注解

dateType属性

//定义生成的实体类中日期类型


看源码,知道参数是:
是枚举

枚举的具体值是:

例子

数据库表这三个字段类型是:

我们生成的代码里面不设置这个属性,这个属性默认是TIME_PACK

我们看实体类里面生成的字段类型:

如果设置了这个属性:

 gc.setDateType(DateType.ONLY_DATE);

如果设置为:
 gc.setDateType(DateType.SQL_PACK);

生成的实体类时间:

总结

根据以上3个参数,生成的实体类格式,我们一般会在这个生成代码里面写

gc.setDateType(DateType.ONLY_DATE);

swagger2属性


参数是Boolean类型,看自己想不想生成,其实就是生成swagger的注解,放到对应的位置。

试了一下,改为TRUE,只是生成实体类上面的swagger注解
其他地方没有生成


所以这个没什么用,就一个注解,我们手动也可以生成,所以不需要管这个属性。

enableCache属性



当我们改为TRUE,生成的xml文件里面,就多了这句话:

activeRecord属性

   gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false

这个就是实体类实现crud。是否需要生成这个。
变为TRUE,实体类就继承 model。不然不继承

baseResultMap属性

默认FALSE,如果开启,在生成的xml里面就会生成

不然是没有以下的东西的。

baseColumnList属性

默认FALSE,设为TRUE


在xml里面生成


好像没有什么用,我一般不管这个属性,默认为false.

kotlin属性


不知道这个属性干什么,因为默认是false,所以不用管了。

如果有知道的,评论里面告我一下啦

6 injectionConfig 注入 injectionConfig 配置