目录
背景
代码生成器一共有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,所以不用管了。
如果有知道的,评论里面告我一下啦