Mybatis-generator/通用Mapper/Mybatis-Plus對比


1. Mybatis-generator

MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代碼生成器。它為所有版本的MyBatis以及版本2.2.0之后的iBATIS版本生成代碼。它將根據數據庫表生成可用於訪問表的文件。

Mybatis-generator主要完成的工作是依據數據庫表創建對應的model、dao、mapping文件,可以通過Maven插件或者mybatis-generator的jar包生成。

這里介紹Maven插件使用方法:

  1. 在pom.xml文件中加入mybatis-generator系列插件;
  2. 創建generatorConfig.xml文件,在配置文件中指定數據庫連接地址、生成類的存放地址、生成對應表的類名等信息;
  3. 執行mybatis-generator插件,即可生成相應文件;
  4. 此外,mybatis-generator自動生成了example類用於構造復雜的篩選條件,詳細用法可以參考 http://www.mybatis.org/generator/generatedobjects/exampleClassUsage.html

Mybatis-generator使用較為簡單,生成的DAO類及映射文件中包含基本的CRUD操作。需要注意的是,在一次項目中避免多次執行mybatis-generator,即應當盡量在數據庫表建立完整並且確定不會修改之后執行mabatis-generator,否則再次執行會覆蓋原本的Model、DAO和映射文件的文件夾(踩過的坑)。

插件使用參考 https://blog.csdn.net/pucao_cug/article/details/64499355

 

2. 通用Mapper

首先我們來看一下通用Mapper官方給出的用途

正如之前提到的,當數據庫字段變化頻繁時,使用MBG(mybatis-generator)會帶來大量的重構工作,對此,通用Mapper給出的解決辦法是:給予開發者一個具備豐富的單表方法並且容易擴展的通用的Mapper。

通用Mapper是對單表的CRUD操作進行了較為詳細的實現,使得開發人員可以隨意的按照自己的需求選擇通用的方法,同時允許開發人員便捷地對通用Mapper進行擴展。

先看一下通用Mapper在Maven項目中的配置:

1. 在pom.xml中添加插件配置

可以看到,通用Mapper的代碼生成實際上是使用了MGB,因此通用Mapper的代碼生成器只是調用了MGB,然后在這個基礎上加入了一些元素來方便開發。

2. 來看一下配置文件generatorConfig.xml

 

與MGB原有的配置文件相比,這里只是多了一個插件的配置,這個插件的作用是:配置生成的Mapper接口都會自動繼承這個接口,也就是說,使用通用Mapper生成的mapper接口即使看上去空空如也,但已經具備了大量的對數據庫的操作方法。此外,通用 Mapper 專用代碼生成器生成的 Model 會在原有基礎上增加 @Table,@Id,@Column 等注解,方便自動與數據庫字段進行映射。

3. 在 pom.xml 這一級目錄的命令行窗口執行 mvn mybatis-generator:generate或者直接在執行mvn插件即可。

4. 通用Mapper同樣有Example的設計,與MGB不同的是,MDB會對每一個表生成對應的Example類,而通用Mapper提供了一個統一的Example類,這個類和 MBG 生成的相比,需要自己設置屬性名,這個類還額外提供了更多的方法。

 

通用Mapper可以看作是MGB的改進和擴展,一定程度上解決了使用MGB重構的問題。

更多詳細的使用可以參考官方文檔:https://github.com/abel533/Mapper/wiki

 

 

3. Mybatis-Plus

Mybatis-Plus(以下簡稱MP)是Mybatis的增強工具(MBG和通用Mapper可看成插件),在Mybatis的基礎上增加了很多功能,簡化開發,提高效率。

先看看MB在Spring Boot中的引入:

1. 在maven中添加MP啟動器

2. 要使用代碼生成器還需要添加模板引擎依賴

 

3. pom.xml到這里已經配置完成了,下面進行代碼的自動生成。AutoGenerator是MP的代碼生成器,通過調用AutoGenerator,進行相應的模板、策略配置可以快速生成Entity、Mapper、Mapper XML、Service、Controller各個模塊的代碼。

AutoGenerator的使用參考 https://mybatis.plus/guide/generator.html

4. MP將通用的CRUD操作封裝進BaseMapper接口,而自動生成的Mapper接口便自動繼承了BaseMapper接口。復雜的Sql操作,則可以使用QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper)進行動態Sql拼接。

5. 此外,MP還支持分頁、邏輯刪除、通用枚舉、Sql注入等功能,在博客

https://blog.csdn.net/qq_32867467/article/details/82944674中說的較為詳細。

6. 值得一提的是,MP提供了性能分析插件,能夠輸出每條SQL語句及其執行時間,使用它需要在xml中添加相應的插件信息

然后在config文件中添加插件

與MBG不同,使用Mybatis-Plus自動生成代碼需要編寫代碼,通過調用AutoAutoGenerator類實現代碼生成,從這方面來說不如使用插件方便。但是它豐富的功能以及只是相對復雜的配置還是使它領先於MBG以及通用Mapper。

 

三款框架的功能對比

 

Mybatis-generator

通用Mapper

Mybatis-Plus

代碼生成器

