MybatisPlus懒人代码生成器(附源码)
简介
此代码生成器是根据Mybatis-Plus官网的介绍,结合常用的开发需求而成的。工具可以帮助生成 controller\service\mapper\entity文件,未包含前端页面。
以往用到代码生成器,要么就是web容器启动、要么就是在idea编译器中开发,用一些以后又很久不打开再次使用又得打开容器很麻烦,因此我做了简单开发做个可执行的代码生成器。
最终达到的效果是:编译以后的可运行jar包mpCodegen-1.0.jar
拷贝给我或者其他人进行简单配置即可使用,不需要idea编译器或web容器。是一个最简洁、最方便、最快速的开箱可用的懒人代码生成器。
使用效果
我们先来看下我们使用代码生成器的效果:
E:\dev\my>java -jar mpCodegen-1.0.jar
---------------------------------------------
|-正在使用代码生成器,请检查以下内容:
|-1.已配置数据库、包名等。E:\dev\my/config.properties
|-2.手动删除文件(存在则不会再生成):E:\dev\my/outfile
---------------------------------------------
请输入您是否已完成以上配置?y/n:
y
[2021-07-09 15/:52/:37]DEBUG com.baomidou.mybatisplus.generator.AutoGenerator(line/:93) -==========================准备 生成文件...==========================
......
[2021-07-09 15/:52/:41]DEBUG com.baomidou.mybatisplus.generator.AutoGenerator(line/:107) -==========================文件生成完成!!!==========================
---------------------------------------------
|-文件生成目录:E:\dev\my/outfile
---------------------------------------------
通过上面的效果可以看出来,我们只需要一个CMD控制台就可以完成代码生成。拷贝给其他人很方便就能生成代码了。
使用代码生成器
-
配置
config.properties
[重要]。根据实际情况配置数据库链接、包名、作者等内容。详见配置文件详解 -
在工作目录下使用cmd命令进入控制台。
在控制台输入以下命令
java -jar mpCodegen-1.0.jar
如果不想看源码想直接使用,请直接前往gitee上下载发行版v1.0
代码实现
我们来看下实现源码。源码已经在gitee,欢迎来添砖。源码地址
pom.xml引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.naiqing</groupId>
<artifactId>mpCodegen</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- log -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0-alpha2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>2.0.0-alpha2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>CodegenMain</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
读取配置文件
CodeGenertorConfig.java
public class CodeGenertorConfig {
private String configPath;
private String datasourceUrl;
private String datasourceUsername;
private String datasourcePassword;
private String outdir;
private String author;
private boolean openSwagger2;
private boolean openLombok;
private String moduleName;
private String packageName;
private String superEntity;
private String superController;
private String tableNames;
private static CodeGenertorConfig codeGenertorConfig = null;
private CodeGenertorConfig(){
}
public static CodeGenertorConfig getInstance() throws Exception {
if(codeGenertorConfig == null){
codeGenertorConfig = new CodeGenertorConfig();
codeGenertorConfig.init();
}
return codeGenertorConfig;
}
public void init() throws Exception{
Properties properties = new Properties();
configPath = System.getProperty("user.dir")+ "/config.properties";
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader(configPath));
// 使用properties对象加载输入流
properties.load(bufferedReader);
}catch (Exception e){
System.out.println("缺少配置文件:"+configPath);
throw e;
}
//获取key对应的value值
datasourceUrl = properties.getProperty("datasource.url");
datasourceUsername = properties.getProperty("datasource.username");
datasourcePassword = properties.getProperty("datasource.password");
author = properties.getProperty("codegen.author");
outdir = properties.getProperty("codegen.outdir");
if(StringUtils.isBlank(outdir)){
outdir = System.getProperty("user.dir");
}
if(!outdir.endsWith("/")){
outdir=outdir+"/";
}
outdir=outdir+"outfile";
String openSwagger2Str = properties.getProperty("codegen.openSwagger2");
openSwagger2 = Boolean.valueOf(StringUtils.isBlank(openSwagger2Str) ? "true" : openSwagger2Str);
String openLombokStr = properties.getProperty("codegen.openLombok");
openLombok = Boolean.valueOf(StringUtils.isBlank(openLombokStr) ? "true" : openLombokStr);
moduleName = properties.getProperty("codegen.moduleName");
packageName = properties.getProperty("codegen.packageName");
superEntity = properties.getProperty("codegen.superEntity");
superController = properties.getProperty("codegen.superController");
tableNames = properties.getProperty("codegen.tableNames");
}
...省略getter
}
代码生成器核心 代码
CodeGenerator.java
public class CodeGenerator {
/**
* <p>
* 读取控制台内容
* </p>
*/
public String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotBlank(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
/**
* 开始执行
*/
public void startCodeGen() throws Exception{
CodeGenertorConfig config = CodeGenertorConfig.getInstance();
System.out.println("---------------------------------------------");
System.out.println("|-正在使用代码生成器,请检查以下内容:");
System.out.println("|-1.已配置数据库、包名等。"+config.getConfigPath());
System.out.println("|-2.手动删除文件(存在则不会再生成):"+config.getOutdir());
System.out.println("---------------------------------------------");
System.out.println();
String goOn = scanner("您是否已完成以上配置?y/n");
if("n".equalsIgnoreCase(goOn)){
System.out.println("已退出!");
return;
}
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = config.getOutdir();
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor(config.getAuthor());
gc.setOpen(false);
//实体属性 Swagger2 注解
gc.setSwagger2(config.isOpenSwagger2());
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl(config.getDatasourceUrl());
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername(config.getDatasourceUsername());
dsc.setPassword(config.getDatasourcePassword());
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(config.getModuleName());
pc.setParent(config.getPackageName());
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/myMapper.xml.ftl";
// 自定义输出配置
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;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
if(StringUtils.isNotBlank(config.getSuperEntity())) {
strategy.setSuperEntityClass(config.getSuperEntity());
}
strategy.setEntityLombokModel(config.isOpenLombok());
strategy.setRestControllerStyle(true);
// 公共父类
if(StringUtils.isNotBlank(config.getSuperController())){
strategy.setSuperControllerClass(config.getSuperController());
}
if(StringUtils.isNotBlank(config.getTableNames())){
strategy.setInclude(config.getTableNames().split(","));
}else {
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
}
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
System.out.println();
System.out.println();
System.out.println("---------------------------------------------");
System.out.println("|-文件生成目录:"+config.getOutdir());
System.out.println("---------------------------------------------");
}
}