Mybatis-plus之代码生成器
2021-08-21 本文已影响0人
指尖行动
先上官方配置文档
https://mp.baomidou.com/config/generator-config.html#controllername
目的:mybatis-plus自定义模板生成;mybatis-plus修改默认模板
pom
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
废话不多,直接上类,代码习惯不好,大家将就着看,怎么养成好习惯,欢迎大家批评指正
MyBatisGenerator.java
scanner方法封装一下
// 摘自官方,稍加改动
public static String scanner(String tip,String defaultValue) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("(按q退出)请输入" + tip + ":"+ (!StringUtils.isNotBlank(defaultValue) ? "" : "(默认值="+defaultValue+")"));
System.out.println(help.toString());
if (scanner.hasNextLine()) {
String ipt = scanner.nextLine();
if(ipt.equals("q")){
System.exit(1);
}
if (StringUtils.isNotBlank(ipt)) {
return ipt;
}else if (StringUtils.isNotBlank(defaultValue)){
return defaultValue;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
生成器配置,代码很长,,自己看吧。。。抱歉咯
public static void generator(){
// 1 参数定义
String projectName = "demo";
String isOverrideStr = "y";
String dbName = "oauth";
String dbUser = "root";
String dbPwd = "322103";
String tableNames = "*";// *号全部
String isCreateEntity = "y";
String isCreateDaoAndProvider = "y";
String isCreateDaoOrProvider = "d";// d/p
String isCreateService = "y";
String isCreateController = "y";
String serviceName = "";
String camelCaseServiceName = "";
String upperCamelCaseServiceName = "";
// 2 提示
System.out.println("--------------------------------------------------------");
System.out.println("|代码生成器:请检查代码生成参数 |");
System.out.println("|项目名(maven多模块自动生成到项目之下):"+projectName);
System.out.println("|覆盖已有文件:"+isOverrideStr);
System.out.println("|数据库:"+dbName);
System.out.println("|用户名:"+dbUser);
System.out.println("|密码:"+dbPwd);
System.out.println("|表名:"+tableNames);
System.out.println("|实体开关:"+isCreateEntity);
System.out.println("|dao层开关:"+isCreateDaoAndProvider);
System.out.println("|生成dao层还是provider层:"+isCreateDaoOrProvider);
System.out.println("|service层开关:"+isCreateService);
System.out.println("|controller开关:"+isCreateController);
System.out.println("--------------------------------------------------------");
// 3 全局参数询问
String projectPath = System.getProperty("user.dir");
if(scanner("是否按照以上参数执行?(y/n)","y").equals("n")){
projectName = scanner("请输入项目名称",projectName);
isOverrideStr = scanner("是否覆盖已有文件(y/n)",isOverrideStr);
dbName = scanner("请输入数据库名称(默认localhost:3306)",dbName);
dbUser = scanner("请输入db用户名",dbUser);
dbPwd = scanner("请输入db密码",dbPwd);
tableNames = scanner("请输入需要生成的表名,多表用逗号分隔,全部生成请输入[*]",tableNames);
isCreateEntity = scanner("是否生成entity (y/n)",isCreateEntity);
isCreateDaoAndProvider = scanner("是否生成dao或provider文件(y/n)",isCreateDaoAndProvider);
isCreateDaoOrProvider = scanner("生成Provider还是Dao文件? p/d",isCreateDaoOrProvider);
if(isCreateDaoOrProvider.equals("p")) {
serviceName = scanner("请输入服务名",serviceName);
camelCaseServiceName = StrKit.toCamelCase(serviceName);
camelCaseServiceName = StrKit.toCamelCase(serviceName,"-");
upperCamelCaseServiceName = camelCaseServiceName.substring(0, 1).toUpperCase() + camelCaseServiceName.substring(1);
isCreateService = "n";
}else{
isCreateService = scanner("是否生成service及其实现 (y/n)",isCreateService);
}
isCreateController = scanner("是否生成controller (y/n)",isCreateController);
}
// 4 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(projectPath+ File.separator+ projectName + "/src/main/java");
gc.setAuthor("zl");
gc.setOpen(false); //生成后是否打开资源管理器
gc.setFileOverride(isOverrideStr.equals("y")); //重新生成时文件是否覆盖
gc.setServiceName("%sService"); //去掉Service接口的首字母I
gc.setIdType(IdType.ASSIGN_ID); //主键策略
gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
gc.setSwagger2(true);//开启Swagger2模式
gc.setXmlName("%sMapper");
gc.setMapperName("%sDao");
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
// 5 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/"+dbName+"?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername(dbUser);
dsc.setPassword(dbPwd);
dsc.setDbType(DbType.MYSQL);
// 6 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(null); //模块名
pc.setParent("com.soul");
pc.setController("rest");
pc.setEntity("entity");
pc.setService("service");
pc.setMapper("dao");
pc.setXml("dao.mapper");
// 7 策略配置
StrategyConfig strategy = new StrategyConfig();
if(!tableNames.trim().equals("*")){
strategy.setInclude(tableNames.split(","));//对那一张表生成代码
}
strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
strategy.setRestControllerStyle(true); //restful api风格控制器
strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
strategy.setSuperControllerClass("com.soul.base.BaseController");
strategy.setSuperEntityClass("com.soul.entity.po.BasePO");
strategy.setSuperEntityColumns("id","create_by","create_dept_path","create_date","update_by","update_dept_path","update_date");
strategy.setEntityTableFieldAnnotationEnable(true);
strategy.setTablePrefix("t_","v_","b_");
strategy.setLogicDeleteFieldName("enables");
strategy.setChainModel(true);
strategy.setEntityBooleanColumnRemoveIsPrefix(true);
// 8 InjectionConfig 设置 自定义模板,以及替换官方模板
InjectionConfig config = null;
if(isCreateDaoAndProvider.equals("y") && isCreateDaoOrProvider.equals("p")){
pc.setMapper("provider");
pc.setXml("provider.fallback");
String finalServiceName = serviceName;
String finalCamelCaseServiceName = camelCaseServiceName;
String finalUpperCamelCaseServiceName = upperCamelCaseServiceName;
config = new InjectionConfig() {
@Override
public void initMap() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("serviceName", finalServiceName);
// ServiceName 去下划线 _或- ,转驼峰,首字母大写,
map.put("camelCaseServiceName", finalCamelCaseServiceName);
map.put("upperCamelCaseServiceName", finalUpperCamelCaseServiceName);
this.setMap(map);
}
};
config.setFileOutConfigList(new ArrayList<>());
String finalProjectName = projectName;
FileOutConfig providerFile = new FileOutConfig("/templates/provider.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return projectPath+ File.separator+ finalProjectName + "/src/main/java"+File.separator + "com/soul/provider/"+(finalUpperCamelCaseServiceName) + "Provider.java";
}
};
config.getFileOutConfigList().add(providerFile);
String finalProjectName2 = projectName;
FileOutConfig serviceFile = new FileOutConfig("/templates/_service.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return projectPath+ File.separator+ finalProjectName2 + "/src/main/java"+File.separator + "com/soul/service/"+finalUpperCamelCaseServiceName + "Service.java";
}
};
config.getFileOutConfigList().add(serviceFile);
String finalProjectName3 = projectName;
FileOutConfig serviceImplFile = new FileOutConfig("/templates/_serviceimpl.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return projectPath+ File.separator+ finalProjectName3 + "/src/main/java"+File.separator + "com/soul/service/impl/"+finalUpperCamelCaseServiceName + "ServiceImpl.java";
}
};
config.getFileOutConfigList().add(serviceImplFile);
}
// 9 TemplateConfig设置
TemplateConfig templateConfig = new TemplateConfig();
if(isCreateEntity.equals("n")){
templateConfig.setEntity(null);
}
if(isCreateDaoAndProvider.equals("n") || isCreateDaoOrProvider.equals("p") ){
templateConfig.setXml(null);
templateConfig.setMapper(null);
}
if(isCreateService.equals("n") || isCreateDaoOrProvider.equals("p")){
templateConfig.setService(null);
templateConfig.setServiceImpl(null);
}
if(isCreateController.equals("n")){
templateConfig.setController(null);
}
// 10、执行
AutoGenerator mpg = new AutoGenerator();
mpg.setGlobalConfig(gc);
mpg.setDataSource(dsc);
mpg.setPackageInfo(pc);
mpg.setStrategy(strategy);
mpg.setCfg(config);
mpg.setTemplate(templateConfig);
mpg.execute();
System.out.println("注意: mapper.xml 默认在包下,请注意添加pom加入xml文件到classes下");
}
这里着重说一下InjectionConfig的用法,这里就是替换官方模板和自定义模板的关键所在.有以下几个点
1.怎么修改默认模板的内容?
mybatis-plus-generator 默认使用的是velocity,如果想修改默认的模板内容,只需要将下图的.vm文件拷贝到resources下就可以了。

2.怎么指定输出特定的文件?比如只生成Service 或者Controller?
// set null则不生成
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setEntity(null);
templateConfig.setXml(null);
templateConfig.setMapper(null);
templateConfig.setService(null);
templateConfig.setServiceImpl(null);
mpg.setTemplate(templateConfig);//配置生效
3.怎么增加自己的模板?比如PO、VO、DTO、Provider等?
自己在resources中定义自己的velocity模板,这里不列举了。
InjectionConfig config = new InjectionConfig() {
@Override
public void initMap() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("serviceName", finalServiceName);//模板中cfg.serviceName取值
this.setMap(map);
}
};
config.setFileOutConfigList(new ArrayList<>());
String finalProjectName = projectName;
// 设置模板位置
FileOutConfig providerFile = new FileOutConfig("/templates/provider.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
// 输出位置
return projectPath+ File.separator+ finalProjectName + "/src/main/java"+File.separator + "com/soul/provider/"+tableInfo.getEntityName() + "Provider.java";
}
};
config.getFileOutConfigList().add(providerFile);
mpg.setCfg(config);//配置生效
转载请注明出处