當前位置:
首頁 > 最新 > 深入淺出MyBatis:JDBC和MyBatis介紹

深入淺出MyBatis:JDBC和MyBatis介紹

最近在休陪產假,時間比較零碎,準備看2本書充實下,一本是「深入淺出MyBatis:技術原理與實踐」,一本是「RabbitMQ實戰:高效部署分散式消息隊列」,為了加深記憶和理解,會進行整理、擴展和記錄。

看書的目標不是把所有的細節都記住,而是從整體上了解一個技術能做什麼,包含的特性、基本模塊,實現原理和常見使用場景。

本篇分享MyBatis書籍的第一篇,首先回憶下JDBC的相關概念,了解Java提供的訪問資料庫最基本的方式,然後介紹下MyBatis的基本特性和核心組件,最後說下書的整體結構,了解後續文章的大致內容。

JDBC相關概念

Java程序都是通過JDBC連接資料庫的,通過SQL對資料庫編程,JDBC是由SUN公司提出的一些列規範,只定義了介面規範,具體實現由各個資料庫廠商去實現,它是一種典型的橋接模式。

橋接模式是一種結構型設計模式,它的主要特點是把抽象與行為實現分離開來,分別定義介面,可以保持各部分的獨立性以及應對他們的功能擴展。

JDBC規範

所謂規範,就是自己定義了標準介面,做了如下抽象:用Connection代表和資料庫的連接,用Statement執行SQL,用ResultSet表示SQL返回的結果,提供了對數據的便利。從Connection可以創建Statement,Statement執行查詢得到ResultSet。

上面說的Connection、Statement、ResultSet都應該是介面,具體實現由各個資料庫提供商提供。有了規範,可以通過統一的介面,訪問多種類型的資料庫,可隨便切換資料庫。

資料庫驅動

上面提到,介面的實現由各個廠商提供,那麼實現類的類名就會不統一,去創建Connection對象時,代碼就會寫死某個實現類,切換資料庫時,就需要修改代碼,這樣不太好。為了解決這個問題,抽象了Driver驅動的概念。

每個資料庫都需要實現Driver介面,通過Driver可獲得資料庫連接Connection,通過反射機制動態創建。

同一個程序可能訪問不同的資料庫,通過DriverManager來管理驅動,Driver在初始化的時候,需要註冊到DriverManager中。

DriverManager提供了一個getConnection方法,用於建立資料庫Connection:

如果有多個資料庫驅動,DriverManager如何區分呢,需要在資料庫連接url中指定,比如mysql需要添加jdbc:mysql前綴:

數據源

數據源DataSource包含連接池和連接池管理2個部分,習慣上稱為連接池。在系統初始化的時候,將資料庫連接作為對象存儲在內存中,當需要訪問資料庫時,從連接池中取出一個已建立的空閑連接對象。

使用數據源,獲取其DataSource對象,通過該對象動態的獲取資料庫連接。另外,DataSource對象可以註冊到名字服務(JNDI)中,可以通過名字服務獲得DataSource對象,無需硬性編碼驅動。

DriverManager是JDBC1提供的,DataSource是JDBC2新增的功能,提供了更好的連接數據源的方法。

對比Hibernate和MyBatis

通過上面的介紹,傳統的JDBC編程給我們帶來了連接資料庫的功能,但其工作量相對較大,首先連接,然後處理JDBC底層事務,處理數據類型,還要對可能產生的異常進行捕捉處理並正確的關閉資源。

實際工作中,很少使用JDBC進行編程,提出了ORM模型,主要解決資料庫數據和POJO對象的相互映射。

Hibernate和Mybatis都是ORM模型,Hibernate提供的是一種全表映射的模型,對JDBC的封裝程度比較高。但Hibernate也有不少缺點,列舉如下:

全表映射帶來的不便,比如更新時需要發送所有的欄位;

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

對多表關聯和複雜SQL查詢支持較差,需要自己寫SQL,返回後,需要自己將數據組裝為POJO;

不能有效支持存儲過程;

雖然有HQL,但性能較差,大型互聯網系統往往需要優化SQL,而Hibernate做不到;

大型互聯網環境中,靈活、SQL優化,減少數據的傳遞是最基本的優化方法,Hibernate無法滿足要求,而MyBatis提哦給你了靈活、方便的方式,是一個半自動映射的框架。

MyBatis需要手工匹配提供POJO、SQL和映射關係,而全表映射的Hibernate只需要提供POJO和映射關係。

MyBatis可以配置動態SQL,可以解決Hibernate的表名根據時間變化,不同的條件下列明不一樣的問題。可以優化SQL,通過配置決定SQL映射規則,也能支持存儲過程,對於一些複雜和需要優化性能的SQL的查詢它更加方便。

核心組件

核心組件主要包括以下幾個:

SqlSessionFactoryBuilder:會根據配置信息或代碼來生成SqlSessionFactory;

SqlSessionFactory:依靠工廠來生成SqlSession;

SqlSession:是一個既可以發送SQL去執行並返回結果,也可以獲取Mapper的介面;

SQL Mapper:是MyBatis新設計的組件,由一個Java介面和XML文件構成,需要給出對應的SQL和映射規則。它負責發送SQL去執行,並返回結果。

構建SqlSessionFactory

每個MyBatis應用都是以SqlSessionFactory的實例為中心的,它的任務是創建SqlSession。SqlSesion類似於一個JDBC的Connection對象。

提供了2種方式創建SqlSessionFactory:一種是XML配置的方式,一種是代碼的方式,推薦使用XML配置的方式。

定義mybatis-config.xml文件如下:

創建SqlSessionFactory

創建SqlSession

SqlSession是一個介面類,扮演者門面的作用,真正幹活的是Executor介面。需要保證每次用完正常關閉它。

映射器

映射器是由Java介面和XML文件(或註解)共同組成的,作用如下:

定義參數類型

描述緩存

描述SQL語句

定義查詢結果和POJO的映射關係

首先,定義Java介面:

然後,定義映射XML文件,RoleMapper.xml

POJO對象Role的定義比較簡單,就不列出了。#為這條SQL的參數,SQL列的別名和POJO的屬性名稱保持一致,會把這條語句的查詢結果自動映射到Role屬性上,這就是自動映射。

執行查詢

組件生命周期

SqlSessionFactory在MyBatis應用的整個生命周期中,每個資料庫只對應一個SqlSessionFactory,可以實現一個工具類,以單例模式獲取該對象。

SqlSession的生命周期在請求資料庫處理事務的過程中,它是一個線程不安全的對象,在涉及多線程的時候要特別當心。它存活於一個應用的請求和操作,可以執行多條SQL,保證事務的一致性。

Mapper的作用是發送SQL,然後返回需要的結果,或者執行SQL修改資料庫的數據,所以它應該在一個SqlSession事務方法之內,如同JDBC中一條SQL語句的執行,它最大的範圍和SqlSession是相同的。

書的整體結構

本書分為3個部分,依次介紹了MyBatis的基礎應用、原理及插件開發、實戰應用。

基礎應用

主要介紹如何高效地使用MyBatis:

MyBatis特性

核心組件及其生命周期

MyBatis配置

映射器

動態SQL

MyBatis原理

深入源碼理解MyBatis的內部運行原理以及插件的開發方法和技巧:

介紹MyBatis的解析和運行原理,將了解到SqlSession的構建方法,以及四大對象是如何工作的

介紹MyBatis的插件

實戰應用

主要講解MyBatis的一些實用的場景:

介紹MyBatis-Spring,講解如何在Spring項目中集成MyBatis應用

介紹MyBatis的實用場景,精選一些典型場景,解析每個場景下,開發人員需要注意避免的一些錯誤和性能上的損失

下篇會介紹MyBatis的相關配置,更好的配置MyBatis以適用於不同的業務場景,以及提供給我們的擴展。

花香的季節

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 情情說 的精彩文章:

深入淺出MyBatis:「映射器」全了解

TAG:情情說 |