Mybatis學習總結(三)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屬性

作用:將數據連接單獨配置在db.properties中,只需要在SqlMapConfig.xml中加載db.properties的屬性值,在SqlMapConfig.xml中就不需要對數據庫連接參數進行硬編碼。數據庫連接參數只配置在db.properties中,方便對參數進行統一管理,其它xml可以引用該db.properties。

db.properties的內容:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

在SqlMapConfig.xml中加載db.properties

複製代碼
<!-- 加載數據庫文件db.properties -->
<properties resource="db.properties">
        <!-- properties中還可以配置一些屬性名和屬性值,此處的優先加載 -->
        <!-- <property name="driver" value=""/> -->
    </properties>
    <!-- 和spring整合後 environments配置將廢除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事務管理,事務控制由mybatis管理-->
            <transactionManager type="JDBC" />
        <!-- 數據庫連接池,由mybatis管理-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
複製代碼

properties特性:
注意:
   (1)在properties元素體內定義的屬性優先讀取。
   (2)然後讀取properties元素中resource或url加載的屬性,它會覆蓋已讀取的同名屬性。
   (3)最後讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。
建議:
 (1)不要在properties元素體內添加任何屬性值,只將屬性值定義在properties文件中。
   (2)在properties文件中定義屬性名要有一定的特殊性,如xxxx.xxxx(jdbc.driver)。

2、settings全局參數設置

mybatis框架運行時可以調整一些運行參數。比如,開啓二級緩存,開啓延遲加載等等。全局參數會影響mybatis的運行行爲。

                          mybatis-settings的配置屬性以及描述

setting(設置)Description(描述)valid Values(驗證值組)Default(默認值)
cacheEnabled在全局範圍內啓用或禁用緩存配置 任何映射器在此配置下。true | falseTRUE
lazyLoadingEnabled在全局範圍內啓用或禁用延遲加載。禁用時,所有相關聯的將熱加載。true | falseTRUE
aggressiveLazyLoading啓用時,有延遲加載屬性的對象將被完全加載後調用懶惰的任何屬性。否則,每一個屬性是按需加載。true | falseTRUE
multipleResultSetsEnabled允許或不允許從一個單獨的語句(需要兼容的驅動程序)要返回多個結果集。true | falseTRUE
useColumnLabel使用列標籤,而不是列名。在這方面,不同的驅動有不同的行爲。參考驅動文檔或測試兩種方法來決定你的驅動程序的行爲如何。true | falseTRUE
useGeneratedKeys允許JDBC支持生成的密鑰。兼容的驅動程序是必需的。此設置強制生成的鍵被使用,如果設置爲true,一些驅動會不兼容性,但仍然可以工作。true | falseFALSE
autoMappingBehavior指定MyBatis的應如何自動映射列到字段/屬性。NONE自動映射。 PARTIAL只會自動映射結果沒有嵌套結果映射定義裏面。 FULL會自動映射的結果映射任何複雜的(包含嵌套或其他)。

NONE,PARTIAL,FULL

PARTIAL
defaultExecutorType配置默認執行人。SIMPLE執行人確實沒有什麼特別的。 REUSE執行器重用準備好的語句。 BATCH執行器重用語句和批處理更新。

SIMPLE,REUSE,BATCH

SIMPLE
safeRowBoundsEnabled允許使用嵌套的語句RowBounds。true | falseFALSE
mapUnderscoreToCamelCase從經典的數據庫列名A_COLUMN啓用自動映射到駱駝標識的經典的Java屬性名aColumn。true | falseFALSE
localCacheScopeMyBatis的使用本地緩存,以防止循環引用,並加快反覆嵌套查詢。默認情況下(SESSION)會話期間執行的所有查詢緩存。如果localCacheScope=STATMENT本地會話將被用於語句的執行,只是沒有將數據共享之間的兩個不同的調用相同的SqlSession。

SESSION

STATEMENT

SESSION
dbcTypeForNull指定爲空值時,沒有特定的JDBC類型的參數的JDBC類型。有些驅動需要指定列的JDBC類型,但其他像NULL,VARCHAR或OTHER的工作與通用值。JdbcType enumeration. Most common are: NULL, VARCHAR and OTHEROTHER
lazyLoadTriggerMethods指定觸發延遲加載的對象的方法。A method name list separated by commasequals,clone,hashCode,toString
defaultScriptingLanguage指定所使用的語言默認爲動態SQL生成。A type alias or fully qualified class name.

org.apache.ibatis.scripting.xmltags

.XMLDynamicLanguageDriver

