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 |