Mybatis-Plus 代码生成器工具类
对 MP 的代码生成器写一个简单的工具类:
public class Main {
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入" + tip + ":");
if (scanner.hasNext()) {
String ipt = scanner.next();
if (!StringUtils.isEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
// String parentPath = System.getProperty("user.dir"); // 如果工程就一个模块只设置 parentName
String parentPath = "E:\\xxx\\xxx\\"; // 如果工程就一个模块只设置 parentName
String submoduleName = "test"; // 如果有子模块还需设置 submoduleName 一般针对一个模块的表
String generatingPath = "com.cnda.server"; // 逆向生成的代码的根路径
/*
* AutoGenerator 代码生成器
*/
AutoGenerator ag = new AutoGenerator();
System.out.println(parentPath);
//1. 全局配置
GlobalConfig config = new GlobalConfig();
/*
* GlobalConfig主要配置的属性有:
* -- 是否支持AR模式
* -- 生成代码结构的根路径
* -- 文件是否覆盖
* -- 主键策略
* -- 生成基本的resultMap
* -- 生成基本的SQL片段,也就是xml文件中的sql标签,包含了表中的字段名
*/
config // 设置作者名
.setAuthor("cnda")
// 是否支持AR模式:AR 模式相对于原始的 MP 模式来说,可以通过 pojo 实体类(继承了 Model 类)
// 直接操作数据库。但是底层任然是使用 mapper 进行操作。
// .setActiveRecord(true)
// 生成路径:项目地址 + 模块地址,一般情况下
.setOutputDir(parentPath + "/"+ submoduleName+"/src/main/java")
// 文件覆盖
//.setFileOverride(false)
// 打开输出目录
.setOpen(false)
// 主键策略
.setIdType(IdType.AUTO)
// 设置日期格式
//.setDateType(DateType.ONLY_DATE)
// 设置生成的service接口的名字的首字母是否为I,默认Service是以I开头的
.setServiceName("%sService")
//生成基本的resultMap
.setBaseResultMap(true)
// 实体属性 swagger2 注解
//.setSwagger2(true)
//生成基本的SQL片段
.setBaseColumnList(true);
//2. 数据源配置
/**
* DataSourceConfig的主要属性配置
* 此处为MP连接数据库读取数据库中表的属性和字段名,帮我们自动生成项目结构和数据库中表对应的实体类
* -- 数据库类型
*/
DataSourceConfig dsConfig = new DataSourceConfig();
// 设置数据库类型
dsConfig//.setDbType(DbType.MYSQL)
.setDriverName("com.mysql.cj.jdbc.Driver")
.setUrl("jdbc:mysql://localhost:3306/yeb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai")
.setUsername("root")
.setPassword("root");
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 通过模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
// 定义了 mapper.xml 文件输出的位置!指向的是 resources/mapper/*
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return parentPath + "/"+submoduleName+"/src/main/resources/mapper/"+tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
//3. 策略配置globalConfiguration中
/**
* StrategyConfig的主要属性配置
* -- 全局大写命名
* -- 数据库表映射到实体类的命名策略
* -- 生成表(要生成实体类的表名,支持多表·11一起生成,以数组的形式填写)
* -- 设置表的前缀(TablePrefix)
*/
StrategyConfig stConfig = new StrategyConfig();
//全局大写命名
stConfig.setCapitalMode(true)
// 数据库表映射到实体的命名策略
.setNaming(NamingStrategy.underline_to_camel) // 驼峰命名
// 数据库表字段映射实体类的命名策略
.setColumnNaming(NamingStrategy.no_change) // 不做任何改变
// lombok 模型
.setEntityLombokModel(true)
// 生成 @RestController 控制器
.setRestControllerStyle(true)
// 生成的表,多个表以英文逗号区分
.setInclude(scanner("表名,多个英文逗号分割").split(",")) // 由 scanner 控制台输入多个表名进行逆向工程生成代码
//url中驼峰转连字符
.setControllerMappingHyphenStyle(true)
// 设置表的前缀,防止生成实体类时出现表的前缀
.setTablePrefix("t_");
//4. 包名策略配置
/**
* PackageConfig的主要属性配置
* 公共包--Parent
*/
PackageConfig pkConfig = new PackageConfig();
pkConfig.setParent(generatingPath)
.setMapper("mapper")
.setService("service")
.setController("controller")
.setServiceImpl("service.impl")
.setEntity("pojo");
// mapper.xml 之前在 InjectionConfig 那里配置过了
//.setXml("mapper");
//5. 整合配置
/**
* 整合需要的对象有:
* --> GlobalConfig
* --> DataSourceConfig
* --> StrategyConfig
* --> PackageConfig
*/
ag.setGlobalConfig(config)
.setDataSource(dsConfig)
.setStrategy(stConfig)
.setCfg(cfg)
.setTemplate(templateConfig)
.setTemplateEngine(new FreemarkerTemplateEngine())
.setPackageInfo(pkConfig);
//6. 执行
ag.execute();
System.out.println("======= 代码生成完毕 ========");
}
}
上面应该能满足大部分基础的项目结构。需要注意的是前面几个路径的变量设置。
还有一个就是 mapper.xml 一般是在项目的 resource
目录下,如果需要设置到与 mapper
接口一个包下,就需要将 ag.setCfg(cfg)
删除,然后再 pkConfig.setXml("path")
保证与 setMapper("path")
保持一致即可。