先比較下jdbc編程和hibernate編程各自的優缺點。java
JDBC:程序員
咱們平時使用jdbc進行編程,大體須要下面幾個步驟: 1,使用jdbc編程須要鏈接數據庫,註冊驅動和數據庫信息 2,操做Connection,打開Statement對象 3,經過Statement對象執行SQL,返回結果到ResultSet對象 4,使用ResultSet讀取數據,而後經過代碼轉化爲具體的POJO對象 5,關閉數據庫相關的資源
jdbc的缺點:sql
一:工做量比較大,須要鏈接,而後處理jdbc底層事務,處理數據類型,還須要操做Connection,Statement對象和ResultSet對象去拿數據並關閉他們。 二:咱們對jdbc編程可能產生的異常進行捕捉處理並正確關閉資源
因爲JDBC存在的缺陷,在實際工做中咱們不多直接使用jdbc進行編程,用的更多的是ORM對象關係模型來操做數據庫,Hibernate就是一個ORM模型數據庫
Hibernate:編程
Hibernate是創建在若干POJO經過xml映射文件(或註解)提供的規則映射到數據庫表上的。咱們能夠經過POJO直接操做數據庫的數據,他提供的是一種全表映射的模型。相對而言,Hibernate對JDBC的封裝程度仍是比較高的,咱們已經不須要寫SQL,只要使用HQL語言就能夠了。緩存
使用Hibernate進行編程有如下好處:markdown
1,消除了代碼的映射規則,它所有分離到了xml或者註解裏面去配置。 2,無需在管理數據庫鏈接,它也配置到xml裏面了。 3,一個會話中不須要操做多個對象,只須要操做Session對象。 4,關閉資源只須要關閉一個Session即可。 這就是Hibernate的優點,在配置了映射文件和數據庫鏈接文件後,Hibernate就能夠經過Session操做,很是容易,消除了jdbc帶來的大量代碼,大大提升了編程的簡易性和可讀性。Hibernate還提供了級聯,緩存,映射,一對多等功能。Hibernate是全表映射,經過HQL去操做pojo進而操做數據庫的數據。
Hibernate的缺點:mybatis
1,全表映射帶來的不便,好比更新時須要發送全部的字段。 2,沒法根據不一樣的條件組裝不一樣的SQL。 3,對多表關聯和複雜的sql查詢支持較差,須要本身寫sql,返回後,須要本身將數據封裝爲pojo。 4,不能有效的支持存儲過程。 5,雖然有HQL,可是性能較差,大型互聯網系統每每須要優化sql,而hibernate作不到。
Mybatis:框架
爲了解決Hibernate的不足,Mybatis出現了,Mybatis是半自動的框架。之因此稱它爲半自動,是由於它須要手工匹配提供POJO,sql和映射關係,而全表映射的Hibernate只須要提供pojo和映射關係便可。
Mybatis須要提供的映射文件包含了一下三個部分:sql,映射規則,pojo。在Mybatis裏面你須要本身編寫sql,雖然比Hibernate配置多,可是Mybatis能夠配置動態sql,解決了hibernate表名根據時間變化,不一樣條件下列不同的問題,同時你也能夠對sql進行優化,經過配置決定你的sql映射規則,也能支持存儲過程,因此對於一些複雜和須要優化性能的sql查詢它就更加方便。Mybatis幾乎能夠作到jdbc全部能作到的事情。ide
何時使用Hibernate,Mybatis
Hibernate做爲留下的Java orm框架,它確實編程簡易,須要咱們提供映射的規則,徹底能夠經過IDE生成,同時無需編寫sql確實開發效率優於Mybatis。此外Hibernate還提供了緩存,日誌,級聯等強大的功能,可是Hibernate的缺陷也是十分明顯,多表關聯複雜sql,數據系統權限限制,根據條件變化的sql,存儲過程等場景使用Hibernate十分不方便,而性能又難以經過sql優化,因此註定了Hibernate只適用於在場景不太複雜,要求性能不太苛刻的時候使用。
若是你須要一個靈活的,能夠動態生成映射關係的框架,那麼Mybatis確實是一個最好的選擇。它幾乎能夠替代jdbc,擁有動態列,動態表名,存儲過程支持,同時提供了簡易的緩存,日誌,級聯。可是它的缺陷是須要你提供映射規則和sql,因此開發工做量比hibernate要大些。
jdbc,mybatis,hibernate的區別
1)從層次上看,JDBC是較底層的持久層操做方式,而Hibernate和MyBatis都是在JDBC的基礎上進行了封裝使其更加方便程序員對持久層的操做。 2)從功能上看,JDBC就是簡單的創建數據庫鏈接,而後建立statement,將sql語句傳給statement去執行,若是是有返回結果的查詢語句,會將查詢結果放到ResultSet對象中,經過對ResultSet對象的遍歷操做來獲取數據;Hibernate是將數據庫中的數據表映射爲持久層的Java對象,對sql語句進行修改和優化比較困難;MyBatis是將sql語句中的輸入參數和輸出參數映射爲java對象,sql修改和優化比較方便. 3)從使用上看,若是進行底層編程,並且對性能要求極高的話,應該採用JDBC的方式;若是要對數據庫進行完整性控制的話建議使用Hibernate;若是要靈活使用sql語句的話建議採用MyBatis框架。