mybatis與hibernate的區別
1、開發上手難度
hibernate的真正掌握(封裝的功能和特性非常多)要比Mybatis來得難。
在真正產品級應用上要用Hibernate,不僅對開發人員的要求高,hibernate往往還不適合(多表關聯查詢等)。
2、系統調優調優方案對比
Hibernate:
* 制定合理的快取策略;
* 儘量使用延遲載入特性;
* 採用合理的Session管理機制;
* 使用批量抓取,設定合理的批處理引數(batch_size);
* 進行合理的O/R對映設計
Mybatis:
* MyBatis在Session方面和Hibernate的Session生命週期是一致的,同樣需要合理的Session管理機制。MyBatis同樣具有二級快取機制。
* MyBatis可以進行詳細的SQL優化設計。
3、SQL優化方面
Hibernate的查詢會將表中的所有欄位查詢出來,這一點會有效能消耗。
Hibernate也可以自己寫SQL來指定需要查詢的欄位,但這樣就破壞了Hibernate開發的簡潔性。
Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的欄位。
總的來說,Hibernate使用的是封裝好,通用的SQL來應付所有場景,而Mybatis是針對響應的場景設計的SQL。Mybatis的SQL會更靈活、可控性更好、更優化。
PANzexiang...
4、移植性
Hibernate與具體資料庫的關聯只需在XML檔案中配置即可,所有的HQL語句與具體使用的資料庫無關,移植性很好。
MyBatis專案中所有的SQL語句都是依賴所用的資料庫的,所以不同資料庫型別的支援不好。
5、JDBC
Hibernate是在JDBC上進行了一次封裝。
Mybatis是基於原生的JDBC的。Mybatis有執行速度上的優勢。
6、功能、特性豐富程度
Hibernate提供了諸多功能和特性。要全掌握很難。
Mybatis 自身功能很有限,但Mybatis支援plugin,可以使用開源的plugin來擴充套件功能。
7、動態SQL
Mybatis mapper xml 支援動態SQL
Hibernate不支援
實際專案關於Hibernate和Mybatis的選型:
1、資料量:有以下情況最好選用Mybatis
如果有超過千萬級別的表
如果有單次業務大批量資料提交的需求(百萬條及以上的),這個尤其不建議用Hibernate
如果有單次業務大批量讀取需求(百萬條及以上的)(注,hibernate多表查詢比較費勁,用不好很容易造成效能問題)
2、表關聯複雜度
如果主要業務表的關聯表超過20個(大概值),不建議使用hibernate
3、人員
如果開發成員多數不是多年使用hibernate的情況,建議使用mybatis
4、資料庫對於專案的重要程度
如果專案要求對於資料庫可控性好,可深度調優,用mybatis
hibernate的真正掌握(封裝的功能和特性非常多)要比Mybatis來得難。
在真正產品級應用上要用Hibernate,不僅對開發人員的要求高,hibernate往往還不適合(多表關聯查詢等)。
2、系統調優調優方案對比
Hibernate:
* 制定合理的快取策略;
* 儘量使用延遲載入特性;
* 採用合理的Session管理機制;
* 使用批量抓取,設定合理的批處理引數(batch_size);
* 進行合理的O/R對映設計
Mybatis:
* MyBatis在Session方面和Hibernate的Session生命週期是一致的,同樣需要合理的Session管理機制。MyBatis同樣具有二級快取機制。
* MyBatis可以進行詳細的SQL優化設計。
3、SQL優化方面
Hibernate的查詢會將表中的所有欄位查詢出來,這一點會有效能消耗。
Hibernate也可以自己寫SQL來指定需要查詢的欄位,但這樣就破壞了Hibernate開發的簡潔性。
Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的欄位。
總的來說,Hibernate使用的是封裝好,通用的SQL來應付所有場景,而Mybatis是針對響應的場景設計的SQL。Mybatis的SQL會更靈活、可控性更好、更優化。
PANzexiang...
4、移植性
Hibernate與具體資料庫的關聯只需在XML檔案中配置即可,所有的HQL語句與具體使用的資料庫無關,移植性很好。
MyBatis專案中所有的SQL語句都是依賴所用的資料庫的,所以不同資料庫型別的支援不好。
5、JDBC
Hibernate是在JDBC上進行了一次封裝。
Mybatis是基於原生的JDBC的。Mybatis有執行速度上的優勢。
6、功能、特性豐富程度
Hibernate提供了諸多功能和特性。要全掌握很難。
Mybatis 自身功能很有限,但Mybatis支援plugin,可以使用開源的plugin來擴充套件功能。
7、動態SQL
Mybatis mapper xml 支援動態SQL
Hibernate不支援
實際專案關於Hibernate和Mybatis的選型:
1、資料量:有以下情況最好選用Mybatis
如果有超過千萬級別的表
如果有單次業務大批量資料提交的需求(百萬條及以上的),這個尤其不建議用Hibernate
如果有單次業務大批量讀取需求(百萬條及以上的)(注,hibernate多表查詢比較費勁,用不好很容易造成效能問題)
2、表關聯複雜度
如果主要業務表的關聯表超過20個(大概值),不建議使用hibernate
3、人員
如果開發成員多數不是多年使用hibernate的情況,建議使用mybatis
4、資料庫對於專案的重要程度
如果專案要求對於資料庫可控性好,可深度調優,用mybatis
相關文章
- Hibernate之openSession與getCurrentSession的區別Session
- mybatis入門程式:刪除、更新使用者&&hibernate和mybatis的區別MyBatis
- Hibernate與mybatis比較MyBatis
- MyBatis 與 Hibernate 有哪些不同?MyBatis
- MyBatis中#{}和${}的區別詳解MyBatis
- Hibernate基於Maven入門例項,與MyBatis比對MavenMyBatis
- mybatis collection解析以及和association的區別MyBatis
- Mybatis中updateByPrimaryKeySelective和updateByPrimaryKey的用法區別MyBatis
- ??與?:的區別
- MyBatis-06-Spring的SqlSession和原始區別MyBatisSpringSQLSession
- 淺析mybatis中${}和#{}取值區別MyBatis
- mybatis xml裡的 resultMap、resultOrdered、resultSets、resultSetType、resultType 區別MyBatisXML
- MyBatis中的<where>標籤和where子句的區別MyBatis
- Hibernate中的cascade與inverse
- const與static的區別
- HTTP 與 HTTPS 的區別HTTP
- getAttribute() 與 attr() 的區別
- @import與<link> 的區別Import
- Postgresql與MySQL的區別MySql
- HashSet與HashMap的區別HashMap
- HashTable與ConcurrentHashMap的區別HashMap
- maven與ant的區別Maven
- __new()__ 與 __init()__的區別
- @Autowired 與@Resource的區別
- gulp與webpack的區別Web
- free 與 CFRelease 的區別
- post與get的區別
- Git與GitHub的區別Github
- Comparable與Comparator的區別
- volatile與synchronized的區別synchronized
- Javascript中“==”與“===”的區別JavaScript
- ICMP與IGMP的區別
- UDP與TCP的區別UDPTCP
- WebApp與NativeApp的區別WebAPP
- mysql與Oracle的區別MySqlOracle
- Synchronized 與 ReentrantLock 的區別synchronizedReentrantLock
- let與var的區別
- buffer與cache的區別