概述
MyBatis-Plus(简称 MP)是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,是一个为简化开发、提高效率而生的增强工具。具有无侵入、损耗小、强大的 CRUD 操作、支持 Lambda 形式调用、支持主键自动生成、支持 ActiveRecord 模式、支持自定义全局通用操作、内置代码生成器、内置分页插件等特性。
就像MyBatis-Plus官方网站上所说的
我们的愿景是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。
官方地址是 baomidou.com/
我们先看下这个生成器长啥样
接下来,我们一步一步实现它~~
创建代码生成器
AutoGenerator autoGenerator = new AutoGenerator();
进行全局配置
GlobalConfig config = setConfig();
autoGenerator.setGlobalConfig(config);
private static GlobalConfig setConfig() {
GlobalConfig config = new GlobalConfig();
config.setOutputDir(OUTPUT_DIR);
config.setAuthor(CODE_AUTHER);
config.setOpen(true);
config.setFileOverride(true);
config.setEntityName(SUF_DO);
config.setServiceName(SUF_DAO);
// id生成策略
config.setIdType(IdType.ASSIGN_ID);
config.setServiceImplName(SUF_DAO_IMPL);
return config;
}
这里需要注意一下id生成策略,一般都是 IdType.
ASSIGN_ID
,具体含义我们可以看下IdType
这个类:
ASSIGN_ID
表示分配ID (主键类型为 number
或 string
), 这个类型只有当插入对象ID为空,才自动填充,默认实现方法是雪花算法(如下图)
这里设置了代码根路径、包路径、模块名(注意会在包路径的基础上继续生成)、表名、作者名、生成的DO对象名称后缀、生成的Dao对象名称后缀以及生成的DaoImpl对象名称后缀等属性
数据源配置
用于指定需要生成哪些表或者排除哪些表
DataSourceConfig dataSourceConfig = setDataSourceConfig();
autoGenerator.setDataSource(dataSourceConfig);
private static DataSourceConfig setDataSourceConfig() {
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl(MYSQL_URL);
dataSourceConfig.setDriverName(MYSQL_DRIVER);
dataSourceConfig.setUsername(MYSQL_USERNAME);
dataSourceConfig.setPassword(MYSQL_PASSWORD);
dataSourceConfig.setDbType(DbType.MYSQL);
dataSourceConfig.setTypeConvert(new MySqlTypeConvert());
return dataSourceConfig;
}
参数说明
-
MYSQL_URL
数据库连接 -
MYSQL_DRIVER
数据库驱动 -
MYSQL_USERNAME
数据库用户名 -
MYSQL_PASSWORD
数据库密码
包配置
指定生成代码的包路径
PackageConfig packageConfig = setPackageConfig();
autoGenerator.setPackageInfo(packageConfig);
private static PackageConfig setPackageConfig() {
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent(PACKAGE_NAME);
if (!StringUtils.isEmpty(MODAL_NAME)) {
packageConfig.setEntity("entity." + MODAL_NAME);
packageConfig.setService("dao." + MODAL_NAME);
packageConfig.setServiceImpl("dao." + MODAL_NAME + ".impl");
packageConfig.setMapper("mapper." + MODAL_NAME);
}
return packageConfig;
}
自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
}
};
List<FileOutConfig> focList = setFileOutConfig();
cfg.setFileOutConfigList(focList);
autoGenerator.setCfg(cfg);
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
策略配置
可指定需要生成哪些表或者排除哪些表
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel)
.setColumnNaming(NamingStrategy.underline_to_camel)
.setEntityLombokModel(true)
.setRestControllerStyle(true)
.setInclude(TABLE_NAME.split(","))
.setControllerMappingHyphenStyle(true)
.setChainModel(true);
autoGenerator.setStrategy(strategy);
参数说明
-
NamingStrategy
配置从数据库表到文件的命名策略no_change
不做任何改变,原样输出underline_to_camel
表示下划线转驼峰命名
最后,绑定模板,执行即可~~~
autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());
autoGenerator.execute();
通过main
方法进行调用
public static void main(String[] args) {
codeGeneratorMethod();
}
我们看下执行结果
其实到这里整个步骤就已经完整来的,不过额外介绍下如何自定义类型转换器~
自定义类型转换器
使用默认的 MySqlTypeConvert
时,如果MySQL中定义的是tinyint(1)
类型,在生成DO对象时会生成Boolean
类型
如果你希望仍然使用 Integer
则需要实现一个自定义的类型转换器来继承 MySqlTypeConvert
并重写 processTypeConvert()
方法(以此类推,你也可以进行别的自定义匹配),我们这里拿常见的 tinyint(1)
举个例子:
public class AQinMysqlTypeConvert extends MySqlTypeConvert {
@Override
public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
String type = fieldType.toLowerCase();
if (type.contains("tinyint(1)")) {
return DbColumnType.INTEGER;
}
return super.processTypeConvert(globalConfig, fieldType);
}
}
搞定~~~