先上官方配置文檔
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>
廢話不多,直接上類,代碼習慣不好,大家將就著看,怎么養(yǎng)成好習慣,歡迎大家批評指正
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 參數(shù)定義
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("|代碼生成器:請檢查代碼生成參數(shù) |");
System.out.println("|項目名(maven多模塊自動生成到項目之下):"+projectName);
System.out.println("|覆蓋已有文件:"+isOverrideStr);
System.out.println("|數(shù)據(jù)庫:"+dbName);
System.out.println("|用戶名:"+dbUser);
System.out.println("|密碼:"+dbPwd);
System.out.println("|表名:"+tableNames);
System.out.println("|實體開關(guān):"+isCreateEntity);
System.out.println("|dao層開關(guān):"+isCreateDaoAndProvider);
System.out.println("|生成dao層還是provider層:"+isCreateDaoOrProvider);
System.out.println("|service層開關(guān):"+isCreateService);
System.out.println("|controller開關(guān):"+isCreateController);
System.out.println("--------------------------------------------------------");
// 3 全局參數(shù)詢問
String projectPath = System.getProperty("user.dir");
if(scanner("是否按照以上參數(shù)執(zhí)行?(y/n)","y").equals("n")){
projectName = scanner("請輸入項目名稱",projectName);
isOverrideStr = scanner("是否覆蓋已有文件(y/n)",isOverrideStr);
dbName = scanner("請輸入數(shù)據(jù)庫名稱(默認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("請輸入服務(wù)名",serviceName);
camelCaseServiceName = StrKit.toCamelCase(serviceName);
camelCaseServiceName = StrKit.toCamelCase(serviceName,"-");
upperCamelCaseServiceName = camelCaseServiceName.substring(0, 1).toUpperCase() + camelCaseServiceName.substring(1);
isCreateService = "n";
}else{
isCreateService = scanner("是否生成service及其實現(xiàn) (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 數(shù)據(jù)源配置
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);//數(shù)據(jù)庫表映射到實體的命名策略
strategy.setTablePrefix(pc.getModuleName() + "_"); //生成實體時去掉表前綴
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//數(shù)據(jù)庫表字段映射到實體的命名策略
strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter鏈式操作
strategy.setRestControllerStyle(true); //restful api風格控制器
strategy.setControllerMappingHyphenStyle(true); //url中駝峰轉(zhuǎn)連字符
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 設(shè)置 自定義模板,以及替換官方模板
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 去下劃線 _或- ,轉(zhuǎn)駝峰,首字母大寫,
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設(shè)置
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、執(zhí)行
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的用法,這里就是替換官方模板和自定義模板的關(guān)鍵所在.有以下幾個點
1.怎么修改默認模板的內(nèi)容?
mybatis-plus-generator 默認使用的是velocity,如果想修改默認的模板內(nèi)容,只需要將下圖的.vm文件拷貝到resources下就可以了。

image.png
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;
// 設(shè)置模板位置
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);//配置生效
轉(zhuǎn)載請注明出處