這篇文章將為大家詳細講解有關mybatis plus自動生成器的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
使用這個可以超快速生成entity service controller層
模板引擎的依賴也要導入,不然運行會報錯的
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.1.tmp</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency>

這里的時候,一定一定要把import的包也復制,不然很容易出錯
package van.generator;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
/**
* @author Van
* @date 2020/5/1 - 15:43
*/
public class CodeGenerator {
/**
* <p>
* 讀取控制臺內容
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("請輸入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("請輸入正確的" + tip + "!");
}
/**
* RUN THIS
*/
public static void main(String[] args) {
// 代碼生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/ad-sponsor/src/main/java/van");
gc.setAuthor("van");
gc.setOpen(false);
mpg.setGlobalConfig(gc);
// 數據源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/ad?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("321asd");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(scanner("模塊名"));
pc.setParent("com.baomidou.mybatisplus.samples.generator");
mpg.setPackageInfo(pc);
// 自定義配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定義輸入文件名稱
return projectPath + "/mybatis-plus-sample-generator/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
mpg.setTemplate(new TemplateConfig().setXml(null));
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.generator.common.BaseEntity");
strategy.setEntityLombokModel(true);
strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.generator.common.BaseController");
strategy.setInclude(scanner("表名"));
strategy.setSuperEntityColumns("id");
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
// 選擇 freemarker 引擎需要指定如下加,注意 pom 依賴必須有!
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}1.全局配置

2.數據源配置

3.包配置


1.首先運行這里
要求輸入的模塊名是生成的entity等的上層包名,我這里輸入的是sys如上圖所示

2.全局配置這里

是指定要生成的地方(模塊名)

3.數據源配置沒啥說的,填入正確信息即可
4.包配置

Mybatis-plus的代碼生成器是mybatis-plus組件的,并不是mybatis的,注意不要看錯,這里會介紹代碼生成器的主要用法以及需要注意的事項。
Mybatis-plus的代碼生成器在3.0.3之后就獨立出來,與mybatis-plus分開了,所以使用高版本的mybatis-plus的同學要注意,代碼生成器要單獨引入,如果是使用低版本的,不需要額外引用,這里使用的是按照官方文檔的3.1.2版本,


<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.code.generator</groupId> <artifactId>code-generator</artifactId> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.1.2</version> </dependency> <!-- velocity 模板引擎, 默認 --> <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency> <!-- freemarker 模板引擎 --> <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>oracle.jdbc</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.2.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.20.RELEASE</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency> </dependencies> </project>
依賴好了之后就可以開始編寫我們的代碼生成器,代碼生成器主要有幾部分的配置,具體配置的說明參考代碼注釋
(1)全局配置
(2)包名配置
(3)數據源配置
(4)輸出模板
(5)自定義配置
(6)生成策略
import com.baomidou.mybatisplus.annotation.DbType;
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.NamingStrategy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CodeGenerator {
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
/**
* 全局配置,常用
* 1.配置文件輸出的路徑OutputDir
* 2.設置是否每次覆蓋文件FileOverride
* 3.mybatis的xml配置,如二級緩存,是否生成resultMap映射,是否生成columnlist的sql,這里沒有使用xml,所以注釋掉
* 4.設置作者、是否使用swagger2等全局變量,其他變量參考官方文檔
* 5.自定義文件命名,%s是占位符,會將實體名替換進去
*/
final GlobalConfig gc = new GlobalConfig();
gc.setOutputDir("E://output");//輸出文件路徑
gc.setFileOverride(true);
gc.setActiveRecord(false);// 不需要ActiveRecord特性的請改為false
//gc.setEnableCache(false);// XML 二級緩存
//gc.setBaseResultMap(true);// XML ResultMap
//gc.setBaseColumnList(false);// XML columList
gc.setAuthor("simple");// 作者
gc.setSwagger2(true);
// 自定義文件命名,注意 %s 會自動填充表實體屬性!
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
mpg.setGlobalConfig(gc);
/**
* 包的配置,主要設置每一層的包名
*/
final PackageConfig pc = new PackageConfig();
//設置包名
pc.setParent("com.code.generator");
pc.setController("system.web");
pc.setService("system.service");
pc.setServiceImpl("system.service.impl");
pc.setMapper("system.mapper");
pc.setEntity("domain.po");
mpg.setPackageInfo(pc);
/**
* 數據源配置,mybatis支持的數據庫這里都支持
*/
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.ORACLE);
dsc.setDriverName("oracle.jdbc.driver.OracleDriver");
//TODO
dsc.setUsername("user");
//TODO
dsc.setPassword("password");
//TODO
dsc.setUrl("jdbc:oracle:thin:@ip:host:db");
mpg.setDataSource(dsc);
/**
* 輸出模板,如果按照官方原生的可以不配置,也可以配置自定義的模板
*/
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定義輸出模板
//指定自定義模板路徑,注意不要帶上.ftl/.vm, 會根據使用的模板引擎自動識別,默認vm,xml不輸出
templateConfig.setEntity("myTemplates/entity.java");
templateConfig.setService("myTemplates/service.java");
templateConfig.setServiceImpl("myTemplates/serviceImpl.java");
templateConfig.setController("myTemplates/controller.java");
templateConfig.setMapper("myTemplates/mapper.java");
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
/**
* 自定義配置,可以自定義參數在模板中使用,還可以已定義輸出的文件,
* 如果除了上面的幾個模板之外還有其他的文件需要輸出可以在這里設置
*/
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("tableComment", "系統用戶");
map.put("Handler", pc.getParent()+".system.handler");
map.put("SuperHandler", "com.code.generator.core.base.BaseHandler");
map.put("SuperHandlerName", "BaseHandler");
map.put("vo", pc.getParent()+".domain.vo");
this.setMap(map);
}
};
// 自定義輸出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定義handler
focList.add(new FileOutConfig("myTemplates/handler.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return gc.getOutputDir() + "/com/code/generator/handler/"
+ tableInfo.getEntityName()+"Handler" + StringPool.DOT_JAVA;
}
});
// 自定義provider
focList.add(new FileOutConfig("myTemplates/provider.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return gc.getOutputDir() + "/com/code/generator/mapper/provider/"
+ tableInfo.getEntityName()+"Provider" + StringPool.DOT_JAVA;
}
});
// 自定義vo
focList.add(new FileOutConfig("myTemplates/vo.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
return gc.getOutputDir() + "/com/code/generator/domain/vo/"
+ tableInfo.getEntityName()+"Vo" + StringPool.DOT_JAVA;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
/**
* 生成策略配置,常用
* 1.指定生成的表名
* 2.表名前綴過濾
* 3.實體名、字段名的命名方式
* 4.指定繼承的父類、父字段
*/
StrategyConfig strategy = new StrategyConfig();
//過濾表前綴
strategy.setTablePrefix(new String[] { "T_" });
//類名生成策略:駝峰命名
strategy.setNaming(NamingStrategy.underline_to_camel);
//字段名生成方式:駝峰命名
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//需要生成的表
strategy.setInclude(new String[] { "T_SYS_USER" });
strategy.setCapitalMode(true);
//controller是否restful風格
strategy.setRestControllerStyle(true);
//配置繼承的父類
strategy.setSuperEntityClass("com.code.generator.po.BaseDomain");
strategy.setSuperEntityColumns("ID","ISVALID","CREATORID","CREATEDTIME","MODIFYID","MODIFYTIME","PACKAGEID");
strategy.setSuperControllerClass("com.code.generator.core.base.BaseController");
strategy.setSuperServiceClass("com.code.generator.core.base.BaseService");
strategy.setSuperServiceImplClass("com.code.generator.impl.core.base.BaseServiceImpl");
strategy.setSuperMapperClass("com.code.generator.impl.core.base.BaseMapper");
mpg.setStrategy(strategy);
// 執行生成
mpg.execute();
}
}mybatis-plus-generator的jar包里面有原生的模板文件,在jar包的templates目錄下,btl對應的是beetl模板引擎,ftl對應freemarker模板引擎,vm對應的是velocity模板引擎,默認是vm,如果想更改使用的引擎可以通過setTemplateEngine方法設置,模板中的全局變量可以參考下面方法里面的變量com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine#getObjectMap


