1. 程式人生 > >MyBatis框架入門(一)

MyBatis框架入門(一)

                                         第一章 MyBatis簡介

要有核心配置檔案,要有資料模型對應的mapper。

通過以上的兩個元件就能產生SqlSessionFactory,這個工廠能生產出SqlSession,就能使用SqlSession操作資料庫了,SqlSession中有一個Executor物件,Executor物件是資料庫操作語句的執行者,給SqlSession的sql語句放在了一個pojo物件裡,這個pojo物件就像是我們的使用者物件一樣,有什麼使用者名稱、密碼、性別等等,這個pojo物件可以將我們的儲存語句分開,比如select儲存在一個欄位中,引數儲存在一個欄位中,表名儲存一個欄位中等等,具體如下圖所示,MappedStatement儲存在Executor裡面,Executor儲存在SqlSession裡面。

在後面的MappedStatement中又牽扯到輸入與輸出的問題,當把sql語句輸入到MappedStatement中時,可能會有佔位符?,所以我們需要一個對映,將問號輸入,待到要輸出資料時,可以將其對映為map,string等等。

                                           第二章 具體操作

2.1 pojo類與核心配置檔案的配置

pojo類的話,其中的欄位與資料庫中的欄位名字型別匹配就好了。

可以看出配置類主要是配置mybatis的一些引數,mybatis需要的mapper的位置。

2.2 Mapper.xml的配置

在select標籤中,id代表查詢的名字,自己起,parameterType表示引數的型別,resultType表示返回值的型別,自動填充的,需要pojo類的屬性名與資料庫表中的欄位名一致才可以自動填充,要填寫完整的類名。#{v}代表接收引數。

為了避免各個pojo類.xml中的id名重複,一般會在mapper標籤中加入namespace屬性。

2.3 執行查詢

 需要執行的時候,先通過工廠建立SqlSession,然後呼叫其的方法傳入mapper中的配置與引數即可。

2.4 簡單的查詢例子

2.4.1 模糊查詢

雖然這個查詢的是list,按理說要返回list<?>,但是根據規定,只需要填寫裡面的泛型就好,所以還是那個user,#{}表示要給引數加上兩個單引號,同時{}括號中的名字可以隨便起,${}表示不給引數加上單引號,{}裡面的名字必須為value,即${value}。

2.4.2 新增使用者

2.4.3 新增使用者返回ID

mysql儲存資料的過程是先儲存資料後生成id。keyProperty表示的需要獲取的屬性,這個是由資料庫提供的不是mybatis提供的。

2.4.4 更新使用者

2.4.5 刪除使用者

                               第三章 Mybatis與Hibernate的區別

3.1 Mybatis解決的問題

1. 可以在核心配置檔案中配置資料連線池,使用連線池管理資料庫連結。

2. 把sql語句寫在程式碼裡易維護。

3. mybatis自動將java物件對映至sql語句,通過statement中的parameterType定義輸入引數的型別。

4.mybatis自動將sql執行結果對映至java物件,通過statement中的resultType定義輸出結果的型別。

3.2mybatis與hibernate的區別

1. mybatis不完全是一個ORM框架,hibernate是完整的版的ORM框架,區別是一個要寫sql語句,一個不用寫。

2. mybatis程式設計師直接寫原生態的sql,可嚴格控制sql執行效能,非常適合對關係資料模型要求不高的軟體開發,因為這類軟體需求變化頻繁,一旦需求變化要求迅速輸出,但是靈活的前提是mybatis無法做到資料庫無關性,比如mysql與oracle的分頁就不一樣,如果需要實現支援多種資料庫的軟體則需要自定義多套sql對映檔案,工作量大。

    hibernate物件/關係對映能力強,資料庫無關性好,對於關係模型要求高的軟體,如果用hibernate開發可以節省很多的程式碼,但是hibernate學習門檻較高,怎麼設計O/R對映,在效能和物件模型之間如何權衡以及如何用好hibernate需要具有很強的能力。

                       第四章 原始Dao開發與Mapper動態代理開發

4.1 前幾章進行的操作所處位置

       剛才我們寫了很多,其實並不在三層架構之中,我們只是在資料庫外建立了一個單元測試,通過單元測試來進行一系列的操作,如果我們能將單元測試整合到dao層之中,就可模擬dao層的開發了。

        我們觀察剛才的測試中的程式碼,我們發現前面幾行都是重複的,所以我們可以進行提取,但是SqlSession不能進行提取,因為工廠是單例模式,我們可以共用一個工廠,但是一個session是一個執行緒,所以我們不能共用(還是有些疑問)。

4.2 Dao開發

按照之前的開發,我們需要進行註解配置,但是現在我們沒有spring,只能自己new一個。

我們再寫一個單元測試充當service層,

這是原始的dao開發,之前hibernate就是這麼幹的。

4.3 Mapper動態代理開發

在原始的dao開發中,我們要寫的比較複雜,需要寫mapper.xml,dao介面與dao實現類。在實現類中還有很多重複的程式碼,所以出現了Mapper動態代理開發。

我們建立mapper包取代dao包,新建介面UserMapper(相當於dao介面),如果介面能遵循四個原則就可以取代介面+實現類的形式。

自己的思考:在實現類中我們要做的就是把方法和xml中的sql語言結合起來,如果有更簡便的方法使之結合,再讓系統幫們生成實現類,我們就可以不用寫實現類了,直接呼叫介面的方法就行了。

注意到在介面中和使用時並沒有區分是selectone還是selectlist,它會根據你mapper介面的返回值來決定的。在介面中我們可以使用pojo包裝物件與map物件等等,用來保證程式碼的通用性。

                               第五章 SqlMapConfig的一些配置

5.1 properties的配置

5.2 typeAliases

我們在mapper的resultType中,一般是寫全類名,如下圖

我們可以起個別名,然後就能直接寫User了,需要注意的是properties標籤要在typealiases標籤上面。

但是這樣寫有個弊端,我們有一個表就要寫一個別名,比較麻煩,我們可以直接寫個包名,只需指定父包即可,它會掃描下面的子包等等,同時不區分大小寫,我們用大寫小寫都行。

5.3 Mapper設定

我們需要指定Mapper.xml的位置,一開始我們的Mapper使用resource設定的,如下圖,我們也可以用別的配置指定其位置。

用class配置:此種方法要求mapper.xml與mapper介面名字相同,且在同一個包下,與5.2的問題一樣,同樣一個表一條語句有些麻煩,可以直接掃描包,只要遵循前面的規則就可以了。