JDBC:
我們平時使用jdbc進行編程,大致需要下面幾個步驟:
2,操作Connection,打開Statement對象
3,通過Statement對象執(zhí)行SQL,返回結(jié)果到ResultSet對象
4,使用ResultSet讀取數(shù)據(jù),然后通過代碼轉(zhuǎn)化為具體的POJO對象
5,關(guān)閉數(shù)據(jù)庫相關(guān)的資源
jdbc的缺點:
一:工作量比較大,需要連接,然后處理jdbc底層事務(wù),處理數(shù)據(jù)類型,還需要操作Connection,Statement對象和ResultSet對象去拿數(shù)據(jù)并關(guān)閉他們。
二:我們對jdbc編程可能產(chǎn)生的異常進行捕捉處理并正確關(guān)閉資源
由于JDBC存在的缺陷,在實際工作中我們很少直接使用jdbc進行編程,用的更多的是ORM對象關(guān)系模型來操作數(shù)據(jù)庫,Hibernate就是一個ORM模型
Hibernate:
Hibernate是建立在若干POJO通過xml映射文件(或注解)提供的規(guī)則映射到數(shù)據(jù)庫表上的。我們可以通過POJO直接操作數(shù)據(jù)庫的數(shù)據(jù),他提供的是一種全表映射的模型。相對而言,Hibernate對JDBC的封裝程度還是比較高的,我們已經(jīng)不需要寫SQL,只要使用HQL語言就可以了。
使用Hibernate進行編程有以下好處:
1,消除了代碼的映射規(guī)則,它全部分離到了xml或者注解里面去配置。
2,無需在管理數(shù)據(jù)庫連接,它也配置到xml里面了。
3,一個會話中不需要操作多個對象,只需要操作Session對象。
4,關(guān)閉資源只需要關(guān)閉一個Session便可。
這就是Hibernate的優(yōu)勢,在配置了映射文件和數(shù)據(jù)庫連接文件后,Hibernate就可以通過Session操作,非常容易,消除了jdbc帶來的大量代碼,大大提高了編程的簡易性和可讀性。Hibernate還提供了級聯(lián),緩存,映射,一對多等功能。Hibernate是全表映射,通過HQL去操作pojo進而操作數(shù)據(jù)庫的數(shù)據(jù)。
Hibernate的缺點:
1,全表映射帶來的不便,比如更新時需要發(fā)送所有的字段。
2,無法根據(jù)不同的條件組裝不同的SQL。
3,對多表關(guān)聯(lián)和復(fù)雜的sql查詢支持較差,需要自己寫sql,返回后,需要自己將數(shù)據(jù)封裝為pojo。
4,不能有效的支持存儲過程。
5,雖然有HQL,但是性能較差,大型互聯(lián)網(wǎng)系統(tǒng)往往需要優(yōu)化sql,而hibernate做不到。
Mybatis:
為了解決Hibernate的不足,Mybatis出現(xiàn)了,Mybatis是半自動的框架。之所以稱它為半自動,是因為它需要手工匹配提供POJO,sql和映射關(guān)系,而全表映射的Hibernate只需要提供pojo和映射關(guān)系即可。
Mybatis需要提供的映射文件包含了一下三個部分:sql,映射規(guī)則,pojo。在Mybatis里面你需要自己編寫sql,雖然比Hibernate配置多,但是Mybatis可以配置動態(tài)sql,解決了hibernate表名根據(jù)時間變化,不同條件下列不一樣的問題,同時你也可以對sql進行優(yōu)化,通過配置決定你的sql映射規(guī)則,也能支持存儲過程,所以對于一些復(fù)雜和需要優(yōu)化性能的sql查詢它就更加方便。Mybatis幾乎可以做到j(luò)dbc所有能做到的事情。
什么時候使用Hibernate,Mybatis
Hibernate作為留下的
Java orm框架,它確實編程簡易,需要我們提供映射的規(guī)則,完全可以通過IDE生成,同時無需編寫sql確實開發(fā)效率優(yōu)于Mybatis。此外Hibernate還提供了緩存,日志,級聯(lián)等強大的功能,但是Hibernate的缺陷也是十分明顯,多表關(guān)聯(lián)復(fù)雜sql,數(shù)據(jù)系統(tǒng)權(quán)限限制,根據(jù)條件變化的sql,存儲過程等場景使用Hibernate十分不方便,而性能又難以通過sql優(yōu)化,所以注定了Hibernate只適用于在場景不太復(fù)雜,要求性能不太苛刻的時候使用。
如果你需要一個靈活的,可以動態(tài)生成映射關(guān)系的框架,那么Mybatis確實是一個最好的選擇。它幾乎可以替代jdbc,擁有動態(tài)列,動態(tài)表名,存儲過程支持,同時提供了簡易的緩存,日志,級聯(lián)。但是它的缺陷是需要你提供映射規(guī)則和sql,所以開發(fā)工作量比hibernate要大些。
1)從層次上看,JDBC是較底層的持久層操作方式,而Hibernate和MyBatis都是在JDBC的基礎(chǔ)上進行了封裝使其更加方便程序員對持久層的操作。
2)從功能上看,JDBC就是簡單的建立
數(shù)據(jù)庫連接,然后創(chuàng)建statement,將sql語句傳給statement去執(zhí)行,如果是有返回結(jié)果的查詢語句,會將查詢結(jié)果放到ResultSet對象中,通過對ResultSet對象的遍歷操作來獲取數(shù)據(jù);Hibernate是將數(shù)據(jù)庫中的數(shù)據(jù)表映射為持久層的
Java對象,對sql語句進行修改和優(yōu)化比較困難;MyBatis是將sql語句中的輸入?yún)?shù)和輸出參數(shù)映射為java對象,sql修改和優(yōu)化比較方便.
3)從使用上看,如果進行底層編程,而且對性能要求極高的話,應(yīng)該采用JDBC的方式;如果要對數(shù)據(jù)庫進行完整性控制的話建議使用Hibernate;如果要靈活使用sql語句的話建議采用MyBatis框架。