如果不想使用原生的模板,可以編寫自己的模板,基于原生模板修改,新的模板要放在resources下面,注意寫的時候不要加上模板文件的后綴,會根據引擎自動識別,如果不想輸出對應的文件,需要設置為null,否則會拿jar包下面原生的模板生成。
//指定自定義模板路徑,注意不要帶上.ftl/.vm, 會根據使用的模板引擎自動識別,默認vm,xml不輸出
templateConfig.setEntity("myTemplates/entity.java");
templateConfig.setXml(null);
(1)自定義參數
代碼生成器中提供了一些模板參數,如果需要定制化自己的模板可能需要一些自定義的參數可以在這里添加,在模板中可以通過${cfg.key}來使用

(2)自定義模板
原生提供的有controller、service、serviceImpl、dao、mapper、entity六種生成模板,如果我們還需要輸出其他的一些模板文件,可以通過以下方式來輸出,與TemplateConfig配置不一樣,這里模板的路徑需要加上后綴,還需要指定輸出路徑。

到這里,代碼生成器就可以工作了,但是還有一些小缺陷在其他的文章中沒有提到,下面再提兩點
在代碼生成器中實際上是有生成過程的日志輸出的,如果配置不正確也會有對應的提示,但是在很多的教程里面都沒有提到這一點,控制臺都提示log4j異常了。

