代碼生成器的介紹
對於我來說,開發時最難受的時候除了有bug沒有解決之外,就是做複製粘貼了。每次創建一個新的模塊,都要重複的不斷複製實體類的屬性,然後在寫上一次註釋,再把代碼中該繼承的繼承。用Mybatis-Plus的代碼生成器AutoGenerator就可以省去這一部分的煩惱。它幫我直接把Entity、Mapper、Mapper XML、Service、Controller等文件預先生成好,也幫我把Entity對應的表做好了映射,也寫好的註釋,還有Service以及Mapper文件,也幫我把Mybatis-Plus需要用的父類繼承好了。這樣就省去我這一部分的開發工作。
代碼生成器的依賴
除了一章節的Mybatis-Plus的核心依賴以外,還需要添加兩個重要的依賴:
<!--mybatisplus的代碼生成器依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.2</version>
</dependency>
以及
<!--freemarker模板引擎-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
代碼生成工具類
AutoGenerator
代碼生成器的主類,之後的各種配置都會添加到這個類裏面,例如:
- GlobalConfig(全局配置);
- DataSourceConfig(數據源配置);
- PackageConfig(包配置);
- TemplateConfig(模板配置)
- InjectionConfig(自定義配置);
- StrategyConfig(策略配置(數據庫表配置));
AutoGenerator mpg = new AutoGenerator();// 代碼生成器主類
GlobalConfig
全局配置,定義文件的輸出目錄,設置文件的@author信息等
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");// 獲取用戶程序當前路徑(項目根的路徑)
gc.setOutputDir(projectPath + "/src/main/java");// 生成文件的輸出目錄(默認值:D 盤根目錄)
gc.setAuthor("ck");// 開發人員(默認值:null)
gc.setOpen(false);// 是否打開輸出目錄(默認值:null)
gc.setFileOverride(true);// 是否覆蓋已有文件(默認值:false)
mpg.setGlobalConfig(gc);//把全局配置添加到代碼生成器主類
DataSourceConfig
數據源配置,這個比較清晰了,數據庫表映射實體類時需要配置數據庫的連接信息。
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://47.103.17.3:3306/lm_dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8");
dsc.setSchemaName("public");// 數據庫 schema name(例如 PostgreSQL 可指定爲 public)
dsc.setDbType(DbType.MYSQL);// 數據庫類型
dsc.setDriverName("com.mysql.cj.jdbc.Driver");// 驅動名稱
dsc.setUsername("chenkang"); // 用戶名
dsc.setPassword("258963"); // 密碼
類型轉換 默認由 dbType 類型決定選擇對應數據庫內置實現。
實現 ITypeConvert 接口自定義數據庫 字段類型 轉換爲自己需要的 java 類型,也可以直接重寫自帶的MySqlTypeConvert類的processTypeConvert方法,是一個道理
dsc.setTypeConvert(new MySqlTypeConvert() {
@Override
public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
return super.processTypeConvert(globalConfig, fieldType);
}
});
mpg.setDataSource(dsc);//把數據源配置添加到代碼生成器主類
PackageConfig
包配置,就是每個類最上面的package,比如:package com.ck.mybatisplus.foundation.service;這裏包配置可以分別配置service、entity、controller等等
PackageConfig pc = new PackageConfig();
pc.setModuleName("foundation");// 父包模塊名
pc.setParent("com.ck.mybatisplus");// 父包名。如果爲空,將下面子包名必須寫全部, 否則就只需寫子包名
pc.setService("service");// Service包名
pc.setEntity("entity");// Entity包名
pc.setServiceImpl("service.impl");// ServiceImpl包名
pc.setMapper("mapper");// Mapper包名
pc.setController("controller");// Contoller包名
// pc.setXml("mapper.xml");// Mapper.xml包名
mpg.setPackageInfo(pc);// 把包配置添加到代碼生成器主類
TemplateConfig
模板配置,配置模板,此模板配置默認生成mybatisplus自帶模板的controller.java、service.java、serviceImpl.java、mapper.java、.xml、entity類的文件
若不想用默認的模板生成的文件,有兩種方法:
- 一種是直接set自定義的模板路徑,如下面的templateConfig.setController("/templates/MyController.java.ftl")
- 第二種是使用自定義配置(下面有講解),前提是要先把默認值設爲null,如templateConfig.setXml(null)。兩種方法的共同點是都需要先有自定義的模板文件,
不同是第一種的文件生成路徑是在前面的包配置固定了的,第二種是連文件生成的路徑都是可以自定義的!
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
// templateConfig.setController("/templates/MyController.java.ftl");
mpg.setTemplate(templateConfig);// 把模板配置添加到代碼生成器主類
InjectionConfig
自定義配置,前面也說了,只要有相應的模板文件,基本上能滿足在項目中任何位置生成你想要的文件,比如.java、.xml、.jsp文件等,首先new出自定義配置的對象,如下
InjectionConfig cfg = new InjectionConfig() {
/**
* 使用initMap是抽象方法,所以必須被重寫,
* 注入自定義 Map 對象(注意需要setMap放進去),該對象可以傳遞到模板引擎通過 cfg.xxx 引用
*/
@Override
public void initMap() {
Map<String, Object> map = new HashMap<>();
map.put("mapperId", "testMapperId");
this.setMap(map);
}
};
然後配置模板的路徑
.ftl表示是模板引擎是 freemarker,還有.vm表示模板引擎是 velocity等等
String templatePath = "/templates/mapper.xml.ftl";
再自定義輸出配置,配置 FileOutConfig 指定模板文件、輸出文件達到自定義文件生成目的,如果同時自定義兩個或多個以上,可以直接focList.add多個new FileOutConfig(templatePath) {}配置
自定義配置會被優先輸出
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定義輸出文件名 , 如果你 Entity 設置了前後綴、此處注意 xml 的名稱會跟着發生變化!!
return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
自定義判斷是否創建文件,該配置用於判斷某個類是否需要覆蓋創建,如果想覆蓋之前已生成的文件,isCreate方法直接返回true,默認是false
一般情況可以不用配置這個,直接使用默認的不覆蓋
cfg.setFileCreate(new IFileCreate() {
@Override
public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
// 判斷自定義文件夾是否需要創建,
// checkDir("調用默認方法創建的目錄");
// 當然也可以自定義哪些文件可以被覆蓋哪些不可以被覆蓋,更新判斷邏輯返回true或者false
return false;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
StrategyConfig
數據庫表配置,通過該配置,可指定需要生成哪些表或者排除哪些表等信息,
StrategyConfig strategy = new StrategyConfig();
// 數據庫表映射到實體的命名策略:下劃線轉駝峯
strategy.setNaming(NamingStrategy.underline_to_camel);
// 數據庫表字段映射到實體的命名策略, 未指定按照 naming 執行
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// 自定義繼承類全稱,帶包名 (以下爲示例)
strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
strategy.setEntityLombokModel(true);// 【實體】是否爲lombok模型(默認 false)
strategy.setRestControllerStyle(true);// 生成 @RestController 控制器
strategy.setSuperEntityColumns("id");// 寫於父類中的公共字段
strategy.setInclude("fnd_user");// 需要包含的表名,允許正則表達式(與exclude二選一配置)
strategy.setExclude("m_fnd_user1");// 需要排除的表名,允許正則表達式
strategy.setControllerMappingHyphenStyle(true);// 駝峯轉連字符
strategy.setEntityTableFieldAnnotationEnable(true);// 是否生成實體時,生成字段註解 默認false;
strategy.setTablePrefix(pc.getModuleName() + "_");// 表前綴
mpg.setStrategy(strategy);// 把策略配置添加到代碼生成器主類
模板引擎
向代碼生成器主類上配置模板引擎,這是是freemarker,mpg.execute()方法就是執行生成代碼類。
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
以上內容來源於