MyBatis入門

    我們一般連接數據庫處理數據一般用ORM框架,MyBatis是ORM框架之一,我們講解MyBatis之前先講一講傳統的JDBC和ORM吧。

第一部分:ORM

傳統的JDBC方式

    很久很久以前Java是通過JDBC操作數據庫的,JDBC是SUN公司提出的一系列規範,但是它只定義了接口規範,具體的實現是數據庫廠家去實現的。因爲每個數據庫都有其特殊性,這些事Java規範沒有辦法確定的,所以JDBC是一個典型的橋接模式。我們看看JDBC的基本步驟:

    • 使用JDBC編程需要連接數據庫,註冊驅動和數據庫信息。

    • 操作Connection,打開Statement對象

    • 通過Statement執行SQL,返回結果到ResultSet。

    • 使用ResultSet讀取數據,然後通過代碼轉化爲具體的POJO。

    • 關閉數據庫相關資源。

    傳統的JDBC方式有些弊端,其一,工作量大(創建連接到關閉連接中的每一個步驟我們自己操作)。其二,我們自己捕捉異常並處理,釋放資源。一個簡單的SQL在JDBC中如此複雜,何況複雜的SQL,於是ORM框架出現了。不過所有的ORM框架都封裝了JDBC,就是強度不一樣而已。

ORM模型

    由於JDBC的缺陷,在實際工作中我們很少用JDBC進行編程,於是提出了對象關係映射(Object Relational Mapping),簡稱ORM,那什麼是ORM呢?簡單的說,ORM模型就是數據庫的表和簡單JAVA對象(POJO)的映射關係模型。它主要解決數據庫數據和POJO之間的相互映射。如下:

image.png

    有了ORM模型,在大部分情況下,程序員只需要瞭解Java應用而無需對數據庫相關知識深入瞭解,便可以寫出通俗易懂的程序。此外,ORM模型提供了統一的規則使得數據庫的數據通過配置便可輕易映射到POJO上。

Hibernate

    EJB失敗後,Hibernate就成了Java世界首選的ORM模型,它是建立在POJO和數據庫表模型的直接映射關係上的。Hibernate是建立在若干POJO通過XML映射文件(或註解)提供的規則映射到數據庫表上的。我們可以通過POJO直接操作數據庫的數據。它提供的全表映射模式,如下:

image.png

Hibernate優點:

    • 消除了代碼的映射規則,它全部被分離到了XML或註解裏面去配置。

    • 無需再管理數據庫連接,它也配置在XML裏面。

    • 一個會話中不在操作多個對象,只要操作Session對象即可。

    • 關閉資源只需要關係Session即可。

Hibernate缺點:

    • 全表映射帶來的不變,比如更新時需要發送所有的字段。

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

    • 多表關聯和複雜SQL支持較差,需要自己寫SQL,返回後,需要自己將數據組裝成POJO。

    • 不能有效支持存儲過程。

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

MyBatis

    Mybatis是半自動化的,是因爲它需要手工匹配提供POJO,SQL和映射關係,而Hibernate只需要提供POJO和映射關係即可。MyBatis的前身是iBatis,是基於Java的持久化框架。MyBatis所需要提供的映射文件包含以下三個部分:SQL,映射規則,POJO,映射模型如下:

image.png

    雖然MyBatis感覺有點麻煩,但是靈活,自己寫SQL,定義映射關係,此外,MyBatis提供接口編程的映射器,只需要一個接口和映射文件便可以運行。

MyBatis,Hibernate,JDBC怎麼選擇?

    MyBatis:靈活,可以動態生成映射關係的框架,可以完全替代JDBC,同時提供了緩存,日誌,級聯。缺點就是工作量就大一點,,,等。

    Hibernate:編程簡易,映射規則可以通過IDE生成,同時提供了緩存,日誌,級聯等,缺點就是不夠靈活,難以優化,,,等

    JDBC:不推薦了,除非簡單的功能考慮用一用。


第二部分:MyBatis的基本概念

MyBatis的基本構成

    我們先了解下MyBatis的核心組件:

image.png

    • SqlSessionFactoryBuilder(構造器),它會根據配置信息或者代碼來生成SqlSessionFactory(工廠接口)

    • SqlSessionFactory,依靠工廠來生成SqlSession(會話)

    • SqlSession,是一個即可以發送SQL去執行並返回結果,也可以獲取Mapper的接口

    • SQL Mapper,它是MyBatis新設計的組件,它是有一個Java接口和XML文件(或註解)構成的,需要給出對應的SQL和映射規則。它負責執行SQL並返回結果。