關于日志,實際上在模板引擎中就有log4j的api包引入了,但是log4j還需要有對應的實現才能輸出日志,所以會提示上圖的異常,因此在上面我的依賴中還加入了slf4j-log4j12的實現依賴


這時候我們再來運行,發現還會報錯,這是因為缺少log4j的properties文件,下面我們建立一個log4j.properties文件,注意文件名不要改,就叫這個名字,配置內容參考下面的,也可以用你常用的,具體配置的屬性自行查找吧


log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
上面該補的補完之后我們就可以看到代碼生成器的控制臺日志了

代碼生成器在生成字段信息的時候會從數據庫獲取表字段信息,根據一定的規則來生成字段,如果不想使用原生的字段信息,可以自定義自己的規則,在這里我使用的是Oracle數據庫,在配置數據源的時候有兩個方法setDbQuery和setTypeConvert,前者是獲取數據庫字段信息的sql,后者是數據庫字段類型與java字段類型的映射規則,下面我們看一下源碼的實現看看是如何轉換的

(1)獲取字段信息
在這里可以看到對于Oracle在處理Number類型字段的時候是做了處理的,不像mysql,很多時候我們會直接使用number來代表各種數字類型,如double、decimal等,這里會根據number的字段長度、小數位來進行組裝然后提供給后面字段映射來進行處理,所以我們在設計的時候要注意,該定義長度就定義長度,該定義小數位就定義小數位,盡量不要直接用number或者number(*,0)這樣的方式來定義,否則在后面映射的時候回當成Double處理,但實際上我們想要的是Integer,不然生成之后你就只能手工修改,或者自定義自己的轉換規則來適配
SELECT
A.COLUMN_NAME,
CASE
WHEN A.DATA_TYPE = 'NUMBER' THEN
(
CASE
WHEN A.DATA_PRECISION IS NULL THEN
A.DATA_TYPE
WHEN NVL( A.DATA_SCALE, 0 ) > 0 THEN
A.DATA_TYPE || '(' || A.DATA_PRECISION || ',' || A.DATA_SCALE || ')' ELSE A.DATA_TYPE || '(' || A.DATA_PRECISION || ')'
END
) ELSE A.DATA_TYPE
END DATA_TYPE,
B.COMMENTS,
DECODE( C.POSITION, '1', 'PRI' ) KEY
FROM
ALL_TAB_COLUMNS A
INNER JOIN ALL_COL_COMMENTS B ON A.TABLE_NAME = B.TABLE_NAME
AND A.COLUMN_NAME = B.COLUMN_NAME
AND B.OWNER = 'USER'--schema
LEFT JOIN ALL_CONSTRAINTS D ON D.TABLE_NAME = A.TABLE_NAME
AND D.CONSTRAINT_TYPE = 'P'
AND D.OWNER = 'USER'--schema
LEFT JOIN ALL_CONS_COLUMNS C ON C.CONSTRAINT_NAME = D.CONSTRAINT_NAME
AND C.COLUMN_NAME = A.COLUMN_NAME
AND C.OWNER = 'USER' --schema
WHERE
A.OWNER = 'USER' --schema
AND A.TABLE_NAME = 'T_SYS_USER'
ORDER BY
A.COLUMN_ID(2)字段類型映射
字段類型映射我們關注點還是對于number的處理,其他類型都是直接映射過去的,在這里可以看到是使用了正則表達式對number的字段長度進行匹配來區分Integer、Long、Double,如果沒有小數位,長度小于10的則為Integer,否則為Long,否則一律按Double處理,所以在定義Number的時候就注意按實際來吧,不要貪圖方便或者偷懶,否則生成之后Entity、xml都要做相應的修改。

關于“mybatis plus自動生成器的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。