1. 程式人生 > >MyBatis與Hibernate持久層框架簡單總結

MyBatis與Hibernate持久層框架簡單總結

目錄

資料持久化操作框架及ORM關係

MyBatis框架

        MyBatis主要的類

Hibernate框架

Hibernate實體類中有三種狀態:


資料持久化操作框架及ORM關係

1.)MyBatis與Hibernate框架都是對底層資料庫資料持久化進行操作的(ORM——物件、關係對映實現)框架。
2.)持久化:持久(Persistence),是程式資料在瞬時狀態(如記憶體中的物件)和持久狀態(可永久儲存的儲存裝置中,如磁碟)間轉換的過程。持久化的主要應用是將記憶體中的資料儲存在關係型的資料庫中,也可以儲存在磁碟檔案中、XML資料檔案中等。
3.)持久層(Persistence Layer)

:專注於實現資料持久化應用領域的某個特定系統的一個邏輯層面,將資料使用者和資料實體相關聯。
4.)物件資料對映(ORM):Object/Relational Mapper,即“物件-關係型資料對映元件”。表示必須同時使用面向物件和關係型資料進行開發。
5.)拓展:建模領域中的ORM為Object/Role Modeling(物件角色建模)。另外這裡是“O/R Mapper”而非“O/R Mapping”。相對來講,O/R Mapping 描述的是一種設計思想或者實現機制,而O/R Mapper 指以O/R原理設計的持久化框架(Framework),包括O/R機制還有SQL自生成,事務處理,Cache管理等。
6.)為什麼要做持久化和ORM設計:
在目前的企業應用系統設計中,MVC,即 Model(模型)- View(檢視)- Control(控制)為主要的系統架構模式。MVC 中的 Model 包含了複雜的業務邏輯和資料邏輯,以及資料存取機制(如 JDBC的連線、SQL生成和Statement建立、還有ResultSet結果集的讀取等)等。將這些複雜的業務邏輯和資料邏輯分離,以將系統的緊耦合關係轉化為鬆耦合關係(即解耦合),是降低系統耦合度迫切要做的,也是持久化要做的工作。MVC 模式實現了架構上將表現層(即View)和資料處理層(即Model)分離的解耦合,而持久化的設計則實現了資料處理層內部的業務邏輯和資料邏輯分離的解耦合。而 ORM 作為持久化設計中的最重要也最複雜的技術,也是目前業界熱點技術。
簡單來說,按通常的系統設計,使用 JDBC 操作資料庫,業務處理邏輯和資料存取邏輯是混雜在一起的。

一般基本都是如下幾個步驟:
1、建立資料庫連線,獲得 Connection 物件。
2、根據使用者的輸入組裝查詢 SQL 語句。
3、根據 SQL 語句建立 Statement 物件 或者 PreparedStatement 物件。
4、用 Connection 物件執行 SQL語句,獲得結果集 ResultSet 物件。
5、然後一條一條讀取結果集 ResultSet 物件中的資料。
6、根據讀取到的資料,按特定的業務邏輯進行計算。
7、根據計算得到的結果再組裝更新 SQL 語句。
8、再使用 Connection 物件執行更新 SQL 語句,以更新資料庫中的資料。
7、最後依次關閉各個 Statement 物件和 Connection 物件。

目前有哪些流行的 ORM 產品
目前眾多廠商和開源社群都提供了持久層框架的實現,常見的有

