首頁 > 科技

終於有大神把 MyBatis 企業項目實用操作講得明明白白了

2021-06-18 08:31:57

MyBatis的概述:MyBatis是一個持久層框架,用Java編寫的。它封裝了jdbc操作的很多細節,使開發者只需要關注SQL語句本身,而無需關注註冊驅動,創建等繁雜過程。它使用了ORM思想實現了結果集的封裝。

ORM:Object Relational Mapping物件關係對映,就是把資料庫表和實體類及實體類的屬性對應起來,讓我們可以操作實體類就實現操作資料庫表。

1.創建Maven工程並匯入座標

我們需要匯入MyBatis的座標,MyBatis是與資料庫互動的框架,所以匯入mysql驅動,為了方便測試與觀看日誌,匯入junit和log4j。

2.創建實體類和dao的介面

先將需要進行互動的資料庫表建立完成。

實現對user表的查詢操作(這裡,我們實現對該表的全表查詢findAll),那麼需要設定對應的user實體類,以及對應的與資料庫互動dao介面。

3.創建MyBatis的主配置檔案

主配置檔案主要包含資料來源配置,也就是資料庫連線池的一些資訊,以及對映配置檔案的位置配置。

4.創建對映配置檔案

對映配置檔案就是上面mapper對應的檔案,也是每個dao介面對應的xml配置檔案,其中包括名稱空間namespace,id,sql語句以及返回類型,namespace+id來定位sql語句位置,返回類型用來封裝物件。

環境搭建的注意事項:

創建IUserDao.xml和IUserDao.java時名稱是為了和我們之前的知識保持一致,在MyBatis中它把持久層的介面操作名稱和對映檔案也叫作:Mapper,所以,IUserDao和IUserMapper是一樣的。

在IDEA中創建目錄的時候,它和包是不一樣的,包在創建時:com.it.dao它是三級結構,目錄在創建時:com.it.dao是一級目錄

MyBatis的對映配置檔案位置必須和dao介面的包結構相同

對映配置檔案的mapper標籤namespace屬性的取值必須是dao介面的全限定類名

對映配置檔案的操作配置(select),id屬性的取值必須是dao介面的方法名

注:為什麼要遵循這麼多規定呢?是否感覺更麻煩了呢?其實,當我們將介面寫完,整個dao功能就已經被mybatis實現了,所以我們也就不需要再寫dao介面的實現類了,這一部分由mybatis來完成。

環境搭建到這裡就結束了,下面就來測試一下MyBatis的使用。

5.測試結果

6.註解方式

那麼上述的過程是使用xml配置的方式,顯然還是有一些比較麻煩的操作,比方說配置dao介面的對映檔案,這時候不僅需要注意namespace、id還要注意返回類型resultType,而使用註解就可以將其省略掉。首先,將與dao介面對應的xml對映檔案刪除,也就是上面的IUserDao.xml刪除,然後在dao介面的方法上使用@Select註解(查詢註解),並指定SQL語句,同時需要對SqlMapConfig.xml中的mapper配置進行修改,因為是使用註解,所以我們需要使用class屬性指定dao介面的全限定類名。具體程式碼如下:

自定義Mybaits

分析流程

注:此處對於初學者來說,陌生物件非常多,那麼為什麼不直接將其封裝起來呢?而是拆解成這麼多的物件。很顯然,拆解的物件越多,使用配置就可以更加靈活,比方說openSession方法就會有很多的過載方法,提供給程式設計師使用。

根據JDBC,我們可以聯想到剛才那些步驟的作用。獲取xml資訊,就可以獲取到Connection物件得到連線,獲取到PrepareStatement物件進行預處理。遍歷結果集的時候,可以使用反射技術通過配置的全限定類名來創建需要進行封裝的物件。那麼在實際過程中xml資訊中的對映資訊會非常多,肯定會有許多不同的namespace,以及相同namespace下的不同id,也就是不同的執行方法,並且也需要將對應的SQL語句、封裝返回的全限定類名(resultType)進行繫結,那麼這裡可以使用map資料結構進行繫結對映,namespace.id可以確定唯一的Mapper物件。

代理物件的獲取

具體步驟

既然要自己寫mybatis,那麼首先就得將mybatis的dependency刪掉,此時關於mybatis的這些東西就都飄紅了,那麼現在也就針對這些類進行創建與具體實現。

首先,我們需要Resources類來進行xml檔案的資訊讀取。

注:創建Resources類,並實現getResourceAsStream方法,這裡是將三步直接進行了融合,第一:獲取Resources.class,第二:通過class獲取類載入器,第三:通過類載入器讀入xml檔案資訊。

完成飄紅部分類資訊框架

SqlSessionFactoryBuilder是一個類,SqlSessionFactory和SqlSession都是介面,Builder創建Factory(build方法,需要傳入讀取到的xml資訊),再通過工廠生產出SqlSession物件(openSession方法),SqlSession創建代理物件(getMapper方法,需要傳入被代理類的class),並且可以關閉資源(close方法),濾清關係之後,我們來搭建。

此時可以發現,test中的所有飄紅部分已經正常,那麼剩下的就是對其進行具體實現了。讀入xml檔案資訊之後,我們還需要對讀入內容進行解析,獲取到我們所需要的資訊,從而來完成一系列操作,這裡使用的技術是dom4j+xpath(因為我們是在學習mybatis,所以可以不用關心它們,只需要知道它們可以幫助我們來解析配置資訊)。所以此時我們需要新增兩個dependency。

之後,需要新增下面的程式碼(XMLConfigBuilder類)。

配置資訊儲存

在之前我們就分析過,對於配置的東西需要進行儲存,上面的程式碼就是為了將這些資訊封裝起來,完全按照之前圖解的方式,將資料庫連線資訊和對映資訊。其中連線資訊比較容易儲存,可以用四個屬性來存,分別是driver、url、username、password。而對映資訊就可能會包含很多個,並且與namespace.id有一一對映關係,所以使用map資料結構來儲存,同時對對映資訊用Mapper類單獨封裝,包括了執行的Sql語句和返回結果的實體類全限定類名。

正兒八經造工廠

有了封裝好的配置資訊,那麼這時候我們就可以正兒八經地來實現之前沒有完成的內容了,工廠構建者類中的build方法創建的是工廠,那就需要一個工廠的實現類,並將這些封裝好的配置資訊要傳入(工廠得有配方才能幹活,所以屬性得有Configuration,構造方法中可以傳入);工廠造SqlSession物件,所以也需要SqlSession的實現類。

ImpSqlSession需要實現SqlSession的兩個方法,第一:創建代理類,第二:關閉資源。這裡我們使用到了動態代理,所以就需要一個InvocationHandler的實現類MapperProxy,並實現invoke方法,我們本質是對selectList方法進行增強,這裡還需要一個Executor類(執行selectList方法的類)。

運行結果:

檔案架構:

如何獲取資料?

轉發分享此文,後臺私信小編:「資料」即可獲取。(注:轉發分享,感謝大家)


IT145.com E-mail:sddin#qq.com