**
Mybatis代码生成javaConfig配置
**
关于mybatis的代码生成已经有多不胜数的文章和例子,本文主要介绍通过javaConfig的方式替代xml的方式配置,从而以接口的形式完成参数化的代码生成。
一、环境
Idea, JDK8, springboot2.2.2, mysql8.0.13
关键包及版本:
Mysql驱动: mysql-connector-java-8.0.13.jar
二、重点模块
1、New一个springboot基础工程,创建相关文件夹,大致结构如下
2、重点文件GeneratorConfig及方法
package com.tool.toolbox.generator;
import com.tool.toolbox.dto.GeneratorDto;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.*;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @author Administrator
*/
public class GeneratorConfig {
/**模板,暂时不需要*/
private boolean exampleTf = false;
/**静态地址,非项目结构变更不做修改*/
private static String sysUrl = System.getProperty("user.dir")
.concat(File.separator).concat("src")
.concat(File.separator).concat("main")
.concat(File.separator).concat("resources");
public String generatorConfig(GeneratorDto generatorDto) {
String classpathEntry;
if(generatorDto.getDriverClass().contains("mysql")){
classpathEntry = sysUrl + File.separator + "lib" + File.separator + "mysql-connector-java-8.0.13.jar";
}else
throw new IllegalStateException("Unexpected value: " + generatorDto.getDriverClass());
Context context = new Context(ModelType.CONDITIONAL);
context.setTargetRuntime("MyBatis3");
context.setId("mysql");
CommentGeneratorConfiguration commentGeneratorConfiguration = new CommentGeneratorConfiguration();
commentGeneratorConfiguration.addProperty("suppressDate","true");
commentGeneratorConfiguration.addProperty("suppressAllComments","true");
/*数据库链接URL,用户名、密码 */
JDBCConnectionConfiguration jdbcConnectionConfiguration = new JDBCConnectionConfiguration();
jdbcConnectionConfiguration.setDriverClass(generatorDto.getDriverClass());
jdbcConnectionConfiguration.setConnectionURL(generatorDto.getConnectionURL());
jdbcConnectionConfiguration.setUserId(generatorDto.getUsername());
jdbcConnectionConfiguration.setPassword(generatorDto.getPassword());
JavaTypeResolverConfiguration javaTypeResolverConfiguration = new JavaTypeResolverConfiguration();
javaTypeResolverConfiguration.addProperty("forceBigDecimals","false");
/*生成模型的包名和位置*/
JavaModelGeneratorConfiguration javaModelGeneratorConfiguration = new JavaModelGeneratorConfiguration();
javaModelGeneratorConfiguration.setTargetPackage("tamp");
javaModelGeneratorConfiguration.setTargetProject(sysUrl);
javaModelGeneratorConfiguration.addProperty("enableSubPackages","true");
javaModelGeneratorConfiguration.addProperty("trimStrings","true");
/*生成映射文件的包名和位置*/
SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration = new SqlMapGeneratorConfiguration();
sqlMapGeneratorConfiguration.setTargetPackage("tamp");
sqlMapGeneratorConfiguration.setTargetProject(sysUrl);
sqlMapGeneratorConfiguration.addProperty("enableSubPackages","true");
/*生成DAO的包名和位置*/
JavaClientGeneratorConfiguration javaClientGeneratorConfiguration = new JavaClientGeneratorConfiguration();
javaClientGeneratorConfiguration.setConfigurationType("XMLMAPPER");
javaClientGeneratorConfiguration.setTargetPackage("tamp");
javaClientGeneratorConfiguration.setTargetProject(sysUrl);
javaClientGeneratorConfiguration.addProperty("enableSubPackages","true");
PluginConfiguration pluginConfiguration = new PluginConfiguration();
switch (generatorDto.getType()){
case 0: pluginConfiguration.setConfigurationType("com.tool.toolbox.generator.LombokPlugin");break;
case 1: pluginConfiguration.setConfigurationType("com.tool.toolbox.generator.CommentPlugin");break;
}
context.addPluginConfiguration(pluginConfiguration);
context.addProperty("javaFileEncoding","UTF-8");
context.addProperty("javaFormatter","org.mybatis.generator.api.dom.DefaultJavaFormatter");
context.addProperty("xmlFormatter","org.mybatis.generator.api.dom.DefaultXmlFormatter");
context.addProperty("beginningDelimiter","`");
context.addProperty("endingDelimiter","`");
context.setCommentGeneratorConfiguration(commentGeneratorConfiguration);
context.setJdbcConnectionConfiguration(jdbcConnectionConfiguration);
context.setJavaTypeResolverConfiguration(javaTypeResolverConfiguration);
context.setJavaModelGeneratorConfiguration(javaModelGeneratorConfiguration);
context.setSqlMapGeneratorConfiguration(sqlMapGeneratorConfiguration);
context.setJavaClientGeneratorConfiguration(javaClientGeneratorConfiguration);
generatorDto.getTableList().forEach(tableEntity->{
TableConfiguration tableConfiguration = new TableConfiguration(context);
tableConfiguration.setTableName(tableEntity.getTableName());
tableConfiguration.setDomainObjectName(tableEntity.getDomainObjectName());
tableConfiguration.setCountByExampleStatementEnabled(exampleTf);
tableConfiguration.setUpdateByExampleStatementEnabled(exampleTf);
tableConfiguration.setSelectByExampleStatementEnabled(exampleTf);
tableConfiguration.setSelectByExampleStatementEnabled(exampleTf);
tableConfiguration.setDeleteByExampleStatementEnabled(exampleTf);
context.addTableConfiguration(tableConfiguration);
});
Configuration config = new Configuration();
config.addClasspathEntry(classpathEntry);
config.addContext(context);
DefaultShellCallback callback = new DefaultShellCallback(true);
MyBatisGenerator myBatisGenerator;
try {
myBatisGenerator = new MyBatisGenerator(config, callback, new ArrayList<>(0));
myBatisGenerator.generate(null);
return sysUrl + File.separator + "tamp";
} catch (InvalidConfigurationException | InterruptedException | IOException | SQLException e) {
e.printStackTrace();
}
return null;
}
}
方法开始,我们就需要指定本次生成所用的驱动包,需要集成可在此处做分支语句。(注:此处的sysUrl适用本项目结构,复用请当心)
创建一个上下文容器替代xml文件(这是核心操作)
一些必须项,略过(这里面聊起来就太多了)
这里除了mybatis的传统注释插件,还有一份Lombok的注释插件(个人喜好使用)
将必须的部件全部放入上下文容器中(到此一个xml文件就已经有了)
可能我们一次生成好多张表,于是有了这里的循环。
直接调用mybatis逆向工程来生成文件(此处返回了一个url,在后面做打包下载的)
三、插话
本文只是用作交流,算是自己动手的一份总结,或有不简洁、不透彻的地方,请适度吐槽。
四、基础模块
创建 GeneratorDto
创建GeneratorService,并创建唯一的方法born
(从yml文件读取的dirverClass,connectionURL,username,password;文件下载的工具类FileUtils我认为是个常规操作,本次不做展开)
创建GeneratorController
五、效果展示
运行项目,浏览器访问
localhost:8080/generator/born?tableNames=表名1,表名2
结果如下:
六、结语
附上项目demo
https://github.com/zhpngpeng/toolbox.git