《深入淺出MyBatis--技術原理與實戰》讀書筆記

hipilee發表於2017-11-02

2017年11月30日

       這本書目前為止我仔細看到了第6章,還有3章沒有仔細看,這本書的確如作者所說,基於官方文件,因為我仔細讀過mybatis的官方文件,基本和官方文件一致,不過官方文件有些不太重要的部分,該書沒有討論。同時還有一些作者對於mybatis執行機制的簡單講解,還有一些實戰經驗,總的的來說此書還是值得一讀。這裡有個問題就是原始碼的問題,該書是博文出的,在博文該書的主頁上沒有原始碼下載,其實這本書的大部分章節原封不動的移到了《Java EE網際網路輕量級框架整合開發》,這本書在博文的主頁上是有原始碼連結下載的。


2017年11月2日

前言

       移動網際網路的特點是大資料高併發、對伺服器往往要求分散式、高效能、高靈活等,而傳統模式的Java資料庫程式設計框架已經不再適用了。在這樣的背景下,一個Java持久層框架MyBatis走入了我們的世界,它以封裝少、高效能、可優化、維護簡單。它特別適合分散式和大資料網路資料庫的程式設計。

      其實我一直對分散式資料庫和大資料網路資料庫不太理解。

      MyBatis (獨立使用)有兩個子專案,一個是MyBatis-Spring(和Spring一起結合使用),還有一個是MyBatis-Guice(MyBatis-Guice子專案是幹什麼的?)

      MyBatis-Spring:正如第二版那樣,Spring 3.0 也僅支援 iBatis2。那麼,我們就想將 MyBatis3 的支援新增 到 Spring3.0(參考 Spring Jira 中的問題)中。而不幸的是,Spring 3.0 的開發在 MyBatis 3.0 官方釋出前就結束了。 因為 Spring 開發團隊不想釋出一個基於非釋出版的 MyBatis 的整合支 持,那麼 Spring 官方的支援就不得不繼續等待了。要在 Spring 中支援 MyBatis,MyBatis 社 區認為現在應該是自己團結貢獻者和有興趣的人一起來開始將 Spring 的整合作為 MyBatis 社 區的子專案的時候了。

      MyBatis-Guice:好像是通過官方的方式實現IOC。

作者郵箱:ykzhen2013@163.com

作者部落格:http://blog.csdn.net/ykzhen2015


第1章

  • JDBC大概的工作步驟:
  • 使用jdbc程式設計需要連線資料庫,註冊驅動和資料庫資訊。
  • 操作Connection,開啟Statement物件。
  • 通過Statement執行SQL,返回結果到ResultSet物件。
  • 使用ResultSet讀取資料,然後通過程式碼轉化為具體的POJO物件。
  • 關閉資料庫相關資源。針對於資源型物件,一定要記得主動關閉。
    JDBC是由SUN公司提出的一系列規範,但是它只定義了介面規範,而具體的實現是交由各個資料庫廠商去實現的,因為每個資料庫都有其特殊性,這些是Java規範沒有辦法確定的,所以JDBC就是一種典型的橋接模式

   JDBC的弊端:其一,工作量相對較大。我們需要先連線,然後處理JDBC底層事務,處理資料型別。我們還需要操作Connection物件、Statement物件和ResultSet物件去拿到資料,並準確關閉它們。其二,我們要對JDBC的程式設計可能產生的異常進行捕捉處理並正確關閉資源。

       Hibernate遮蔽了SQL,那就意味著只能全表對映,但是一張表可能有幾十到上百欄位,而你感興趣的只有2個,這是Hibernate無法適應的。尤其是大型網站系統,對傳輸資料有嚴格的規定,不能浪費寬頻的場景下就更為明顯了。有很複雜的場景需要關聯多張表,Hibernate全表逐級取物件的方法也只能做罷,寫SQL還需要手工的對映取資料,這帶來了很大的麻煩。此外,如果我們需要優化SQL,Hibernate也是無法做到的。

