面試之mybatis和hibernate的區別
mybatis是支援普通SQL查詢、儲存過程和高階對映的優秀持久層框架。封裝了 幾乎所有的JDBC程式碼和引數的手工設定 ,以及結果集的檢索:
封裝了:1,獲取連線,執行sql,釋放連線。
2,sql的引數設定,屬性自動傳遞引數(例如emp有name和age屬性,sql語句寫成“insert into emp (name,age) values(#{name},#{age})”就可以了,不用像jdbc 一樣還要用preparedstatement物件設定引數ps.setString(1,“xiaoming”)
3,封裝了記錄對映成實體物件的的過程,(jdbc要自己寫rowmapper)
hibernate也是當前流行的orm工具,訪問資料庫的框架,對資料結構提供了較完整的封裝。
封裝了:1,獲取連線,sql編寫,執行sql,釋放連線。
2,sql引數設定,
3,記錄封裝成實體物件等一系列過程。
對比上面兩個,一目瞭然,hibernate相比mabatis居然連sql編寫也封裝了。這點本質的不同,是mybatis與hibernate的最大區別,很多網上寫的區別,看起來很亂,很頭大其實大多都是從這點引發出來的。
接下來我們一點一點的說。
區別一:擴充套件性方面。使用mybatis要自己根據相應的資料庫寫不同的sql實現,例如用mysql資料庫寫了一個sql的分頁語句,如果換成了oracle資料庫就用不了了。然而如果是hibernate的hql語句則是對實體類(User)和屬性的操作,也拿分頁查詢來說,string hql=“from User”; Query q1=session.creatQuery(hql); q1.setFirstResult(m);q1.setMaxResult(n); List<User> list=q1.list();會根據具體的資料庫生成各自相應不同的查詢的語句,所以移植性很好。
區別二:sql效率,優化方面。Hibernate的查詢,更新都是對所有欄位的操作例如(根據id查詢,sessin.get(User.class,"id"),還有要session.update(物件)時,按照物件的id做條件,更新其他欄位資訊。如果想要更新部分欄位,其他欄位保持不變,則物件的其他欄位對應的屬性也要有原值),這一點會有效能消耗。Hibernate也可以自己寫SQL來指定需要查詢的欄位,但這樣就破壞了Hibernate開發的簡潔性。而Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的欄位。maybatis的優化,就是對sql語句的優化,MyBatis在Session方面和Hibernate的Session生命週期是一致的,同樣需要合理的Session管理機制。hibernate的優化(可以記一下):
- 制定合理的快取策略;
- 儘量使用延遲載入特性;
- 採用合理的Session管理機制;
- 使用批量抓取,設定合理的批處理引數(batch_size);
- 進行合理的O/R對映設計
還有一點被面試問到過,就是sql和hql形式上的區別。個人認為屬於第一點區別:
sql: select 欄位名...from table_name where 欄位名... sql是直接對資料庫表的操作
hql:select 屬性名...from 實體類 where 屬性 條件 ...group by 屬性order by屬性。hql是對與表有對映關係的實體類的操作,底層會再自動生成相應的sql。
以上點就是最大的區別了。當然網上還有說物件管理和抓取策略,快取機制什麼的,太高階了這裡不再討論了。附上連線:
http://blog.csdn.net/firejuly/article/details/819022