Hibernate 和 MyBatis 都是目前業(yè)界中主流的對(duì)象關(guān)系映射(ORM)框架,它們的主要區(qū)別如下。
Hibernate 使用 HQL(Hibernate Query Language)語句,獨(dú)立于數(shù)據(jù)庫(kù)。不需要編寫大量的 SQL,就可以完全映射,但會(huì)多消耗性能,且開發(fā)人員不能自主的進(jìn)行 SQL 性能優(yōu)化。提供了日志、緩存、級(jí)聯(lián)(級(jí)聯(lián)比 MyBatis 強(qiáng)大)等特性。
MyBatis 需要手動(dòng)編寫 SQL,所以靈活多變。支持動(dòng)態(tài) SQL、處理列表、動(dòng)態(tài)生成表名、支持存儲(chǔ)過程。工作量相對(duì)較大。
MyBatis 是一個(gè)半自動(dòng)映射的框架,因?yàn)?MyBatis 需要手動(dòng)匹配 POJO 和 SQL 的映射關(guān)系。
Hibernate 是一個(gè)全表映射的框架,只需提供 POJO 和映射關(guān)系即可。
Hibernate 的二級(jí)緩存配置在 SessionFactory 生成的配置文件中進(jìn)行詳細(xì)配置,然后再在具體的表-對(duì)象映射中配置緩存。
MyBatis 的二級(jí)緩存配置在每個(gè)具體的表-對(duì)象映射中進(jìn)行詳細(xì)配置,這樣針對(duì)不同的表可以自定義不同的緩存機(jī)制。并且 Mybatis 可以在命名空間中共享相同的緩存配置和實(shí)例,通過 Cache-ref 來實(shí)現(xiàn)。
Hibernate 對(duì)查詢對(duì)象有著良好的管理機(jī)制,用戶無需關(guān)心 SQL。所以在使用二級(jí)緩存時(shí)如果出現(xiàn)臟數(shù)據(jù),系統(tǒng)會(huì)報(bào)出錯(cuò)誤并提示。而 MyBatis 在這一方面,使用二級(jí)緩存時(shí)需要特別小心。如果不能完全確定數(shù)據(jù)更新操作的波及范圍,避免 Cache 的盲目使用。否則臟數(shù)據(jù)的出現(xiàn)會(huì)給系統(tǒng)的正常運(yùn)行帶來很大的隱患。
Hibernate 的 DAO 層開發(fā)比 MyBatis 簡(jiǎn)單,Mybatis 需要維護(hù) SQL 和結(jié)果映射。
Hibernate 對(duì)對(duì)象的維護(hù)和緩存要比 MyBatis 好,對(duì)增刪改查的對(duì)象的維護(hù)要方便。
Hibernate 數(shù)據(jù)庫(kù)移植性很好,MyBatis 的數(shù)據(jù)庫(kù)移植性不好,不同的數(shù)據(jù)庫(kù)需要寫不同 SQL。
Hibernate 有更好的二級(jí)緩存機(jī)制,可以使用第三方緩存。MyBatis 本身提供的緩存機(jī)制不佳。
MyBatis 可以進(jìn)行更為細(xì)致的 SQL 優(yōu)化,可以減少查詢字段。
MyBatis 容易掌握,而 Hibernate 門檻較高。
MyBatis 適合需求多變的互聯(lián)網(wǎng)項(xiàng)目,例如電商項(xiàng)目、金融類型、旅游類、售票類項(xiàng)目等。
Hibernate 適合需求明確、業(yè)務(wù)固定的項(xiàng)目,例如 OA 項(xiàng)目、ERP 項(xiàng)目和 CRM 項(xiàng)目等。
總的來說,MyBatis 是一個(gè)小巧、方便、高效、簡(jiǎn)單、直接、半自動(dòng)化的持久層框架,Hibernate 是一個(gè)強(qiáng)大、方便、高效、復(fù)雜、間接、全自動(dòng)化的持久層框架。
對(duì)于性能要求不太苛刻的系統(tǒng),比如管理系統(tǒng)、ERP 等推薦使用 Hibernate,而對(duì)于性能要求高、響應(yīng)快、靈活的系統(tǒng)則推薦使用 MyBatis。