1、構建SqlSessionFactory

    每個MyBatis的應用都是以SqlSessionFactory的實例爲中心的,可以通過SqlSessionFactoryBuilder獲取,SqlSessionFactory是一個工廠接口而不是實現類。它的任務是創建SqlSesion。MyBatis提供了兩種模式去創建SqlSessionFactory:一種是XML配置,另一箇中是代碼的方式,一般推薦XML的配置方式。

2、創建SqlSession

    SqlSession是一個接口類,它類似於你們公司前臺美女,門面的作用,而真正幹活的是Executer接口,你認爲它是公司的工程師。假設我是客戶找你們公司幹活,我只需要告訴前臺的美女客戶(SqlSession),我要什麼信息(參數),要做什麼東西,過段時間,她會將結果給我,我們所所關心的是:

    1. 要給美女客戶(SqlSession)什麼信息(功能和參數)

    2. 美女客戶會返回什麼結果(Result)

SqlSession的用途主要有兩種:

    1. 獲取映射器,讓映射器通過命名空間和方法名稱找到對應的SQL,發送給數據庫後返回結果。

    2. 直接通過命名信息去執行SQL。

3、映射器

    映射器又Java接口和Xml文件共同組成的,它的作用如下:

    • 定義參數定義

    • 描述緩存

    • 描述SQL語句

    • 定義查詢結果好POJO映射關係

    一個映射器的實現方式有兩種,一種是通過Xml方式,另一個就是通過代碼來實現。一般推薦Xml的方式實現,理由如下:

    • Java註釋是受限的,功能較少,而MyBatis的內容相當多,而且相當複雜,功能強大。

    • 如果你的SQL很複雜,條件很多,尤其是存在動態SQL時,寫在Java裏可讀性差,增加了維護成本。

2.3 生命週期

Mybatis的生命週期,如下:

image.png

SqlSessionFactoryBuilder

    SqlSessionFactoryBuilder是Xml或者Java編碼獲得資源來構建SqlSessionFactory的。通過它可以構建多個SqlSessionFactory。它的作用就是一個構造器,一旦我們的構建了SqlSessionFactory,它的作用就已經完結,失去了存在的意義,這時我們就應該毫無猶豫的廢棄它,將它回收。所以它的生命週期只存在於方法的局部,它的作用就是生成SqlSessionFactory對象。

SqlSessionFactory

    SqlSessionFactory的作用就是創建SqlSession,而SqlSession就是一個會話,相當於JDBC中的Connection對象。每次應用程序需要訪問數據庫,我們就要通過SqlSessionFactory來創建SqlSession。所以SqlSessionFactory應該在MyBatis應用的整個生命週期中。

    如果我們多次創建同一個數據庫的SqlSessionFactory,則每次創建SqlSessionFactory會打開更多的數據庫連接資源,那麼連接資源就很快會被耗盡。因此SqlSessionFactory的責任是唯一的,就是創建SqlSession,所以我們果斷創建單例模式。如果我們創建多例那麼它對數據庫連接的消耗是很大的,不利於我們統一的管理。所以一個數據庫只對應一個SqlSessionFactory。

SqlSession

    SqlSession是一個會話,相當於JDBC的一個Connection對象,它的生命週期應該是在請求數據庫處理事務的過程中。它是一個線程不安全的對象,在涉及多線程的時候我們需要特別小心,操作數據庫需要注意隔離級別,數據庫鎖等高級特性。

    每次創建SqlSession都必須及時關閉它,它長期存在就會使數據庫連接池的活動資源減少,對系統性能的影響很大。它存活於一個應用的請求和操作,可以執行多條SQL,保證事務的一致性。

Mapper

    Mapper是一個接口,而沒有任何實現類,它的作用就是發送SQL,然後返回我們需要的結果,或者執行SQL從而修改數據庫的數據,因此它應該在一個SqlSession事務方法之內,是一個方法級別的東西。它就如同JDBC裏的一個SQL語句的執行,它最大的範圍和SqlSession相同。儘管我們想一直保存着Mapper,但是你會發現它是很難控制,所以儘量在一個SqlSession事務的方法中使用它們,然後廢棄掉。


案例代碼

    本項目使用的案例代碼gitee上了,會持續更新:

         地址:https://gitee.com/u2r2otkit/MyBatis-Integration-Project

         對應的項目:MyBatis-Integration-Project

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章