Hibernate的缺點:

----全表對映帶來的不便,比如更新時需要傳送所有的欄位。

----無法根據不同的條件組裝不同的SQL。

----對多表關聯和複雜SQL查詢支援較差,需要自己寫SQL,返回後,需要自己將資料組裝為POJO。

----不能有效支援儲存過程。

----雖然有HQL,但是效能較差。大型網站往往需要優化SQL,而Hibernate做不到。


這裡講解的通過對映類來講解例子的時候,我都沒發現可以在對映類裡面可以不用寫sql程式碼,而是通過名稱空間的對應,使用xml中的程式碼。

歷史上,MyBatis的前身是Apache的一個開源專案iBatis,2010年這個專案由apache software foundation遷移到了google code,並且改名為MyBatis。2013年11月遷移到GitHub,所以目前MyBatis是由GitHub維護的。


2017年11月3日

第二章 MyBatis入門

學習程式設計是一門實踐科學,只有一邊編寫程式碼一邊學習才會有好的效果。

MyBatis提供兩種方式建立SqlSessionFactory:

  • 一種是XML配置的方式(推薦),這樣一方面可以避免硬編碼,一方面方便日後配置人員的修改,避免重複編碼;
  • 另外一種是程式碼的方式。

2017年11月15日

上述說到的兩種方式,通過程式碼的方式的好處是,可以讓關鍵資訊在XML檔案中不可見。達到加密的目的。

紅框處檢查文件正確性的配置檔案。其實這個地方的深入理解應該好好看看《Java核心卷 2》裡面關於XML的討論章節。


2017年11月4日

SqlSession使用完畢後一定要關閉,如果不及時關閉資源,資料庫的連線資源將很快被耗盡,系統很快因為資料庫資源的匱乏而癱瘓。

生命週期

SqlSessionFactoryBuilder  存在於方法的區域性

SqlSessionFactory  單例模式,MyBatis生命週期

SqlSession  一個請求資料庫事務處理的過程

Mapper  它最大的範圍和SqlSession是相同的



log4j是個什麼鬼東西?並且第二章最後,我實現了書中的demo,但是最後log4j沒有工作,彈出的警告。為什麼要使用log4j?要讀入預設配置後就可以執行起來了。主要是喲梊一句BasicConfigurator.configure();可以通過屬性檔案來配置日誌輸出格式相關規則。

session開啟後一定要記著關閉,出現錯誤後一定要記得回滾。

SqlSession的用途主要有兩種:

  • 獲取對映器,讓對映器通過名稱空間和方法名稱找到對應的SQL,傳送給資料庫執行後返回結果。
  • 直接通過命名資訊去執行SQL返回結果,這是iBatis版本留下的方式。

2017年11月27日

第三章 配置

如下的MyBatis配置XML檔案的層次結構是不能夠顛倒順序的,如果顛倒順序,MyBatis在解析XML檔案的時候就會出現異常。



MyBatis配置XML檔案的層次結構。注意,這些層次是不可以顛倒順序的,如果顛倒順序,MyBatis在解析的時候就會出現異常。

更多的時候,我們希望使用properties配置檔案來配置屬性值,以方便我們在多個配置檔案中重複使用它們,也方便日後維護和隨時修改。在MBatis中的配置方法是引入屬性檔案

<properties resources="屬性檔名">


通過方法引數傳遞的屬性具有最高優先順序,resource/url屬性中指定的配置檔案次之,最低優先順序的是properties屬性中指定的屬性。


系統定義的別名中,有些是支援陣列的。意思就是可以有這樣的型別int,map就不支援陣列,所以其不能有這樣的形式map[]。

MyBatis系統處理列舉型別有兩個預設的方式,一個是EnumOrdinalTypeHandler,處理列舉時會將列舉物件轉換為整形,即其下下標,第一個列舉物件對應的下標為0;另外一個是EnumTypeHandler,其處理方式是名稱直接將列舉物件的名字轉換為字串。


