標籤:

MyBatis3:SqlMapConfig配置文件

通過前面的案例,應該能夠了解到SqlMapConfig這個配置文件的重要性。

下面我們來詳細介紹一下這個配置文件的書寫以及該配置那些內容

mybatis的全局配置文件SqlMapConfig.xml,配置內容如下:

properties(屬性)

settings(全局配置參數)

typeAliases(類型別名)

typeHandlers(類型處理器)

objectFactory(對象工廠)

plugins(插件)

environments(環境集合屬性對象)

environment(環境子屬性對象)

transactionManager(事務管理)

dataSource(數據源)

mappers(映射器)

下面做詳細的介紹

---------------------------------------------------------------------------------------------------------------------------

1.1 properties屬性

將資料庫連接參數單獨配置在db.properties中,只需要在SqlMapConfig.xml中載入db.properties的屬性值。

在SqlMapConfig.xml中就不需要對資料庫連接參數硬編碼。

將資料庫連接參數只配置在db.properties中,原因:方便對參數進行統一管理,其它xml可以引用該db.properties。

在sqlMapConfig.xml載入屬性文件:

properties特性:

注意: MyBatis 將按照下面的順序來載入屬性:

1.在 properties 元素體內定義的屬性首先被讀取。

2.然後會讀取properties 元素中resource或 url 載入的屬性,它會覆蓋已讀取的同名屬性。

3. 最後讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。

建議:

不要在properties元素體內添加任何屬性值,只將屬性值定義在properties文件中。

在properties文件中定義屬性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX

---------------------------------------------------------------------------------------------------------------------------

settings全局參數配置

mybatis框架在運行時可以調整一些運行參數。

比如:開啟二級緩存、開啟延遲載入。。

全局參數將會影響mybatis的運行行為。

這裡不做詳細說明。

---------------------------------------------------------------------------------------------------------------------------

typeAliases(別名)重點

在mapper.xml中,定義很多的statement,statement需要parameterType指定輸入參數的類型、需要resultType指定輸出結果的映射類型。

如果在指定類型時輸入類型全路徑,不方便進行開發,可以針對parameterType或resultType指定的類型定義一些別名,在SqlMapConfig.xml中通過別名定義,方便開發。

mybatis默認支持別名即int對應Integer這樣等。這裡不一一敘述。

著重介紹一下自定義別名:

在SqlMapConfig中定義單個別名:

也可以定義多個別名(常用):

---------------------------------------------------------------------------------------------------------------------------

typeHandlers(類型處理器)

mybatis中通過typeHandlers完成jdbc類型和java類型的轉換。

通常情況下,mybatis提供的類型處理器滿足日常需要,不需要自定義.

---------------------------------------------------------------------------------------------------------------------------

mappers(映射配置)

通過resource載入單個映射文件

通過mapper介面載入單個mapper

按照上邊的規範,將mapper.java和mapper.xml放在一個目錄 ,且同名。

批量載入mapper(推薦使用)

---------------------------------------------------------------------------------------------------------------------------

輸入映射

通過parameterType指定輸入參數的類型,類型可以是簡單類型、hashmap、pojo的包裝類型

傳遞pojo的包裝對象

針對上邊需求,建議使用自定義的包裝類型的pojo。

在包裝類型的pojo中將複雜的查詢條件包裝進去。

mapper.xml中

在UserMapper.xml中定義用戶信息綜合查詢(查詢條件複雜,通過高級查詢進行複雜關聯查詢)。

mapper.java(介面中定義)

public List<UserCustom> findUserList(UserQueryVo userQueryVO) throws Exception;

java代碼測試:

---------------------------------------------------------------------------------------------------------------------------

輸出映射

ResultType:

使用resultType進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,該列才可以映射成功。

如果查詢出來的列名和pojo中的屬性名全部不一致,沒有創建pojo對象。

只要查詢出來的列名和pojo中的屬性有一個一致,就會創建pojo對象,不一致的屬性的值為null。

輸出簡單類型

輸出int Stirng等類型。

輸出pojo對象和pojo列表

不管是輸出的pojo單個對象還是一個列表(list中包括pojo),在mapper.xml中resultType指定的類型是一樣的。

在mapper.java指定的方法返回值類型不一樣:

1、輸出單個pojo對象,方法返回值是單個對象類型

2、輸出pojo對象list,方法返回值是List<Pojo>

生成的動態代理對象中是根據mapper方法的返回值類型確定是調用selectOne(返回單個對象調用)還是selectList (返回集合對象調用 ).

ResultMap:

如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關係。

1、定義resultMap

2、使用resultMap作為statement的輸出映射類型

相當於一個橋樑

例如:

SELECT id id_,username username_ FROM USER WHERE id=#{value}

User類中屬性名和上邊查詢列名不一致。

定義reusltMap

使用resultMap作為statement的輸出映射類型

然後在介面中實現該方法,在java代碼中調用即可。

---------------------------------------------------------------------------------------------------------------------------

動態sql

mybatis核心 對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活拼接、組裝。

使用where if 關鍵字對sql進行拼接

在java代碼中調用即可。

---------------------------------------------------------------------------------------------------------------------------

SQL片段

將上邊實現的動態sql判斷代碼塊抽取出來,組成一個sql片段。其它的statement中就可以引用sql片段。

方便程序員進行開發。

一般sql片段中不使用where標籤。因為一個statement中可能使用多個sql片段,然而一句sql語句一般只有1個where關鍵字

調用sql片段

---------------------------------------------------------------------------------------------------------------------------

動態sql的foreach關鍵字

向sql傳遞數組或List,mybatis使用foreach解析

實現:

在用戶查詢列表和查詢總數的statement中增加多個id輸入查詢。

sql語句如下:

兩種方法:

SELECT * FROM USER WHERE id=1 OR id=10 OR id=16

SELECT * FROM USER WHERE id IN(1,10,16)

在類中定義list屬性,並完成get set函數

修改mapper.xml

另一種sql的寫法


推薦閱讀:

Mybatis1:基礎
spring mybatis每次訪問資料庫都要創建資料庫鏈接?
我的產品開發之旅 - SSM框架升級API平台(Spring + SpringMVC + MyBatis)

TAG:MyBatis |