callSettersOnNulls指定如果setter方法​​或地圖的put方法時,將調用檢索到的值是null。它是有用的,當你依靠Map.keySet()或null初始化。注意原語(如整型,布爾等)不會被設置爲null。true | falseFALSE
logPrefix指定的前綴字串,MyBatis將會增加記錄器的名稱。Any StringNot set
logImpl指定MyBatis的日誌實現使用。如果此設置是不存在的記錄的實施將自動查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGINGNot set
proxyFactory指定代理工具,MyBatis將會使用創建懶加載能力的對象。CGLIB | JAVASSIST CGLIB

官方文檔settings的例子:

複製代碼
<setting name="cacheEnabled" value="true"/>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="multipleResultSetsEnabled" value="true"/>
    <setting name="useColumnLabel" value="true"/>
    <setting name="useGeneratedKeys" value="false"/>
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <setting name="defaultExecutorType" value="SIMPLE"/>
    <setting name="defaultStatementTimeout" value="25"/>
    <setting name="safeRowBoundsEnabled" value="false"/>
    <setting name="mapUnderscoreToCamelCase" value="false"/>
    <setting name="localCacheScope" value="SESSION"/>
    <setting name="jdbcTypeForNull" value="OTHER"/>
    <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
複製代碼

3、typeAiases(別名)——重點掌握

      這是配置中的一個重點,我們知道,在mapper.xml中,定義很多的statement,statement需要parameterType指定輸入參數的類型、需要resultType指定輸出結果的映射類型。如果在指定類型時輸入類型全路徑,有時候會很長,不方便進行開發,那麼我們就可以針對parameterType或resultType指定的類型定義一些別名,在mapper.xml中通過別名<typeAliases>來定義,方便開發。

3.1、Mybatis默認支持的別名

別名

映射的類型

_byte 

byte 

_long 

long 

_short 

short 

_int 

int 

_integer 

int 

_double 

double 

_float 

float 

_boolean 

boolean 

string 

String 

byte 

Byte 

long 

Long 

short 

Short 

int 

Integer 

integer 

Integer 

double 

Double 

float 

Float 

boolean 

Boolean 

date 

Date 

decimal 

BigDecimal 

bigdecimal 

BigDecimal 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.2、自定義別名

3.2.1、單個別名定義(在SqlMapConfig.xml)

上面講的是Mybatis默認支持的一些別名,但是針對pojo的需要我們就要自定義別名了,比如我們將自己定義的User對象取個別名爲user,如下:

<!-- 別名定義:針對單個別名定義 type:類型的路徑; alias:別名 -->
<typeAliases><typeAlias type="com.mybatis.entity.User" alias="user"/></typeAliases>

UserMapper.xml中引用別名(輸入參數或者輸出結果爲com.mybatis.entity.User時,就可以用user來代替了):

<select id="findUserById" parameterType="int" resultType="user" >
      select * from t_user where id=#{id}
</select>

3.2.2、批量定義別名(常用)

但是問題來了,如果工程中有很多pojo,那豈不是要一個一個定義……這得定義多少個啊,所以mybatis幫我們解決了這個問題,它提供了批量別名的定義,如下:

複製代碼
<!-- 批量別名的定義:
        package:指定包名,mybatis會自動掃描包中的pojo類,自動定義別名,別名就是類名(首字母大寫或小寫都可以)
 -->
<typeAliases>
      <package name="com.mybatis.entity"/>
      <package name="其它包"/>
</typeAliases>
複製代碼

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

4、mappers(映射配置)

4.1、通過resource加載單個映射文件

<!-- 加載映射文件 -->
    <mappers>
    <!--通過resource方法一次加載一個映射文件  -->
        <mapper resource="sqlmap/User.xml"/>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

4.2、通過mapper接口加載單個映射文件

<!-- 通過mapper接口加載單個映射配置文件
遵循一定的規範:需要將mapper接口類名和mapper.xml映射文件名稱保持一致,且在一個目錄中;
上邊規範的前提是:使用的是mapper代理方法; -->

<mapper class="com.mybatis.mapper.UserMapper"/> 

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

4.3、批量加載mapper(推薦使用)

但是還是有個弊端,就跟上面那個別名的配置一樣,如果現在有好多個mapper怎麼辦,所以mybatis也給我們提供了批量加載方法:我們只要指定mapper接口的包名,mybatis自動掃描包下面所有的mapper接口進行加載。當然,還是要遵循上面的那個規範。配置如下:

<!-- 批量加載映射配置文件,mybatis自動掃描包下面的mapper接口進行加載
    遵循一定的規範:需要將mapper接口類名和mapper.xml映射文件名稱保持一致,且在一個目錄中;
        上邊規範的前提是:使用的是mapper代理方法;
  -->
<package name="com.mybatis.mapper"/> 

這樣com.mybatis.mapper包下的所有mapper.xml映射文件都可以加載了,這就更加簡潔了。在開發中推薦使用這種批量加載映射文件的方法。

關於SqlMapConfig.xml文件中的配置就總結這麼多吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章