Apache OJB (http://db.apache.org/ojb/
Cayenne (https://cayenne.apache.org/
Jaxor (http://jaxor.sourceforge.net/
Hibernate (http://hibernate.org/
iBatis (http://www.ibatis.com/
jRelationalFramework (https://sourceforge.net/projects/ijf/
mirage (https://seecr.nl/en/oss/mirage/toon
SMYLE (http://www.drjava.de/smyle
TopLink (https://www.oracle.com/technetwork/index.html
其中 TopLink 是 Oracle 的商業產品,其他均為開源專案。

7.)ORM(Object Relational Mapping)

  •      編寫程式的時候,以面向物件的方式處理資料
  •      儲存資料的時候,以關係型資料庫的方式儲存

    ORM解決方案包含下面四個部分:

  •      在持久化物件上執行基本的增、刪、改、查操作。
  •      對持久化物件提供一種查詢語言或者API。
  •      物件關係對映工具。
  •      提供與事務物件互動、執行檢查、延遲載入以及其他優化功能。

MyBatis框架

簡介:半自動化的ORM實現;DAO層;動態SQL;小巧靈活、簡單易學。

MyBatis框架主要完成的是以下2件事情:

  1. 根據JDBC規範建立與資料庫的連線。
  2. 通過反射打通Java物件與資料庫引數互動之間相互轉換的關係。

  MyBatis框架是一種典型的互動式框架,先準備好互動的必要條件,然後構建一個互動的環境,在互動環境中劃分會話,在會話中與資料庫進行互動資料。
原理詳解:

       MyBatis應用程式根據XML配置檔案建立SqlSessionFactory,SqlSessionFactory在根據配置,配置來源於兩個地方,一處是配置檔案,一處是Java程式碼的註解,獲取一個SqlSession。SqlSession包含了執行sql所需要的所有方法,可以通過SqlSession例項直接執行對映的sql語句,完成對資料的增刪改查和事務提交等,用完之後關閉SqlSession。

MyBatis的框架設計


MyBatis執行流程:
1. 載入配置檔案並初始化(SqlSession)
       配置檔案來源於兩個地方,一個是配置檔案(主配置檔案conf.xml,mapper檔案*.xml),一個是java程式碼中的註釋,將sql的配置資訊載入成為一個mappedstatement物件,儲存在記憶體之中(包括傳入引數的對映配置,結果對映配置,執行的sql語句)。
2. 接收呼叫請求
       呼叫mybatis提供的api,傳入的引數為sql的id(有namespase和具體sql的id組成)和sql語句的引數物件,mybatis將呼叫請求交給請求處理層。
3. 處理請求

  • 根據sql的id找到對應的mappedstatament物件。
  • 根據傳入引數解析mappedstatement物件,得到最終要執行的sql。
  • 獲取資料庫連線,執行sql,得到執行結果
  • Mappedstatement物件中的結果對映對執行結果進行轉換處理,並得到最終的處理結果。

4. 釋放連線資源
5. 返回處理結果

MyBatis主要的類

  • Configuration        MyBatis所有的配置資訊都維持在Configuration物件之中。
  • SqlSession            作為MyBatis工作的主要頂層API,表示和資料庫互動的會話,完成必要資料庫增刪改查功能
  • Executor               MyBatis執行器,是MyBatis 排程的核心,負責SQL語句的生成和查詢快取的維護
  • StatementHandler 封裝了JDBC Statement操作,負責對JDBC statement 的操作,如設定引數、將Statement結果集轉換成List集合。
  • ParameterHandler  負責對使用者傳遞的引數轉換成JDBC Statement 所需要的引數,
  • ResultSetHandler   負責將JDBC返回的ResultSet結果集物件轉換成List型別的集合;
  • TypeHandler          負責java資料型別和jdbc資料型別之間的對映和轉換
  • MappedStatement  MappedStatement維護了一條<select|update|delete|insert>節點的封裝,
  • SqlSource              負責根據使用者傳遞的parameterObject,動態地生成SQL語句,將資訊封裝到BoundSql物件中,並返回
  • BoundSql              表示動態生成的SQL語句以及相應的引數資訊

  以上幾個類在SQL操作中都會涉及,在SQL操作中重點關注下SQL引數什麼時候寫入和結果集怎麼轉換為Java物件,這兩個過程正好對應的類是PreparedStatementHandler和ResultSetHandler類。

                                               (圖片來自《深入理解mybatis原理》 MyBatis的架構設計以及例項分析)

MyBatis的優點:

1、簡單易學( mybatis本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar檔案+配置幾個sql對映檔案易於學習,易於使用,通過文件和原始碼,可以比較完全的掌握它的設計思路和實現。)

2、靈活(mybatis不會對應用程式或者資料庫的現有設計強加任何影響。 sql寫在xml裡,便於統一管理和優化。通過sql基本上可以實現我們不使用資料訪問框架可以實現的所有功能,或許更多。)

3、解除sql與程式程式碼的耦合(通過提供DAL層,將業務邏輯和資料訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和程式碼的分離,提高了可維護性。)

4、提供對映標籤,支援物件與資料庫的orm欄位關係對映。

5、提供物件關係對映標籤,支援物件關係組建維護。

6、提供xml標籤,支援編寫動態sql。

MyBatis的缺點:

1、編寫SQL語句時工作量很大,尤其是欄位多、關聯表多時,更是如此。

2、SQL語句依賴於資料庫,導致資料庫移植性差,不能更換資料庫。

3、框架還是比較簡陋,功能尚有缺失,雖然簡化了資料繫結程式碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。

4、二級快取機制不佳


Hibernate框架

簡介:ORM ,簡化資料庫操作;dao層。

Hibernate 主要特點:

1、 開源和免費的License,方便需要時研究原始碼,改寫原始碼,進行功能定製。

2、 輕量級封裝,避免引入過多複雜的問題,除錯容易,減輕程式設計師負擔。

3、 有可擴充套件性,API開放,功能不夠用時,自己可以編碼擴充套件。

       Hibernate的持久化解決方案將使用者從原始的JDBC訪問中釋放出來,使用者無須再關注底層的JDBC的操作。而是以面向物件的方式進行持久層操作。底層資料連線的獲得,資料訪問的實現,事務控制都無須使用者關心。將應用從底層的JDBC中抽象出來,通過配置檔案管理底層的JDBC連線,讓Hibernate解決持久化訪問的實現。

簡單工作原理:

分析:

1、Hibernate框架需要2種配置檔案,分別是:hibernate.cfg.xml(存放資料庫連線資訊)與xxx.hbm.xml

2、xxx.hbm.xml是配置在hibernate.cfg.xml中,該檔案確定了持久類與資料表,資料列之間的對應關係。

3、hibernate不再是直接呼叫JDBC訪問,而是Session會話訪問。在hibernate框架中,只有處於Seesion管理下的POJO物件才有持久化操作的能力。

體系架構:

幾個關鍵物件:

SessionFatory:hibernate關鍵物件,它是單個數據庫對映關係經過編譯後的記憶體映象,執行緒安全。主要作用是生成Session的工廠,該物件可以為事務之間可重用的資料提供可選的二級快取。

Session:它是應用程式與持久儲存層之間互動操作的一個單執行緒物件,是hibernate持久化操作的關鍵物件,所有的持久化物件必須在Session管理下才可以進行持久化操作。此物件的生命週期極短,底層封裝了JDBC連線。Session物件持有一個必選的一級快取,顯式執行flush()之前,所有持久化操作的資料都快取在Session物件處。

持久化物件:系統建立的POJO例項,一旦與特定的Session關聯,並對應資料表的指定記錄,該物件就處於持久化狀態,這一系列物件都被稱為持久化物件。在程式中對持久化物件執行的修改,都將自動被轉換為持久層的修改。持久化物件完全可以是普通的JavaBean,唯一特殊的是他們正與一個Session關聯。

事務(transaction):具有資料庫事務的概念,Hibernate事務是對底層具體的JDBC、JTA、以及CORBA事務的抽象,在某些情況下,一個Transaction之內可能包含多個Session物件。雖然事務操作是可選的,但所有持久化操作都應該在事務管理下進行,即便是隻讀操作。

連線提供者(ConnctionProvider):生成JDBC連線的工廠,通過抽象將應用程式與底層的DataSource或DriverManager隔離開,該物件無須應用程式直接訪問,僅在應用程式需要擴充套件時使用。注:實際開發中,很少有采用DriverManager來獲取資料庫連線, 通常都會使用DataSource來獲取資料庫連線。

事務工廠(TransactionFactory):是生成Transaction物件例項的工廠,該物件無須應用程式直接訪問,它負責對底層具體的事務實現進行封裝、將底層具體的事務抽象成Hibernate事務。

Hibernate實體類中有三種狀態:

瞬時狀態,持久化狀態與遊離狀態。

瞬時狀態:物件由new操作符建立,且尚未與Hibernate Session關聯的物件,被認為處於瞬態。瞬態物件不會被持久化到資料庫中,也不會被賦予持久化標示,如果程式中失去了瞬態物件的引用,瞬態物件將被垃圾回收機制銷燬。使用Hibernate session可以讓其變為持久化狀態。

持久化:持久化例項在資料庫中有對應的記錄,並擁有一個持久化標識(identifier),持久化的例項可以是剛儲存的。也可以是剛被載入的。無論那種,持久化物件都必須與指定的Hibernate Session關聯。Hibernate會檢測到處於持久化狀態物件的改動,在當前操作執行完成時將物件資料寫回資料庫。開發者不需要手動執行UPDATE。

遊離:某個例項曾經處於持久化狀態,但隨著與之關聯的session被關閉,該物件就變成遊離狀態了。遊離物件的引用依舊有效,物件可以繼續被修改,只是不會同步到資料庫中。如果重新讓遊離物件與某個session關聯,該物件會重新轉換為持久化狀態。

引用原文:http://www.cnblogs.com/Spirit612/p/5053707.html

Hibernate的優點:

1、物件化。hibernate可以讓開發人員以面相物件的思想來操作資料庫。jdbc只能通過SQL語句將元資料傳送給資料庫,進行資料操作。而hibernate可以在底層對元資料和物件進行轉化,使得開發者只用面向物件的方式來存取資料即可。

2、更好的移植性。hibernate使用xml或JPA的配置以及資料庫方言等等的機制,使得hibernate具有更好的移植性,對於不同的資料庫,開發者只需要使用相同的資料操作即可,無需關心資料庫之間的差異。而直接使用JDBC就不得不考慮資料庫差異的問題。

3、開發效率高。hibernate提供了大量的封裝(這也是它最大的缺點),很多資料操作以及關聯關係等都被封裝的很好,開發者不需寫大量的sql語句,這就極大的提高了開發者的開發效率。

4、快取機制的使用。hibernate提供了快取機制(session快取,二級快取,查詢快取),對於那些改動不大且經常使用的資料,可以將它們放到快取中,不必在每次使用時都去查詢資料庫,快取機制對提升效能大有裨益。

Hibernate的缺點:

一、由於對持久層封裝過於完整,導致開發人員無法對SQL進行優化,無法靈活使用JDBC的原生SQL,Hibernate封裝了JDBC,所以沒有JDBC直接訪問資料庫效率高。要使用資料庫的特定優化機制的時候,不適合用Hibernate 
二、框架中使用ORM原則,導致配置過於複雜,一旦遇到大型專案,比如300張表以上,配置檔案和內容是非常龐大的,另外,DTO滿天飛,效能和維護問題隨之而來 
三、如果專案中各個表中關係複雜,表之間的關係很多,在很多地方把lazy都設定false,會導致資料查詢和載入很慢,尤其是級聯查詢的時候。 
四、Hibernate在批量資料處理時有弱勢,對於批量的修改,刪除,不適合用Hibernate,這也是ORM框架的弱點。
引用原文:https://blog.csdn.net/nwpu_geeker/article/details/79029529 

hibernate框架學習案例:

https://blog.csdn.net/ip_JL/article/details/81529658

https://blog.csdn.net/ip_JL/article/details/81546057

https://blog.csdn.net/ip_JL/article/details/81563285

https://blog.csdn.net/ip_JL/article/details/81583538

https://blog.csdn.net/ip_JL/article/details/81591969