支持自動生成Model,Mapper,Mapper XML文件

		<p style="margin-left:0cm;">生成方式不夠靈活;</p>

		<p style="margin-left:0cm;">生成代碼功能較為簡單</p>
		</td>
		<td style="vertical-align:top;width:107pt;">
		<p style="margin-left:0cm;">支持自動生成Entity,Mapper,Mapper XML文件;</p>

		<p style="margin-left:0cm;">提供通用的Mapper模板,生成方式較靈活;</p>

		<p style="margin-left:0cm;">生成的Model文件包含注釋能夠很好地與數據庫表完成映射</p>
		</td>
		<td style="vertical-align:top;width:108.4pt;">
		<p style="margin-left:0cm;">支持自動生成Entity,Mapper,Mapper XML,Service,Controller文件;</p>

		<p style="margin-left:0cm;">提供BaseMapper接口</p>
		</td>
	</tr><tr><td style="vertical-align:top;width:88.7pt;">
		<p style="margin-left:0cm;">CRUD操作</p>
		</td>
		<td style="vertical-align:top;width:110.7pt;">
		<p style="margin-left:0cm;">代碼生成后每個Mapper有固定的CRUD方法;</p>

		<p style="margin-left:0cm;">在每個Mapper上分別擴展</p>
		</td>
		<td style="vertical-align:top;width:107pt;">
		<p style="margin-left:0cm;">提供通用Mapper接口;</p>

		<p style="margin-left:0cm;">可以擴展通用接口</p>
		</td>
		<td style="vertical-align:top;width:108.4pt;">
		<p style="margin-left:0cm;">提供BaseMapper接口;</p>

		<p style="margin-left:0cm;">可以擴展通用接口</p>
		</td>
	</tr><tr><td style="vertical-align:top;width:88.7pt;">
		<p style="margin-left:0cm;">條件構造器</p>
		</td>
		<td style="vertical-align:top;width:110.7pt;">
		<p style="margin-left:0cm;">每個實體類自己的Example構造條件</p>
		</td>
		<td style="vertical-align:top;width:107pt;">
		<p style="margin-left:0cm;">提供通用Example</p>
		</td>
		<td style="vertical-align:top;width:108.4pt;">
		<p style="margin-left:0cm;">提供Wrapper進行復雜條件構造</p>
		</td>
	</tr><tr><td style="vertical-align:top;width:88.7pt;">
		<p style="margin-left:0cm;">樂觀鎖</p>
		</td>
		<td style="vertical-align:top;width:110.7pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:107pt;">
		<p style="margin-left:0cm;">支持</p>
		</td>
		<td style="vertical-align:top;width:108.4pt;">
		<p style="margin-left:0cm;">支持</p>
		</td>
	</tr><tr><td style="vertical-align:top;width:88.7pt;">
		<p style="margin-left:0cm;">主鍵策略</p>
		</td>
		<td style="vertical-align:top;width:110.7pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:107pt;">
		<p style="margin-left:0cm;">支持</p>
		</td>
		<td style="vertical-align:top;width:108.4pt;">
		<p style="margin-left:0cm;">支持</p>
		</td>
	</tr><tr><td style="vertical-align:top;width:88.7pt;">
		<p style="margin-left:0cm;">分頁</p>
		</td>
		<td style="vertical-align:top;width:110.7pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:107pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:108.4pt;">
		<p style="margin-left:0cm;">支持</p>
		</td>
	</tr><tr><td style="vertical-align:top;width:88.7pt;">
		<p style="margin-left:0cm;">邏輯刪除</p>
		</td>
		<td style="vertical-align:top;width:110.7pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:107pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:108.4pt;">
		<p style="margin-left:0cm;">支持</p>
		</td>
	</tr><tr><td style="vertical-align:top;width:88.7pt;">
		<p style="margin-left:0cm;">通用枚舉</p>
		</td>
		<td style="vertical-align:top;width:110.7pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:107pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:108.4pt;">
		<p style="margin-left:0cm;">支持</p>
		</td>
	</tr><tr><td style="vertical-align:top;width:88.7pt;">
		<p style="margin-left:0cm;">攻擊Sql阻斷</p>
		</td>
		<td style="vertical-align:top;width:110.7pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:107pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:108.4pt;">
		<p style="margin-left:0cm;">支持</p>
		</td>
	</tr><tr><td style="vertical-align:top;width:88.7pt;">
		<p style="margin-left:0cm;">性能分析</p>
		</td>
		<td style="vertical-align:top;width:110.7pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:107pt;">
		<p style="margin-left:0cm;">&nbsp;</p>
		</td>
		<td style="vertical-align:top;width:108.4pt;">
		<p style="margin-left:0cm;">支持</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;">&nbsp;</p>

總結一下,通用Mapper是對Mybatis-generator的升級改造,解決了使用Mybatis-generator可能需要大量重構的問題,並且在這個基礎上加入了一些新的功能。Mybatis-Plus可以看作是在另一個方向上對Mybatis的升級改造,不僅能夠根據數據庫表快速生成pojo實體類,還封裝了大量CRUD方法,使用Wrapper解決了復雜條件構造等問題,更是根據開發中常見的問題給出了一系列解決方案。

在擁有Maven和Spring boot的開發框架下,MBG、通用Mapper和MP都可以快速地完成安裝,相比於MBG和通用Mapper僅需要執行插件就可以完成基本的開發工作,MP可能需要更多的開發工作量。

原文地址:https://blog.csdn.net/m0_37524586/article/details/88351833
posted @ 2019-07-24 10:07  星朝  閱讀( 909)  評論( 1編輯  收藏


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM