首先贴上官方文档地址Mybatis-Plus代码生成器,具体的参数配置参考官方文档。
Mybatis-plus的代码生成器是mybatis-plus组件的,并不是mybatis的,注意不要看错,这里会介绍代码生成器的主要用法以及需要注意的事项。
1.添加maven依赖
Mybatis-plus的代码生成器在3.0.3之后就独立出来,与mybatis-plus分开了,所以使用高版本的mybatis-plus的同学要注意,代码生成器要单独引入,如果是使用低版本的,不需要额外引用,这里使用的是按照官方文档的3.1.2版本,
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache/POM/4.0.0"
xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache/POM/4.0.0 http://maven.apache/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.code.generator</groupId>
<artifactId>code-generator</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.2</version>
</dependency>
<!-- velocity 模板引擎, 默认 -->
<!-- https://mvnrepository/artifact/org.apache.velocity/velocity-engine-core -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!-- freemarker 模板引擎 -->
<!-- https://mvnrepository/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<!-- https://mvnrepository/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>oracle.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.2.0</version>
</dependency>
<!-- https://mvnrepository/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
2.编写代码生成器的类
依赖好了之后就可以开始编写我们的代码生成器,代码生成器主要有几部分的配置,具体配置的说明参考代码注释
(1)全局配置
(2)包名配置
(3)数据源配置
(4)输出模板
(5)自定义配置
(6)生成策略
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CodeGenerator {
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
/**
* 全局配置,常用
* 1.配置文件输出的路径OutputDir
* 2.设置是否每次覆盖文件FileOverride
* 3.mybatis的xml配置,如二级缓存,是否生成resultMap映射,是否生成columnlist的sql,这里没有使用xml,所以注释掉
* 4.设置作者、是否使用swagger2等全局变量,其他变量参考官方文档
* 5.自定义文件命名,%s是占位符,会将实体名替换进去
*/
final GlobalConfig gc = new GlobalConfig();
gc.setOutputDir("E://output");//输出文件路径
gc.setFileOverride(true);
gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
//gc.setEnableCache(false);// XML 二级缓存
//gc.setBaseResultMap(true);// XML ResultMap
//gc.setBaseColumnList(false);// XML columList
gc.setAuthor("simple");// 作者
gc.setSwagger2(true);
// 自定义文件命名,注意 %s 会自动填充表实体属性!
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
mpg.setGlobalConfig(gc);
/**
* 包的配置,主要设置每一层的包名
*/
final PackageConfig pc = new PackageConfig();
//设置包名
pc.setParent("com.code.generator");
pc.setController("system.web");
pc.setService("system.service");
pc.setServiceImpl("system.service.impl");
pc.setMapper("system.mapper");
pc.setEntity("domain.po");
mpg.setPackageInfo(pc);
/**
* 数据源配置,mybatis支持的数据库这里都支持
*/
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.ORACLE);
dsc.setDriverName("oracle.jdbc.driver.OracleDriver");
//TODO
dsc.setUsername("user");
//TODO
dsc.setPassword("password");
//TODO
dsc.setUrl("jdbc:oracle:thin:@ip:host:db");
mpg.setDataSource(dsc);
/**
* 输出模板,如果按照官方原生的可以不配置,也可以配置自定义的模板
*/
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定义输出模板
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别,默认vm,xml不输出
templateConfig.setEntity("myTemplates/entity.java");
templateConfig.setService("myTemplates/service.java");
templateConfig.setServiceImpl("myTemplates/serviceImpl.java");
templateConfig.setController("myTemplates/controller.java");
templateConfig.setMapper("myTemplates/mapper.java");
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
/**
* 自定义配置,可以自定义参数在模板中使用,还可以已定义输出的文件,
* 如果除了上面的几个模板之外还有其他的文件需要输出可以在这里设置
*/
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("tableComment", "系统用户");
map.put("Handler", pc.getParent()+".system.handler");
map.put("SuperHandler", "com.code.generator.core.base.BaseHandler");
map.put("SuperHandlerName", "BaseHandler");
map.put("vo", pc.getParent()+".domain.vo");
this.setMap(map);
}
};
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义handler
focList.add(new FileOutConfig("myTemplates/handler.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return gc.getOutputDir() + "/com/code/generator/handler/"
+ tableInfo.getEntityName()+"Handler" + StringPool.DOT_JAVA;
}
});
// 自定义provider
focList.add(new FileOutConfig("myTemplates/provider.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return gc.getOutputDir() + "/com/code/generator/mapper/provider/"
+ tableInfo.getEntityName()+"Provider" + StringPool.DOT_JAVA;
}
});
// 自定义vo
focList.add(new FileOutConfig("myTemplates/vo.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return gc.getOutputDir() + "/com/code/generator/domain/vo/"
+ tableInfo.getEntityName()+"Vo" + StringPool.DOT_JAVA;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
/**
* 生成策略配置,常用
* 1.指定生成的表名
* 2.表名前缀过滤
* 3.实体名、字段名的命名方式
* 4.指定继承的父类、父字段
*/
StrategyConfig strategy = new StrategyConfig();
//过滤表前缀
strategy.setTablePrefix(new String[] { "T_" });
//类名生成策略:驼峰命名
strategy.setNaming(NamingStrategy.underline_to_camel);
//字段名生成方式:驼峰命名
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//需要生成的表
strategy.setInclude(new String[] { "T_SYS_USER" });
strategy.setCapitalMode(true);
//controller是否restful风格
strategy.setRestControllerStyle(true);
//配置继承的父类
strategy.setSuperEntityClass("com.code.generator.po.BaseDomain");
strategy.setSuperEntityColumns("ID","ISVALID","CREATORID","CREATEDTIME","MODIFYID","MODIFYTIME","PACKAGEID");
strategy.setSuperControllerClass("com.code.generator.core.base.BaseController");
strategy.setSuperServiceClass("com.code.generator.core.base.BaseService");
strategy.setSuperServiceImplClass("com.code.generator.impl.core.base.BaseServiceImpl");
strategy.setSuperMapperClass("com.code.generator.impl.core.base.BaseMapper");
mpg.setStrategy(strategy);
// 执行生成
mpg.execute();
}
}
3.自定义输出模板
mybatis-plus-generator的jar包里面有原生的模板文件,在jar包的templates目录下,btl对应的是beetl模板引擎,ftl对应freemarker模板引擎,vm对应的是velocity模板引擎,默认是vm,如果想更改使用的引擎可以通过setTemplateEngine方法设置,模板中的全局变量可以参考下面方法里面的变量com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine#getObjectMap
如果不想使用原生的模板,可以编写自己的模板,基于原生模板修改,新的模板要放在resources下面,注意写的时候不要加上模板文件的后缀,会根据引擎自动识别,如果不想输出对应的文件,需要设置为null,否则会拿jar包下面原生的模板生成。
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别,默认vm,xml不输出
templateConfig.setEntity("myTemplates/entity.java");
templateConfig.setXml(null);
4.自定义参数模板
(1)自定义参数
代码生成器中提供了一些模板参数,如果需要定制化自己的模板可能需要一些自定义的参数可以在这里添加,在模板中可以通过${cfg.key}来使用
(2)自定义模板
原生提供的有controller、service、serviceImpl、dao、mapper、entity六种生成模板,如果我们还需要输出其他的一些模板文件,可以通过以下方式来输出,与TemplateConfig配置不一样,这里模板的路径需要加上后缀,还需要指定输出路径。
到这里,代码生成器就可以工作了,但是还有一些小缺陷在其他的文章中没有提到,下面再提两点
4.关于日志输出
在代码生成器中实际上是有生成过程的日志输出的,如果配置不正确也会有对应的提示,但是在很多的教程里面都没有提到这一点,控制台都提示log4j异常了。
关于日志,实际上在模板引擎中就有log4j的api包引入了,但是log4j还需要有对应的实现才能输出日志,所以会提示上图的异常,因此在上面我的依赖中还加入了slf4j-log4j12的实现依赖
这时候我们再来运行,发现还会报错,这是因为缺少log4j的properties文件,下面我们建立一个log4j.properties文件,注意文件名不要改,就叫这个名字,配置内容参考下面的,也可以用你常用的,具体配置的属性自行查找吧
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
上面该补的补完之后我们就可以看到代码生成器的控制台日志了
5.关于字段类型转换
代码生成器在生成字段信息的时候会从数据库获取表字段信息,根据一定的规则来生成字段,如果不想使用原生的字段信息,可以自定义自己的规则,在这里我使用的是Oracle数据库,在配置数据源的时候有两个方法setDbQuery和setTypeConvert,前者是获取数据库字段信息的sql,后者是数据库字段类型与java字段类型的映射规则,下面我们看一下源码的实现看看是如何转换的
(1)获取字段信息,在这里可以看到对于Oracle在处理Number类型字段的时候是做了处理的,不像mysql,很多时候我们会直接使用number来代表各种数字类型,如double、decimal等,这里会根据number的字段长度、小数位来进行组装然后提供给后面字段映射来进行处理,所以我们在设计的时候要注意,该定义长度就定义长度,该定义小数位就定义小数位,尽量不要直接用number或者number(*,0)这样的方式来定义,否则在后面映射的时候回当成Double处理,但实际上我们想要的是Integer,不然生成之后你就只能手工修改,或者自定义自己的转换规则来适配
SELECT
A.COLUMN_NAME,
CASE
WHEN A.DATA_TYPE = 'NUMBER' THEN
(
CASE
WHEN A.DATA_PRECISION IS NULL THEN
A.DATA_TYPE
WHEN NVL( A.DATA_SCALE, 0 ) > 0 THEN
A.DATA_TYPE || '(' || A.DATA_PRECISION || ',' || A.DATA_SCALE || ')' ELSE A.DATA_TYPE || '(' || A.DATA_PRECISION || ')'
END
) ELSE A.DATA_TYPE
END DATA_TYPE,
B.COMMENTS,
DECODE( C.POSITION, '1', 'PRI' ) KEY
FROM
ALL_TAB_COLUMNS A
INNER JOIN ALL_COL_COMMENTS B ON A.TABLE_NAME = B.TABLE_NAME
AND A.COLUMN_NAME = B.COLUMN_NAME
AND B.OWNER = 'USER'--schema
LEFT JOIN ALL_CONSTRAINTS D ON D.TABLE_NAME = A.TABLE_NAME
AND D.CONSTRAINT_TYPE = 'P'
AND D.OWNER = 'USER'--schema
LEFT JOIN ALL_CONS_COLUMNS C ON C.CONSTRAINT_NAME = D.CONSTRAINT_NAME
AND C.COLUMN_NAME = A.COLUMN_NAME
AND C.OWNER = 'USER' --schema
WHERE
A.OWNER = 'USER' --schema
AND A.TABLE_NAME = 'T_SYS_USER'
ORDER BY
A.COLUMN_ID
(2)字段类型映射
字段类型映射我们关注点还是对于number的处理,其他类型都是直接映射过去的,在这里可以看到是使用了正则表达式对number的字段长度进行匹配来区分Integer、Long、Double,如果没有小数位,长度小于10的则为Integer,否则为Long,否则一律按Double处理,所以在定义Number的时候就注意按实际来吧,不要贪图方便或者偷懒,否则生成之后Entity、xml都要做相应的修改。
更多推荐
mybatis-plus代码生成器使用及注意事项
发布评论