MyBatis-plus實(shí)現(xiàn)逆向生成器
1、前言
在日常的Spring Boot項(xiàng)目開(kāi)發(fā)中,我們都會(huì)建立幾個(gè)固有的包,分別是Controller、entity(pojo)、dao、service、serviceimpl。
在單個(gè)Spring Boot項(xiàng)目中,用手動(dòng)建立倒是簡(jiǎn)單,但是在Spring Cloud項(xiàng)目中,會(huì)建立許多的Spring Boot項(xiàng)目,如果此時(shí)還使用手動(dòng)建立這幾個(gè)固有的包,那么就有點(diǎn)耽誤時(shí)間了。
作為程序猿的我們,怎么可能會(huì)手動(dòng)做這種重復(fù)而又浪費(fèi)時(shí)間的事呢!那么Mybatis-plus所提供的逆向生成器就發(fā)揮出了我們想要的效果。
2、實(shí)現(xiàn)逆向生成器
2.1、導(dǎo)入依賴
<!--Spring Boot的啟動(dòng)依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--Mybatis-plus啟動(dòng)依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--Mybatis-plus逆向生成器依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!--數(shù)據(jù)庫(kù)連接依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--Lombok依賴-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--Mybatis-plus逆向生成器的Freemarker模板引擎-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
mybatis-plus-generator這個(gè)依賴要使用3.5.0版本以下的,我使用的是3.4.1版本,因?yàn)檫@個(gè)依賴在3.5.0以后就進(jìn)行了修改,需要使用相關(guān)類的Builder類來(lái)構(gòu)建對(duì)象,然后Builder類所提供的方法又不多,所以我個(gè)人覺(jué)得使用起來(lái)不太方便。
導(dǎo)入數(shù)據(jù)庫(kù)的依賴,是因?yàn)樵谀嫦蛏傻倪^(guò)程中,Mybatis-plus會(huì)根據(jù)指定的表來(lái)生成相應(yīng)的實(shí)力類對(duì)象以及其他層的配置。
導(dǎo)入模板引擎依賴,可以根據(jù)模板引擎來(lái)規(guī)定初始化生成的包的模式。
2.2、項(xiàng)目結(jié)構(gòu)

項(xiàng)目中只有一個(gè)Utils包用來(lái)存放相關(guān)的工具類,而我也把逆向生成器類放在了這個(gè)包里面,如上圖所示的MybatisPlusGenerate類。
我習(xí)慣了使用Spring Boot項(xiàng)目,所以這里的演示也是使用了Spring Boot項(xiàng)目,對(duì)spring Boot不熟悉的猿友可以使用Maven項(xiàng)目。
2.3、MybatisPlusGenerate類
public class MybatisPlusGenerate {
private static Scanner scanner = new Scanner(System.in);
// 獲得當(dāng)前項(xiàng)目的路徑,如上圖就是 F:stady_program/Mybatis_plus逆向工程
private final static String PROJECT_PATH = System.getProperty("user.dir");
}
2.3.1、獲取用戶在控制臺(tái)輸入的表名
public static void scannerTableName(String parentPackageName){
List<String> tableList = new ArrayList<>(); // 使用集合來(lái)存儲(chǔ)用戶輸入的多個(gè)表的名稱
System.out.println("<=================表名列表===============>");
while(!scanner.hasNext("end")){ // 當(dāng)用戶輸入end后結(jié)束輸入
String tableName = scanner.next();
if(tableName.equals("")){
throw new RuntimeException("所輸入的表名不合法");
}
tableList.add(tableName); //將表名添加到集合中。
}
// 通過(guò)表名和當(dāng)前項(xiàng)目的目錄來(lái)生成相應(yīng)的包和類。
for(String name : tableList) generateInformationByTableName(parentPackageName,name);
}
當(dāng)前項(xiàng)目的目錄就是指當(dāng)前Spring Boot項(xiàng)目中啟動(dòng)類所在的包的名稱。也就是上圖所示的com.example.mybatis_plus_reverse包。
2.3.2、數(shù)據(jù)源的配置
private static DataSourceConfig dataSourceConfig(){
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai")
.setUsername("root")
.setPassword("123456")
.setDriverName("com.mysql.cj.jdbc.Driver").setDbType(DbType.MYSQL);
return dataSourceConfig;
}
數(shù)據(jù)源的配置這就不用說(shuō)了吧,這個(gè)配置沒(méi)什么難度。
2.3.3、全局屬性的配置
private static GlobalConfig globalConfig(){
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(PROJECT_PATH + "/src/main/java")// 輸出文件路徑
.setAuthor("Time Travel")// 設(shè)置作者名字
.setOpen(false)// 是否打開(kāi)資源管理器
.setFileOverride(true)// 是否覆蓋原來(lái)生成的
.setIdType(IdType.AUTO)// 主鍵策略
.setBaseResultMap(true)// 生成resultMap
.setDateType(DateType.ONLY_DATE) // 設(shè)置時(shí)間格式,采用Date
.setServiceName("%sService");// 生成的service接口名字首字母是否為I,這樣設(shè)置就沒(méi)有I
//setBaseColumnList(true) XML中生成基礎(chǔ)列
return globalConfig;
}
2.3.4、包屬性的配置
private static PackageConfig packageConfig(String fatherPackageName){
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent(fatherPackageName) // 配置指定項(xiàng)目中各層的名稱
.setController("controller") // Controller層
.setEntity("entity") // 實(shí)體層(pojo層)
.setMapper("dao") // Dao 層
.setService("service") // service層
.setServiceImpl("service.serviceImpl"); // ServiceImp層
return packageConfig;
}
fatherPackageName就是上圖所示的com.example.mybatis_plus_reverse包的名稱。
2.3.5、逆向生成類的名稱配置
private static StrategyConfig strategyConfig (String tableName){
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setCapitalMode(true)// 開(kāi)啟全局大寫命名
.setInclude(tableName)// 設(shè)置要映射的表
.setNaming(NamingStrategy.underline_to_camel)// 下劃線到駝峰的命名方式
.setColumnNaming(NamingStrategy.underline_to_camel)// 下劃線到駝峰的命名方式
.setEntityLombokModel(true)// 是否使用lombok
.setRestControllerStyle(true)// 是否開(kāi)啟rest風(fēng)格
.setTablePrefix("t_") // 去除前綴
.setControllerMappingHyphenStyle(true); // localhost:8080/hello_a_2
return strategyConfig;
}
2.3.6、在resource目錄下生成Mapper文件的配置
private static InjectionConfig injectionConfig(){
InjectionConfig injectionConfig = new InjectionConfig() {
@Override
public void initMap() {
this.setMap(new HashMap<>()); // 實(shí)現(xiàn)InjectionConfig抽象類就需要初始化一個(gè)Map集合
}
};
List<FileOutConfig> fileOutConfigList = new ArrayList<>();
// 根據(jù)/templates/mapper.xml.ftl規(guī)則在指定的位置生成Mapper文件,可以在多個(gè)地方生成。
fileOutConfigList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 返回Mapper文件的絕對(duì)路徑
String path = PROJECT_PATH + "/src/main/resources/mapper/" +
tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
return path;
}
});
// 將對(duì)Mapper文件的配置添加到文件輸出對(duì)象中
injectionConfig.setFileOutConfigList(fileOutConfigList);
return injectionConfig;
}
2.3.7、配置生成器的生成模板
// 最簡(jiǎn)單的配置
private static TemplateConfig templateConfig() {
TemplateConfig templateConfig = new TemplateConfig();
return templateConfig.setXml(null);
}
// 復(fù)雜點(diǎn)的配置
private static TemplateConfig templateConfig() {
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setController("templates/controller.java")
.setEntity("templates/entity.java")
.setService("templates/service.java")
.setServiceImpl("templates/serviceImpl.java")
.setMapper("templates/mapper.java")
.setXml(null);
return templateConfig;
}
使用第二個(gè)配置方式的前提需要在mybatis-plus-generator-3.4.1.jar這個(gè)包的templates目錄中將上述的五個(gè)類的 .ftl 的文件復(fù)制到當(dāng)前項(xiàng)目的resource目錄下的templates包下。
如:controller.java.ftl

