pom.xml
<dependencies>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--junit测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.3.4.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<!--代码生成模式插件 3.0.3以后需要手动设置依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<!--代码生成模板-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
<!--简化代码插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!-- druid阿里巴巴数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!--swagger2-->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>spring-boot-starter-swagger</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
</dependencies>
生成工具
package com.fordring.util;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.lang.reflect.Field;
import java.util.*;
/**
* author:Fordring
* Date: 2020/4/5 9:14
*/
public class CodeGenerationUtils {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
//=============================配置文件,使用修改1========================
//用来获取Mybatis-Plus.properties文件的配置信息 :
ResourceBundle rb = ResourceBundle.getBundle("code-generate"); //不要加后缀
//=============================配置文件,使用修改1========================
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(rb.getString("OutputDir"));
gc.setFileOverride(false);
gc.setActiveRecord(true);// 开启 activeRecord 模式
gc.setEnableCache(false);// XML 二级缓存
gc.setBaseResultMap(true);// XML ResultMap
gc.setBaseColumnList(false);// XML columList
gc.setServiceName("%sService"); //去掉service的I前缀,一般只需要设置service就行
//生成代码后,是否打开文件夹
gc.setOpen(false);
gc.setFileOverride(false); //是否覆盖原来代码,个人建议设置为false,别覆盖,危险系数太高
gc.setAuthor(rb.getString("author"));
mpg.setGlobalConfig(gc);
/* gc.setMapperName("%sMapper");
gc.setXmlName("%sMapper");
gc.setServiceImplName("%sServiceImpl");
gc.setControllerName("%sController");*/
gc.setDateType(DateType.ONLY_DATE); //日期格式
gc.setSwagger2(true); // 实体属性 Swagger2 注解,实体类上会增加注释
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setTypeConvert(new MySqlTypeConvert());
dsc.setDriverName(rb.getString("jdbc.driver"));
dsc.setUsername(rb.getString("jdbc.user"));
dsc.setPassword(rb.getString("jdbc.pwd"));
dsc.setUrl(rb.getString("jdbc.url"));
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent(rb.getString("parent")); //自定义包的路径
//pc.setModuleName("module"); //模块名称 设置后,会生成com.cxyxs.test.module,里面存放之前设置的mapper,entity
pc.setEntity("entity");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
mpg.setPackageInfo(pc);
//=============================配置文件,使用修改2========================
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// 此处可以修改为您的表前缀,生成实体类等忽略前缀
strategy.setTablePrefix(new String[]{"t_"});
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
//设置映射的表名,可以设置多个表
strategy.setInclude("t_new");
//=============================配置文件,使用修改2========================
//包的命名规则,使用驼峰规则
strategy.setNaming(NamingStrategy.underline_to_camel);
//列的名称,使用驼峰规则
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//是否使用lombok
strategy.setEntityLombokModel(true);
//驼峰命名
strategy.setRestControllerStyle(true);
strategy.setLogicDeleteFieldName("is_delete"); //逻辑删除,假删除会用到
mpg.setStrategy(strategy);
customPackagePath(pc, mpg, rb);
// 执行生成
mpg.execute(); //执行
}
public static void customPackagePath(PackageConfig pc, AutoGenerator mpg, ResourceBundle rb) throws NoSuchFieldException, IllegalAccessException {
/*
* packageInfo配置controller、service、serviceImpl、entity、mapper等文件的包路径
* 这里包路径可以根据实际情况灵活配置
*/
Map<String, String> packageInfo = new HashMap<>();
packageInfo.put(ConstVal.CONTROLLER, rb.getString("parent") + ".controller");
packageInfo.put(ConstVal.SERVICE, rb.getString("parent") + ".service");
packageInfo.put(ConstVal.SERVICE_IMPL, rb.getString("parent") + ".service.impl");
packageInfo.put(ConstVal.ENTITY, rb.getString("parent") + ".entity");
packageInfo.put(ConstVal.MAPPER, rb.getString("parent") + ".mapper");
/*
* pathInfo配置controller、service、serviceImpl、entity、mapper、mapper.xml等文件的生成路径
* srcPath也可以更具实际情况灵活配置
* 后面部分的路径是和上面packageInfo包路径对应的源码文件夹路径
* 这里你可以选择注释其中某些路径,可忽略生成该类型的文件,例如:注释掉下面pathInfo中Controller的路径,就不会生成Controller文件
*/
Map<String,String> pathInfo = new HashMap<>();
pathInfo.put(ConstVal.CONTROLLER_PATH, rb.getString("OutputDir") + "/" + packageInfo.get(ConstVal.CONTROLLER).replaceAll("\\.","/"));
pathInfo.put(ConstVal.SERVICE_PATH, rb.getString("OutputDir") + "/"+ packageInfo.get(ConstVal.SERVICE).replaceAll("\\.","/"));
pathInfo.put(ConstVal.SERVICE_IMPL_PATH, rb.getString("OutputDir") + "/"+ packageInfo.get(ConstVal.SERVICE_IMPL).replaceAll("\\.","/"));
pathInfo.put(ConstVal.ENTITY_PATH, rb.getString("OutputDir") + "/" + packageInfo.get(ConstVal.ENTITY).replaceAll("\\.","/"));
pathInfo.put(ConstVal.MAPPER_PATH, rb.getString("OutputDir") + "/" + packageInfo.get(ConstVal.MAPPER).replaceAll("\\.","/"));
pathInfo.put(ConstVal.XML_PATH, rb.getString("OutputDirXml") + "/" + packageInfo.get(ConstVal.MAPPER).replaceAll("\\.","/"));
pc.setPathInfo(pathInfo);
/*
* 创建configBuilder对象,传入必要的参数
* 将以上的定义的包路径packageInfo配置到赋值到configBuilder对象的packageInfo属性上
* 因为packageInfo是私有成员变量,也没有提交提供公共的方法,所以使用反射注入
* 为啥要这么干,看源码去吧
*/
ConfigBuilder configBuilder = new ConfigBuilder(mpg.getPackageInfo(), mpg.getDataSource(), mpg.getStrategy(), mpg.getTemplate(), mpg.getGlobalConfig());
Field packageInfoField = configBuilder.getClass().getDeclaredField("packageInfo");
packageInfoField.setAccessible(true);
packageInfoField.set(configBuilder, packageInfo);
/*
* 设置配置对象
*/
mpg.setConfig(configBuilder);
}
}
生成工具使用的配置文件
#实体类及controller输出路径
OutputDir=/Users/fordring/Desktop/ideaprojects/demo/code-generate/src/main/java
#mapper.xml文件输出路径
OutputDirXml=/Users/fordring/Desktop/ideaprojects/demo/code-generate/src/main/resources
#作者
author=Fordring
#公共包名
parent=com.fordring.generate
#对应数据库
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///fordring
jdbc.user=root
jdbc.pwd=123456