如何配置JNDI資料來源?


databaseIdProvider資料庫廠商標識


2017年11月6日

JDBC的使用大概可以分為下面幾步

--使用JDBC程式設計需要連線資料庫,註冊驅動和資料庫資訊。

--操作Connection,開啟Statement。

--通過Statement執行SQL,返回結果到ResultSet物件。

--使用ResultSet讀取資料,然後通過程式碼轉化為具體的POJO物件。

--關閉資料庫相關資源。


對映器由兩部分組成:1-java檔案;2-XML檔案\註解

對映器是MyBatis最複雜、最核心的元件。

引入對映器的方法一般分為4中:1234

外掛(plugins)是比較複雜的,使用時要特別小心。

當MyBatis在構建一個結果返回的時候,都會使用ObjectFactory(物件工廠)去構建pojo,在MyBatis中可以定製自己的物件工廠。org.apache.ibatis.refelection.factory.DefaultObject


2017年11月9日

目前流行的快取服務有MongoDB、Redis、Ehcache。如果快取命中率很低,那麼快取就不存在使用的意義了,所以使用快取的關鍵在於儲存內容訪問的命中率。


select元素的配置對於statementType resultType  resultOrdered  resultSets都不太明白。

在實際的情況中,大部分的資料庫規範都是要求每個單詞用下劃線分隔,而Java則是用駝峰命名法來命名,於是使用列的別名就可以使得MyBatis自動對映,或者直接在配置檔案中開啟駝峰命名方式。


傳遞多個引數:

----使用Map傳遞引數。因為Map導致業務可讀性的喪失,從而導致後續擴充套件和維護的困難,我們應該在實際的應用中果斷廢棄這樣的傳遞引數的方式。

----使用@Param註解傳遞多個引數,這種方式的使用受到引數個數的影響。當n小於等於5時,它是最佳的傳參方式,它比用JavaBean更好,因為它更加直觀;當n>5時,多個引數將給呼叫帶來困難。

----當引數個數多於5個時,建議使用JavaBean方式。


resultMap通過id元素定義屬性,這個物件代表著使用哪個屬性作為其主鍵。result元素定義普通列的對映關係。

resultMap可沒有你所看見的那麼簡單,它是對映器最為複雜的元素,它一般用於複雜,級聯這些關聯的配置。在簡單的情況下,我們可以使用resultType通過自動對映來完成,這樣配置的工作量就會大大減少,未來隨著進一步的學習深入,我們還會討論resultMap的高階應用。

自定義主鍵生成規則,完全沒明白

插入和刪除執行完成MyBatis會返回一個整數顯示更新或刪除了幾條記錄。

MyBatis現有的版本只支援resultMap查詢,不支援更新或者儲存,更不必說級聯的更新、刪除和修改了。

第七章 外掛

2018年1月14日

      SqlSession下的四大物件:Executor、StatementHandler、ParameterHandler、ResultHandler,在Configuration物件的建立方法裡我們看到了MyBatis用責任鏈去封裝他們。換句話說我們有機會在四大物件的排程的時候插入我們的程式碼去執行一些特殊的要求以滿足特殊的場景需求,這便是MyBatis的外掛技術。


第九章 實用場景

這些場景包括資料庫的BLOB欄位的讀寫,批量操作,排程儲存過程,分頁,使用引數作為列名,分表等內容。

資料庫BLOB欄位讀寫

對於檔案的操作,在資料庫中往往是通過BLOB欄位進行支援的,所以我們先看看MyBatis對BLOB欄位的支援。

更多的時候我們都應該有一個檔案伺服器,資料庫讀取檔案路徑即可,而不把檔案寫入資料庫。因為一旦檔案很大,那麼這個方法就很容易引起記憶體溢位。所以這樣讀寫BLOB欄位時要十分小心,注意使用的場景才行。

相關文章