1. 程式人生 > >【MyBatis學習05】SqlMapConfig.xml檔案中的配置總結

【MyBatis學習05】SqlMapConfig.xml檔案中的配置總結

  經過上兩篇博文的總結,對mybatis中的dao開發方法和流程基本掌握了,這一節主要來總結一下mybatis中的全域性配置檔案SqlMapConfig.xml在開發中的一些常用配置,首先看一下該全域性配置檔案中都有哪些可以配置的東西:

配置內容 作用
<properties> 用來載入屬性檔案
<settings> 用來設定全域性引數
<typeAliases> 用來設定型別的別名
<typeHandlers> 用來設定型別處理器
<objectFactory> 用來設定物件工廠
<plugins>
用來設定外掛
<environments> 用來設定mybatis的環境
<mappers> 用來配置對映檔案

  從前面的博文中可以看出,<environments>是用來配置mybatis的環境的,在和spring整合前是由mybatis自己管理的,但是和Spring整合後,這些配置都將被廢棄掉,<environments>部分在前面已經有提到過,這裡就不再贅述了。然後objectFactory和plugins一般我們不用,所以在這裡就不總結了,<typeHandlers>型別處理器是mybatis中用來完成jdbc型別和

Java型別之間轉換的,mybatis預設支援的型別處理器基本夠我們使用了,一般不需要自定義。這篇博文主要來總結一下剩下的幾個配置的用法。

1. properties載入屬性檔案

  我們之前連線資料庫的一些配置都是在<environments>中寫死的,在實際開發中肯定不是這樣子的,我們需要將資料庫連線引數單獨配在db.properties檔案中,然後在SqlMapConfig.xml中載入db.properties的屬性值即可,這就用到了<properties>了。即:

<properties resource="db.properties">
  • 1
  • 1

  然後environment中做一下對應的修改即可: 
配置

 
  <properties>內部還可以定義屬性值:<property name="" value=""/>,在property中定義的屬性也可以被<evironments>中來載入,這就涉及到了mybatis載入屬性的順序了:

  1. <properties>元素體內定義的首先被讀取
  2. 然後讀取<properties>元素中resource或者url載入的屬性,它會覆蓋已讀取的同名屬性
  3. 最後讀取parameterType傳遞的屬性(使用${}這種方式,不是#{}這種方式),它會覆蓋已讀的同名屬性

  建議:從上面可以看出來,如果在<properties>中定義屬性的話,有點亂,搞不好就會出錯,所以開發中不要在<properties>元素體內新增任何屬性值,只將屬性值定義在properties檔案中。另外在properties檔案中定義的屬性名要有一定的特殊性,如xxx.xxx,這樣不容易和其他的一些屬性值起衝突。

2. settings全域性引數配置

  mybatis框架在執行時可以調整一些執行引數,比如:開啟二級快取、開啟延遲載入等,有個settings全域性引數配置文件: 
settings配置
  這些全域性引數的配置會影響mybatis的執行行為,需要的時候再設定,不需要的時候不能亂設定,這裡就不做詳細介紹了,等後面用到的時候我再針對相應的做一下介紹。說實在的,這麼多我也懶得去看……

3. typeAliases類型別名

  這是配置中的一個重點,我們知道,在mapper.xml中定義了很多的statement,statement需要parameterType來指定輸入引數的型別、需要resultType來指定輸出結果的型別。如果在指定型別時輸入型別全路徑,有時候會很長,不方便進行開發,那麼我們就可以可以針對parameterType或resultType指定的型別定義一些別名,在mapper.xml中通過別名<typeAliases>來定義,方便開發。 
mybatis有預設支援的一些別名,一般基本型別都有別名,如下: 
別名 
  但是針對pojo的需要我們自定義別名了,比如我們將自己定義的User物件取個別名為user,如下:

<!-- 別名的定義 -->
<typeAliases>
    <!-- 針對單個別名的定義。type:型別的路徑; alias:別名 -->     
    <typeAlias type="mybatis.po.User" alias="user"/>
</typeAliases>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

  然後輸入引數或者輸出結果為mybatis.po.User時,就可以用user來代替了,如下: 
別名 
  但是問題來了,如果工程中有很多pojo,那豈不是完蛋……這得定義多少個啊,所以mybatis幫我們解決了這個問題,它提供了批量別名的定義,如下:

<!-- 批量別名定義(這個常用)
指定一個包名,mybatis會自動的掃描包中po類,自動定義別名,別名就是類名(首字母大寫或小寫都可以) -->
<package name="mybatis.po"/>
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

  這就爽了,如果進行了上面這樣設定,那麼所有放在mybatis.po包下的pojo都可以不用定義了,直接使用類名就可以了,所以我們直接使用user即可。毫無疑問,開發中肯定使用這個批量的別名定義。

3. mappers對映配置

  在前面的幾篇博文中可以看到,<mappers>標籤是通過resource方法載入單個對映檔案的,即:

<mappers>
    <mapper resource="sqlmap/User.xml" />
    <mapper resource="mapper/UserMapper.xml" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

  當然咯,除了resource外,也可以用url來載入,只不過url指定的是絕對路徑,硬碟中的路徑。這裡就不舉例了,這裡介紹另一種載入對映檔案的方式:通過mapper介面來載入。通過mapper介面來載入的話要遵循一個規範:

規範:需要將mapper介面類名和mapper.xml對映檔名稱保持一致,且在一個目錄中 
這個規範的前提是:使用的是mapper代理的方法

  所以上面的配置就可以改成

<mappers>
    <mapper resource="sqlmap/User.xml" />
    <mapper class="mybatis.mapper.UserMapper"/>
</mappers>
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

所以要把原來的UserMapper.xml從config/mapper中的拖到和UserMapper.java一個目錄下且同名,如下: 
mapper介面配置 
  但是還是有個弊端,就跟上面那個別名的配置一樣,如果現在有好多個mapper咋整,所以mybatis也給我們提供了批量載入方法:我們只要指定mapper介面的包名,mybatis自動掃描包下面所有的mapper介面進行載入。當然,還是要遵循上面的那個規範。所以我們可以修改上面的配置:

<mappers>
    <mapper resource="sqlmap/User.xml" />
    <package name="mybatis.mapper"/>
</mappers>
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

  這樣mybatis.mapper包下的所有mapper.xml對映檔案都可以載入了,這就更加簡潔了。在開發中推薦使用這種批量載入對映檔案的方法。 
  關於SqlMapConfig.xml檔案中的配置就總結這麼多吧~