**
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