一、開發上手難度java
hibernate的真正掌握(封裝的功能和特性很是多)要比Mybatis來得難。mysql
在真正產品級應用上要用Hibernate,不只對開發人員的要求高,hibernate每每還不適合(多表關聯查詢等)。sql
二、系統調優調優方案對比數據庫
Hibernate:緩存
* 制定合理的緩存策略;mybatis
* 儘可能使用延遲加載特性;
* 採用合理的Session管理機制;
* 使用批量抓取,設定合理的批處理參數(batch_size);app
* 進行合理的O/R映射設計性能
Mybatis:優化
* MyBatis在Session方面和Hibernate的Session生命週期是一致的,一樣須要合理的Session管理機制。MyBatis一樣具備二級緩存機制。 .net
* MyBatis能夠進行詳細的SQL優化設計。
三、SQL優化方面
Hibernate的查詢會將表中的全部字段查詢出來,這一點會有性能消耗。
Hibernate也能夠本身寫SQL來指定須要查詢的字段,但這樣就破壞了Hibernate開發的簡潔性。
Mybatis的SQL是手動編寫的,因此能夠按需求指定查詢的字段。
總的來講,Hibernate使用的是封裝好,通用的SQL來應付全部場景,而Mybatis是針對響應的場景設計的SQL。Mybatis的SQL會更靈活、可控性更好、更優化。
四、移植性
Hibernate與具體數據庫的關聯只需在XML文件中配置便可,全部的HQL語句與具體使用的數據庫無關,移植性很好。
MyBatis項目中全部的SQL語句都是依賴所用的數據庫的,因此不一樣數據庫類型的支持很差。
五、JDBC
Hibernate是在JDBC上進行了一次封裝。
Mybatis是基於原生的JDBC的。Mybatis有運行速度上的優點。
六、功能、特性豐富程度
Hibernate提供了諸多功能和特性。要全掌握很難。
Mybatis 自身功能頗有限,但Mybatis支持plugin,可使用開源的plugin來擴展功能。
七、動態SQL
Mybatis mapper xml 支持動態SQL
Hibernate不支持
實際項目關於Hibernate和Mybatis的選型:
一、數據量:有如下狀況最好選用Mybatis
若是有超過千萬級別的表
若是有單次業務大批量數據提交的需求(百萬條及以上的),這個尤爲不建議用Hibernate
若是有單次業務大批量讀取需求(百萬條及以上的)(注,hibernate多表查詢比較費勁,用很差很容易形成性能問題)
二、表關聯複雜度
若是主要業務表的關聯表超過20個(大概值),不建議使用hibernate
三、人員
若是開發成員多數不是多年使用hibernate的狀況,建議使用mybatis
四、數據庫對於項目的重要程度
若是項目要求對於數據庫可控性好,可深度調優,用mybatis