一、參考文檔:
官方文檔其實說的很清楚了,可能有個別地方有點不太清楚。
mybatis-plus官方: https://mp.baomidou.com/guide/generator.html
模版引擎用的beetl,之前沒怎么接觸過這塊,不過感覺beetl有點像是寫jsp一樣,上手快。
beetl官方: http://ibeetl.com/guide/#/beetl/
二、具體實現,說明可以看注釋,更詳細的配置可以看官方文檔。
依賴:
<!--代碼生成--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.2.0</version> </dependency> <!--代碼生成使用的模版引擎--> <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>2.9.3</version> </dependency>
import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.toolkit.StringPool; 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.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import com.baomidou.mybatisplus.generator.engine.BeetlTemplateEngine; import java.util.HashMap; import java.util.Map; public class Main { //核心類,所有操作配置都圍繞該類展開。 private static final AutoGenerator mpg = new AutoGenerator(); //獲取項目目錄 private static final String projectPath = System.getProperty("user.dir"); //項目基礎包 private static final String Package = "com.mz.mzservice"; //子模塊包名,最終生成的是類似 com.mz.mzservice.dev 這樣的 private static final String ModuleName = "dev"; public static void main(String[] args) { //數據庫連接配置 DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8"); dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver"); dataSourceConfig.setUsername("root"); dataSourceConfig.setPassword("root"); mpg.setDataSource(dataSourceConfig); //公用的一些配置,一看就懂的就不加注釋了。 GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setOutputDir(projectPath + "/src/main/java"); globalConfig.setAuthor("sun"); //日期類型的字段使用哪個類型,默認是 java8的 日期類型,此處改為 java.util.date globalConfig.setDateType(DateType.ONLY_DATE); //是否覆蓋 已存在文件,默認 false 不覆蓋 globalConfig.setFileOverride(false); //mapper.xml 是否生成 ResultMap,默認 false 不生成 globalConfig.setBaseResultMap(true); //mapper.xml 是否生成 ColumnList,默認 false 不生成 globalConfig.setBaseColumnList(true); //生成的實體類名字,增加前后綴的 ,下面的mapper xml 同理,另外還有controller和service的名稱配置 // globalConfig.setEntityName("%sEntity"); globalConfig.setMapperName("%sMapper"); globalConfig.setXmlName("%sMapper"); //是否生成完成后打開資源管理器 globalConfig.setOpen(false); mpg.setGlobalConfig(globalConfig); PackageConfig pc = new PackageConfig(); pc.setParent(Package); pc.setModuleName(ModuleName); mpg.setPackageInfo(pc); StrategyConfig strategy = new StrategyConfig(); //支持正則表達式,字符串數組。 和 Exclude 二選一 // TODO 此處使用正則生成時,提示有些bug。 // 被正則過濾的表會提示 “^dev_.*$” 表不存在,其實需要生成代碼的表已經正常生成完畢了。 strategy.setInclude("^dev_.*$"); // 不需要生成的表 // strategy.setExclude("sequence"); //此處配置為 下划線轉駝峰命名 strategy.setNaming(NamingStrategy.underline_to_camel); //生成的字段 是否添加注解,默認false strategy.setEntityTableFieldAnnotationEnable(true); //表前綴,配置后 生成的的代碼都會把前綴去掉 // strategy.setTablePrefix("dev_"); //實體類的基礎父類。沒有可以不配置。 strategy.setSuperEntityClass("com.mz.mzservice.entity.BaseEntity"); //這里本來以為配置上 生成的實體類就沒有父類的屬性了,但其實不是。 //如何去掉父類屬性,下面有說明。 strategy.setSuperEntityColumns("creater","createTime","editor","editTime","remark"); //controller,基礎父類 strategy.setSuperControllerClass("com.mz.mzservice.controller.BaseController"); //是否啟用 Lombok strategy.setEntityLombokModel(true); //是否啟用 builder 模式 例:new DevDevice().setDealerId("").setDeviceCode(""); strategy.setEntityBuilderModel(true); mpg.setStrategy(strategy); InjectionConfig in = new InjectionConfig() { @Override public void initMap() { Map<String, Object> map = new HashMap<String, Object>(); //自定義配置,在模版中cfg.superColums 獲取 // TODO 這里解決子類會生成父類屬性的問題,在模版里會用到該配置 map.put("superColums", this.getConfig().getStrategyConfig().getSuperEntityColumns()); this.setMap(map); } }; in.setFileOutConfigList(CollectionUtil.newArrayList(new FileOutConfig("/templates/mapper.xml.btl") { @Override public String outputFile(TableInfo tableInfo) { // 自定義mapper xml輸出目錄 return projectPath + "/src/main/resources/mapper/" + ModuleName + "/" + tableInfo.getMapperName() + StringPool.DOT_XML; } })); mpg.setCfg(in); TemplateConfig templateConfig = new TemplateConfig(); //自定義模版 templateConfig.setController("/templates/btl/controller.java"); templateConfig.setEntity("/templates/btl/entity.java"); //關閉默認的mapper xml生成 templateConfig.setXml(null); mpg.setTemplate(templateConfig); //使用beetl模版引擎 mpg.setTemplateEngine(new BeetlTemplateEngine()); mpg.execute(); } }
三、自定義模版,這里我只粘貼出來,子類不生成父類屬性的地方。修改是基於官方模版的。
說明:大概邏輯是判斷字段名是否包含在之前在代碼里配置的父類字段。如果包含則直接continue。
entity.java.btl
四、官方的默認模版位置