前言
这两天一直在弄我负责的那些项目开源组件升级,因为好多组件有漏洞,要升级版本。然后mybatis-plus也是其中之一,因为我一直用的版本是3.4.3,现在要升级到3.5.2版本以上。然后3.4.x和3.5.x有一些地方变动还是挺大的,主要就是在代码生成这一块,变动比较大,以前写得生成工具类已经不能用了。然后现在重新写了3.5.x版本的生成工具类。
这里我把3.4和3.5的都放上来,大家可以对比参考下。
3.4.x版本
<!-- mybatis_plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!-- 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 代码生成工具类
*/
public class GenerateUtil {
/**
* 数据库链接地址
*/
private static final String URL = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&serverTimezone=UTC";
/**
* 驱动
*/
private static final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
/**
* 用户名
*/
private static final String USERNAME = "root";
/**
* 密码
*/
private static final String PASSWORD = "123456";
/**
* 作者
*/
private static final String AUTHOR = "fuHua";
/**
* 父包名
*/
private static final String PACKAGE_PARENT = "com";
public static 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 (StrUtil.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
/**
* 全局配置
*
* @return 返回 GlobalConfig
*/
private static GlobalConfig getGlobalConfig() {
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor(AUTHOR);
gc.setOpen(false);
// 是否覆盖同名文件,默认是false
gc.setFileOverride(true);
// 不需要ActiveRecord特性的请改为false
gc.setActiveRecord(false);
// XML 二级缓存
gc.setEnableCache(false);
// XML ResultMap 生成基本的resultmap
gc.setBaseResultMap(true);
// XML columList 生成基本的sql片段
gc.setBaseColumnList(false);
//实体属性 Swagger2 注解
//gc.setSwagger2(true);
gc.setServiceName("");
gc.setServiceImplName("%sService");
return gc;
}
/**
* 数据源配置
*
* @return 返回 getDataSourceConfig
*/
private static DataSourceConfig getDataSourceConfig() {
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl(URL);
dsc.setDriverName(DRIVER_NAME);
dsc.setUsername(USERNAME);
dsc.setPassword(PASSWORD);
return dsc;
}
/**
* 包名配置
*
* @return 返回 PackageConfig
*/
private static PackageConfig getPackageConfig() {
PackageConfig pc = new PackageConfig();
pc.setParent(PACKAGE_PARENT);
//pc.setModuleName(scanner("模块名"));
pc.setEntity("entity.sys");
pc.setMapper("mapper.sys");
pc.setService("");
pc.setServiceImpl("service.sys");
pc.setController("controller.sys");
return pc;
}
/**
* 模板引擎配置
*
* @return 返回 TemplateConfig
*/
private static TemplateConfig getTemplateConfig() {
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
return templateConfig;
}
/**
* 策略配置
*
* @param tableNames 表名称
* strategy.setInclude(tableNames) 传入需要 "生成" 的表名
* strategy.setExclude(tableNames) 传入需要 "过滤" 的表名
* strategy.setSuperEntityColumns("id");
* @return 返回 getStrategyConfig
*/
private static StrategyConfig getStrategyConfig(String... tableNames) {
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 公共父类
strategy.setSuperEntityClass(PACKAGE_PARENT + ".common.base.BaseEntity");
strategy.setSuperMapperClass(strategy.getSuperMapperClass());
strategy.setSuperServiceImplClass(PACKAGE_PARENT + ".common.base.BaseService");
strategy.setSuperControllerClass(PACKAGE_PARENT + ".common.base.BaseController");
// 写于父类中的公共字段
strategy.setSuperEntityColumns("id", "create_by", "create_time", "update_by", "update_time");
strategy.setInclude(tableNames);
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix("_");
strategy.setEntityTableFieldAnnotationEnable(true);
strategy.setEntityLombokModel(true);
return strategy;
}
/**
* 自定义配置
*
* @return 返回 InjectionConfig
*/
private static InjectionConfig getInjectionConfig() {
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
final String templatePath = "/templates/mapper.xml.ftl";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return System.getProperty("user.dir") + "/src/main/resources/mapper/sys/" + tableInfo.getEntityName() + "Mapper" + ".xml";
}
});
cfg.setFileOutConfigList(focList);
return cfg;
}
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
mpg.setGlobalConfig(getGlobalConfig());
// 数据源配置
mpg.setDataSource(getDataSourceConfig());
// 包配置
mpg.setPackageInfo(getPackageConfig());
// 自定义配置
mpg.setCfg(getInjectionConfig());
// 配置模板
mpg.setTemplate(getTemplateConfig());
// 策略配置
//sys_dept,sys_dict,sys_log,sys_menu,sys_post,sys_role,sys_role_dept,sys_role_menu,sys_user,sys_user_post
mpg.setStrategy(getStrategyConfig(scanner("表名,多个英文逗号分割").split(",")));
// 设置模板引擎
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
3.5.x版本
<!-- mybatis_plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- 代码生成器的模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
注意:一定要引入代码生成器的模板引擎,否则的话运行会报错:org/apache/velocity/context/Context
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.common.base.BaseController;
import com.common.base.BaseEntity;
import com.common.base.BaseService;
import java.util.Collections;
import java.util.List;
/**
* 代码生成工具类
*/
public class CodeGenerator {
/**
* 数据库链接地址
*/
private static final String URL = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&serverTimezone=UTC";
/**
* 用户名
*/
private static final String USERNAME = "root";
/**
* 密码
*/
private static final String PASSWORD = "123456";
/**
* 作者
*/
private static final String AUTHOR = "fuHua";
/**
* 表名的前缀,从表生成代码时会去掉前缀
*/
private static final String TABLE_PREFIX = "";
/**
* 模块名
*/
//private static final String MODULE_NAME = "";
/**
* 需要生成的表名,必填
*/
private static final List<String> TABLES = ListUtil.toList("aqhdjl","aqyh","bqbhhjl","bwhyjl","chzttd","czpcx","dzhyj","gqjjc","gzpcx","qxdcx","whjx","yxfsd","zhtd");
public static void main(String[] args) {
if (CollUtil.isEmpty(TABLES)) {
System.out.println("请输入需要生成的表名!");
return;
}
String projectPath = System.getProperty("user.dir");
//全局配置
GlobalConfig config = new GlobalConfig.Builder()
.author(AUTHOR) //作者
.outputDir(projectPath + "/src/main/java") //生成文件输出路径(写到java目录)
//.enableSwagger() //开启swagger
.commentDate("yyyy-MM-dd HH:mm:ss") //注释日期格式
.dateType(DateType.TIME_PACK) //设置时间对应类型
.disableOpenDir() //生成后不要打开目录
.build();
//包名配置
PackageConfig packageConfig = new PackageConfig.Builder()
.parent("com") //父包名
//.moduleName(moduleName) //模块名
.controller("controller.sys") //controller包名
//.service("service.sys") //service接口包名
.serviceImpl("service.sys") //service实现类包名
.entity("entity.sys") //实体类包名
.mapper("mapper.sys") //mapper包名
.xml("mapper.sys") //mapper对应的xml包名
.pathInfo(Collections.singletonMap(OutputFile.mapper.xml, projectPath + "/src/main/resources/mapper/sys")) //mapper对应的xml路径
.build();
//策略配置
StrategyConfig strategyConfig = new StrategyConfig.Builder()
.addTablePrefix(TABLE_PREFIX) //需要抵消的表前缀
.addInclude(TABLES) //设置生成需要映射的表名
//.enableCapitalMode() //策略开启⼤写命名
.serviceBuilder() //构建Service层
.enableFileOverride() //覆盖文件(需谨慎使用)
.formatServiceImplFileName("%sService") //业务层接口实现类命名
.superServiceImplClass(BaseService.class) //service公共父类
.entityBuilder() //构建实体类
.enableFileOverride() //覆盖文件(需谨慎使用)
.superClass(BaseEntity.class) //entity公共父类
.addSuperEntityColumns("id","updateTime","createTime") // 公共字段
.columnNaming(NamingStrategy.underline_to_camel) //字段名驼峰命名
.naming(NamingStrategy.underline_to_camel) //表名驼峰命名
.enableLombok() //添加lombock的getter、setter注解
//.enableChainModel() //启动链式写法@Accessors(chain = true)
//.enableColumnConstant() //启动属性转常量功能@FieldNameConstants
//.logicDeleteColumnName("deleted") //逻辑删除字段,标记@TableLogic
.enableTableFieldAnnotation() //启动字段注解
//.addTableFills(tableFillList) //属性值填充策略
.controllerBuilder() //构建Controller类
.enableFileOverride() //覆盖文件(需谨慎使用)
.enableHyphenStyle() //映射路径使用连字符格式,而不是驼峰
.formatFileName("%sController") //Controller类命名
.superClass(BaseController.class) //Controller 类继承 BaseController
.enableRestStyle() //标记@RestController注解
.mapperBuilder() //构建mapper接口类
.enableFileOverride() //覆盖文件(需谨慎使用)
.enableBaseResultMap() //生成基本的resultMap
.formatMapperFileName("%sMapper") //Mapper接口类明名
.superClass(BaseMapper.class) //Mapper接口类集成 BaseMapper
//.enableMapperAnnotation() //标记@Mapper注解
.formatXmlFileName("%sMapper") //Mapper.xml命名
.enableBaseColumnList() //生成基本的SQL片段
.build();
//数据源配置
DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(URL,USERNAME,PASSWORD);
//数据库类型转换器
dataSourceConfigBuilder.typeConvert(new MySqlTypeConvert() {
/*@Override
public IColumnType processTypeConvert(GlobalConfig globalConfig, String tableField) {
if (tableField.toLowerCase().contains("date") || tableField.toLowerCase().contains("timestamp") || tableField.toLowerCase().contains("datetime")) {
return DbColumnType.STRING;
}
return super.processTypeConvert(globalConfig, tableField);
}*/
});
//创建代码生成器对象,加载配置
AutoGenerator autoGenerator = new AutoGenerator(dataSourceConfigBuilder.build());
autoGenerator.global(config);
autoGenerator.packageInfo(packageConfig);
autoGenerator.strategy(strategyConfig);
//执行
autoGenerator.execute();
System.out.println("======================================== 相关代码生成完毕 =====================================");
}
}
以上就是全部代码了,引入依赖后,代码可以直接复制使用,改一下数据库连接、用户名、密码,还有包名。