国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

總結(jié)傳統(tǒng)JDBC以及MyBatis和Hibernate的對比

2019-11-08 01:39:50
字體:
供稿:網(wǎng)友

首先,讓我們回顧一下。在上一個博客中寫道“使用傳統(tǒng)的JDBC編程來操作數(shù)據(jù)”,詳見http://blog.csdn.net/zwg_html/article/details/55668894

讓我們來總結(jié)一下使用傳統(tǒng)JDBC操作數(shù)據(jù)需要經(jīng)過哪幾個步驟:

使用JDBC編程需要連接數(shù)據(jù)庫,注冊驅(qū)動和數(shù)據(jù)庫信息操作Connection,打開 Statement 對象 。通過Statement執(zhí)行SQL, 返回結(jié)果到ResultSet對象。使用ResultSet讀取數(shù)據(jù),然后通過代碼轉(zhuǎn)化為具體的POJO對象。關(guān)閉數(shù)據(jù)庫的相關(guān)資源。

那么,如果我們還是繼續(xù)使用傳統(tǒng)的JDBC方式來操作數(shù)據(jù)庫會存在哪些弊端呢?

工作量相對較大。我們需要先連接,然后處理JDBC底層事務(wù),處理數(shù)據(jù)類型。我們還需要操作Connection對象、Statement對象和ResultSet對象去拿到數(shù)據(jù),并準確的關(guān)閉它們我們要對JDBC編程可能產(chǎn)生的異常進行捕捉處理并正確關(guān)閉資源。

對于一個JDBC操作簡單的SQL尚且如止的復(fù)雜,何況是更為復(fù)雜的應(yīng)用呢?所以這種模式很快的就被一些新 的方法所取代了。于是ORM就出現(xiàn)了。不過,我們要知道所有的ORM模型都是基于對JDBC的進行封裝,不同的ORM模型對JDBC封閉的強度是不一樣的。

那么問題來了。什么是ORM模型。ORM模型的作用是什么 。為什么要用ORM模型等一系列疑問。 由于JDBC存在的缺陷,所以我們在實際工作中很少使用JDBC進行操作數(shù)據(jù)庫的編程。于是我們就提出了對象關(guān)系映射(Object Relational Mapping)簡稱 ORM,或者O/RM,或者 O/R mapping。

什么是ORM模型?   ORM模型就是數(shù)據(jù)庫的表和簡單java對象(Plain Ordinary Java Object,簡稱POJO)的映射關(guān)系模型。 ORM模型的作用是什么 ?   它主要解決數(shù)據(jù)庫數(shù)據(jù)和POJO對象的相互映射。我們通過這層映射就可以簡單的把數(shù)據(jù)庫表的數(shù)據(jù)轉(zhuǎn)化為POJO。以便程序員更加容易的理解和應(yīng)用Java程序.而且程序員一般只需要了解Java應(yīng)用而無需對數(shù)據(jù)庫進行深入的了解。此外,ORM模型提供了統(tǒng)一的規(guī)則使得數(shù)據(jù)庫的數(shù)據(jù)通過配置便可輕易的映射到POJO上。。

目前我們接觸到有Hibernate和MyBatis。   Hibernate :本人在大學(xué)的時候?qū)W的就是這個框架。     優(yōu)點:  

消除了代碼的映射規(guī)則,它全部被分離到xml或者注解里面去配置。無需再管理數(shù)據(jù)庫連接,它也配置到XML里面。一個會話中,不要操作多個對象,只要操作Sesison即可。關(guān)閉資源只需要關(guān)閉一個session即可。

缺點:

全表映射帶來的不便,比如更新時需要發(fā)送所有的字段。無法根據(jù)不同的條件組裝不同的SQL。 對多表關(guān)聯(lián)和復(fù)雜的SQL查詢支持較差。需要自己寫SQL,返回后,需要自己將數(shù)據(jù)組裝到POJO中。不能有效支持存儲過程。雖然有HQL,但是性能較差,大型互聯(lián)網(wǎng)往往需要優(yōu)化SQL,而Hibernate做不到。

MyBatis:  是為了解決Hibernate的不足。一個關(guān)自動映射的框架MyBatis應(yīng)運而生。之所以稱之為半自動。是國為它需要手動匹配提供POJO、SQL和映射關(guān)系。而全表的Hibernate只需要提供POJO和映射關(guān)系即可。

優(yōu)點:

易于上手和掌握。sql寫在xml里,便于統(tǒng)一管理和優(yōu)化。解除sql與程序代碼的耦合。提供映射標簽,支持對象與數(shù)據(jù)庫的orm字段關(guān)系映射提供對象關(guān)系映射標簽,支持對象關(guān)系組建維護提供xml標簽,支持編寫動態(tài)sql。

缺點:

sql工作量很大,尤其是字段多、關(guān)聯(lián)表多時,更是如此。sql依賴于數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫移植性差。由于xml里標簽id必須唯一,導(dǎo)致DAO中方法不支持方法重載。字段映射標簽和對象關(guān)系映射標簽僅僅是對映射關(guān)系的描述,具體實現(xiàn)仍然依賴于sql。(比如配置了一對多Collection標簽,如果sql里沒有join子表或查詢子表的話,查詢后返回的對象是不具備對象關(guān)系的,即Collection的對象為null)DAO層過于簡單,對象組裝的工作量較大。不支持級聯(lián)更新、級聯(lián)刪除。編寫動態(tài)sql時,不方便調(diào)試,尤其邏輯復(fù)雜時。提供的寫動態(tài)sql的xml標簽功能簡單(連struts都比不上),編寫動態(tài)sql仍然受限,且可讀性低。若不查詢主鍵字段,容易造成查詢出的對象有“覆蓋”現(xiàn)象。參數(shù)的數(shù)據(jù)類型支持不完善。(如參數(shù)為Date類型時,容易報沒有g(shù)et、set方法,需在參數(shù)上加@param)多參數(shù)時,使用不方便,功能不夠強大。(目前支持的方法有map、對象、注解@param以及默認采用012索引位的方式)緩存使用不當,容易產(chǎn)生臟數(shù)據(jù)。   

來,讓我們了解一下MyBatis的歷史。  歷史上,MyBatis的前身是Apache的一個開源項目iBatis。2010年這個項目 由apache software foundation 遷移到了google code, 并且改名為MyBatis 。 2013年11 月遷移到GitHub,所以目前的MyBatis是GitHub進行維護的。  iBatis 一詞是源于“Internet”和 “abatis” 的組合 ,是一個基于Java的持久層框架。iBatis 提供的持久層框架包括SQL Maps和DAO(Data access Objects)。它能很好的解決Hibernate遇到的問題。與Hibernate不同的是,它不單單要我們提供映射文件,還需要我們提供SQL語句。MyBatis需要提供映射文件包含以下三個部分。

SQL映射規(guī)則 POJO

什么時候用MyBatis(MyBatis 的使用場景)。

 Hibernate作為較為流行的Java ORM框架,它確實編程簡易,需要我們提供映射的規(guī)則,完全可以通過IDE生成。同時無需編寫SQL確實開發(fā)效率優(yōu)于MyBatis。而且,它也提供了緩存、日志、級聯(lián)、等強大的功能,但是Hibernate的缺陷也是十分的明顯的。就是在多表關(guān)聯(lián)復(fù)雜的SQL時,數(shù)據(jù)系統(tǒng)權(quán)限限制時,根據(jù)條件變化的SQL時。存儲過程等使用場景。Hibernate十分不便。而性能又難以通過SQL來優(yōu)化。所以Hibernate一般只適用于場景不太復(fù)雜的、性能要求不太苛刻的時候使用。

 MyBatis 是一個靈活的、可以動態(tài)生成映射關(guān)系的框架,它幾物可以替代JDBC。擁有動態(tài)列、動態(tài)表名,存儲過程都支持。同時提供了簡易的緩存(如(默認)一級緩存,還有二級緩存)、日志、級聯(lián)。但是它的缺陷是需要你提供映射規(guī)則和SQL,所以它的開發(fā)工作量一般要比Hibernate略大一些。

  總結(jié)。你需要根據(jù)你的項目的實際情況去選擇框架。MyBatis具有高度靈活、可優(yōu)化、易維護等特點,所以它目前是大型移動互聯(lián)網(wǎng)的自選框架。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 巴楚县| 定边县| 密山市| 沁阳市| 苍梧县| 丘北县| 虞城县| 井研县| 乌鲁木齐市| 齐齐哈尔市| 正安县| 乌什县| 宁德市| 湖州市| 陕西省| 湖州市| 神木县| 石阡县| 沙河市| 巴南区| 金寨县| 昌吉市| 双峰县| 天津市| 博白县| 安岳县| 阳泉市| 康乐县| 武清区| 新泰市| 乐业县| 望奎县| 绥滨县| 大庆市| 通海县| 嫩江县| 石台县| 池州市| 临安市| 清涧县| 潼关县|