2.3.8、判斷用戶輸入的項(xiàng)目包名是否存在
// 判斷輸入的父項(xiàng)目是否存在
private static boolean parentPackageExits(String project, String parentPackageName){
StringBuilder path = new StringBuilder(PROJECT_PATH);
if(!"".equals(project) && project != null){
path.append("/" + project);
}
path.append(("/src/main/java/" + parentPackageName).replace(".","/"));
File file = new File(path.toString());
return file.exists();
}
2.3.9、測(cè)試
// 執(zhí)行、測(cè)試
public static void main(String[] args) {
System.out.print("父包名稱: ");
String input = scanner.next();
if(!parentPackageExits(null,input)){
throw new RuntimeException("輸入的父包名不存在或者輸入錯(cuò)誤,請(qǐng)重新輸入父包名");
}
scannerTableName(input);
}
輸入

輸出上圖內(nèi)容則表示配置成功。
實(shí)現(xiàn)效果

執(zhí)行完畢后就會(huì)在項(xiàng)目中自動(dòng)生成相應(yīng)的包和類,因?yàn)槲覀冊(cè)贕lobleConfig中配置的setFileOverride屬性,所以會(huì)覆蓋掉相同的包。
3、總結(jié)
在日常的開(kāi)發(fā)中,對(duì)于重復(fù)、費(fèi)時(shí)、費(fèi)力的操作,作為程序猿的我們,應(yīng)該都能利用程序來(lái)簡(jiǎn)化這些操作,做到事倍功半的效果。
到此這篇關(guān)于MyBatis-plus實(shí)現(xiàn)逆向生成器的文章就介紹到這了,更多相關(guān)MyBatis-plus實(shí)現(xiàn)逆向生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java結(jié)合Kotlin實(shí)現(xiàn)寶寶年齡計(jì)算
這篇文章主要為大家介紹了Java結(jié)合Kotlin實(shí)現(xiàn)寶寶年齡計(jì)算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Java設(shè)計(jì)模式之Adapter適配器模式
這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之Adapter適配器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Java找不到或無(wú)法加載主類及編碼錯(cuò)誤問(wèn)題的解決方案
今天小編就為大家分享一篇關(guān)于Java找不到或無(wú)法加載主類及編碼錯(cuò)誤問(wèn)題的解決方案,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Awaitility同步異步工具實(shí)戰(zhàn)示例詳解
這篇文章主要為大家介紹了Awaitility同步異步工具實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Spring Boot2.0中SpringWebContext找不到無(wú)法使用的解決方法
這篇文章主要給大家介紹了關(guān)于Spring Boot2.0中SpringWebContext找不到無(wú)法使用的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Java設(shè)計(jì)模式之橋接模式實(shí)例詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之橋接模式,結(jié)合實(shí)例形式詳細(xì)分析了橋接模式的概念、功能、Java實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-09-09
使用IDEA配置Tomcat和連接MySQL數(shù)據(jù)庫(kù)(JDBC)詳細(xì)步驟
這篇文章主要介紹了使用IDEA配置Tomcat和連接MySQL數(shù)據(jù)庫(kù)(JDBC)詳細(xì)步驟,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

