MyBatis別名和settings設置方式

MyBatis別名和settings設置

別名(typeAliases)是一個指代的名稱,在類的限定名過長時可以指定別名來簡化使用,MyBatis裡分為系統定義別名和自定義別名兩種,系統定義別名是不需要我們再去指定的,通過TypeAliasRegistry類註冊。

MyBatis中別名不區分大小寫,一個typeAliases的實例是在解析配置文件時生成的,然後長期保存在Configuration對象中。

接下來配置別名:

1、在MyBatis Spring配置文件中引入配置

指定configLocation屬性,即可在對應的xml文件中進行配置,如下所示:

    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 自動掃描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:com.fc.mapper/*-sqlmap.xml"/>
        <!-- 配置 -->
        <property name="configLocation" value="classpath:sqlmap-alias.xml"/>
    </bean>

2、sqlmap-alias.xml中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration>
    <!-- 開啟駝峰規則與下劃線間的映射關系 -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
 
    <!-- 別名 -->
    <typeAliases>
        <typeAlias alias="USER" type="com.fc.bean.User" />
    </typeAliases> 
</configuration>

在<typeAliases>標簽下即可指定對應bean的別名,多個類的別名添加多個<typeAlias>標簽即可。

<settings>是MyBatis最復雜的配置也是最重要的配置之一,不過不配置也可以正常工作,因為MyBatis已經提供瞭默認的配置,

如需要進行設置的自定義改動可以在配置中添加<settings>標簽,如上例所示(註意configuration中的設置是有序的,如上述的settings和typeAliases標簽交換順序,會有錯誤提示)

具體的屬性可以參考Configuration類,在配置文件中可以通過<setting>標簽更改默認屬性值,mapUnderscoreToCamelCase是

開啟camel case(自動駝峰命名規則)映射,使用示例:

<select id="queryUser" parameterType="java.util.Map" resultType="USER">
        SELECT
          id,
          real_name,
          sex sex,
          age age,
          login_name,
          login_password,
          create_time,
          update_time
        from temp_user
        <trim prefix="where" prefixOverrides="and">
            <if test="realName != null and realName != '' ">
                and real_name = #{realName}
            </if>
            <if test="loginName != null and loginName != '' ">
                and login_name = #{loginName}
            </if>
        </trim>
    </select>

3、相對完整的setting設置和說明如下:

<!-- settings設置 -->
    <settings>
        <!-- 映射器緩存全局開關,默認true -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 延遲加載的全局開關,默認false -->
        <setting name="lazyLoadingEnabled" value="false"/>
        <!-- 是帶有延遲加載屬性的對象完整加載,默認true -->
        <setting name="aggressiveLazyLoading" value="true"/>
        <!-- 是否允許單一語句返回多結果集,默認true -->
        <setting name="multipleResultSetsEnabled" value="true"/>
        <!-- 列標簽代替列名,默認true -->
        <setting name="useColumnLabel" value="true"/>
        <!-- 允許jdbc支持自動生成主鍵,默認false -->
        <setting name="useGeneratedKeys" value="false"/>
        <!-- 指定 MyBatis 應如何自動映射列到字段或屬性。
            NONE 表示取消自動映射;PARTIAL 隻會自動映射沒有定義嵌套結果集映射的結果集。
            FULL 會自動映射任意復雜的結果集(無論是否嵌套) -->
        <setting name="autoMappingBehavior" value="PARTIAL"/>
        <!-- 指定發現自動映射目標未知列的行為,默認NONE -->
        <setting name="autoMappingUnknownColumnBehavior" value="NONE"/>
        <!-- 指定默認執行器,SIMPLE/REUSE/BATCH -->
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <!-- 設置超時時間,默認不設置 -->
        <setting name="defaultStatementTimeout" value="3000"/>
        <!-- 為驅動的結果集獲取數量(fetchSize)設置一個提示值,默認不設置 -->
        <setting name="defaultFetchSize" value="1000"/>
        <!-- 嵌套語句中采用分頁,默認false表示開啟 -->
        <setting name="safeRowBoundsEnabled" value="false"/>
        <!-- 駝峰規則,默認false -->
        <setting name="mapUnderscoreToCamelCase" value="false"/>
        <!-- 會話開啟本地緩存查詢機制,其它值STATEMENT用於語句執行上 -->
        <setting name="localCacheScope" value="SESSION"/>
        <!-- 沒有為參數指定jdbc類型時,為空值指定jdbc類型 -->
        <setting name="jdbcTypeForNull" value="OTHER"/>
        <!-- 指定對象的方法觸發一次延遲加載 -->
        <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
        <!-- 指定動態SQL生成的默認語言 -->
        <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
        <!-- 指定當結果集中值為null的時候是否調用映射對象的setter(map 對象時為 put) -->
        <setting name="callSettersOnNulls" value="false"/>
        <!-- 指定mybatis增加到日志名稱的前綴,默認不設置 -->
        <setting name="logPrefix" value="xxx_"/>
        <!-- 指定Mybatis創建具有延遲加載能力的對象所用到的代理工具,3.3或以上JAVASSIST -->
        <setting name="proxyFactory" value="CGLIB"/>
    </settings>

MyBatis setting的用法和解釋

setting 用法

<!-- settings是 MyBatis 中極為重要的調整設置,它們會改變 MyBatis 的運行時行為。 -->  
    <settings>  
        <!-- 該配置影響的所有映射器中配置的緩存的全局開關。默認值true -->  
      <setting name="cacheEnabled" value="true"/>  
      <!--延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態。默認值false  -->  
      <setting name="lazyLoadingEnabled" value="true"/>  
        <!-- 是否允許單一語句返回多結果集(需要兼容驅動)。 默認值true -->  
      <setting name="multipleResultSetsEnabled" value="true"/>  
      <!-- 使用列標簽代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。默認值true -->  
      <setting name="useColumnLabel" value="true"/>  
      <!-- 允許 JDBC 支持自動生成主鍵,需要驅動兼容。 如果設置為 true 則這個設置強制使用自動生成主鍵,盡管一些驅動不能兼容但仍可正常工作(比如 Derby)。 默認值false  -->  
      <setting name="useGeneratedKeys" value="false"/>  
     <!--  指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 隻會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意復雜的結果集(無論是否嵌套)。 -->   
     <!-- 默認值PARTIAL -->  
      <setting name="autoMappingBehavior" value="PARTIAL"/>  
      <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>  
     <!--  配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。默認SIMPLE  -->  
      <setting name="defaultExecutorType" value="SIMPLE"/>  
      <!-- 設置超時時間,它決定驅動等待數據庫響應的秒數。 -->  
      <setting name="defaultStatementTimeout" value="25"/>  
      <setting name="defaultFetchSize" value="100"/>  
      <!-- 允許在嵌套語句中使用分頁(RowBounds)默認值False -->  
      <setting name="safeRowBoundsEnabled" value="false"/>  
      <!-- 是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。  默認false -->  
      <setting name="mapUnderscoreToCamelCase" value="false"/>  
      <!-- MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重復嵌套查詢。  
             默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。  
            若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。  -->  
      <setting name="localCacheScope" value="SESSION"/>  
      <!-- 當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。  -->  
      <setting name="jdbcTypeForNull" value="OTHER"/>  
    <!--   指定哪個對象的方法觸發一次延遲加載。  -->  
      <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>  
    </settings>  

具體解釋

  • 源自官方文檔搬運,如有誤請指正。謝謝!
  • 為瞭提高閱讀性,所以分為瞭4個表格。
設置名 描述 有效 默認值
cacheEnabled 全局性地開啟或關閉所有映射器配置文件中已配置的任何緩存。 true / false true
lazyLoadingEnabled 延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置 fetchType 屬性來覆蓋該項的開關狀態。 true / false true
aggressiveLazyLoading 開啟時,任一方法的調用都會加載該對象的所有延遲加載屬性。 否則,每個延遲加載屬性會按需加載(參考 lazyLoadTriggerMethods)。 true / false false false (在 3.4.1 及之前的版本中默認為 true)
multipleResultSetsEnabled 是否允許單個語句返回多結果集(需要數據庫驅動支持)。 true / false true
useColumnLabel 使用列標簽代替列名。實際表現依賴於數據庫驅動,具體可參考數據庫驅動的相關文檔,或通過對比測試來觀察。 true / false true
useGeneratedKeys 允許 JDBC 支持自動生成主鍵,需要數據庫驅動支持。如果設置為 true,將強制使用自動生成主鍵。盡管一些數據庫驅動不支持此特性,但仍可正常工作(如 Derby)。 true / false false
autoMappingBehavior 指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示關閉自動映射;PARTIAL 隻會自動映射沒有定義嵌套結果映射的字段。 FULL 會自動映射任何復雜的結果集(無論是否嵌套)。 NONE, PARTIAL, FULL PARTIAL
autoMappingUnknownColumnBehavior 指定發現自動映射目標未知列(或未知屬性類型)的行為。NONE: 不做任何反應。WARNING: 輸出警告日志(‘org.apache.ibatis.session.AutoMappingUnknownColumnBehavior’ 的日志等級必須設置為 WARN)。 FAILING: 映射失敗 (拋出 SqlSessionException) NONE, WARNING, FAILING NONE
設置名 描述 有效 默認值
defaultExecutorType 配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(PreparedStatement); BATCH 執行器不僅重用語句還會執行批量更新。 SIMPLE REUSE BATCH SIMPLE
defaultStatementTimeout 設置超時時間,它決定數據庫驅動等待數據庫響應的秒數。 任意正整數 未設置 (null)
defaultFetchSize 為驅動的結果集獲取數量(fetchSize)設置一個建議值。此參數隻可以在查詢設置中被覆蓋。 任意正整數 未設置 (null)
defaultResultSetType 指定語句默認的滾動策略。(新增於 3.5.2) FORWARD_ONLY / SCROLL_SENSITIVE / SCROLL_INSENSITIVE / DEFAULT(等同於未設置) 未設置 (null)
safeRowBoundsEnabled 是否允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設置為 false。 true / false False
safeResultHandlerEnabled 是否允許在嵌套語句中使用結果處理器(ResultHandler)。如果允許使用則設置為 false。 true / false True
mapUnderscoreToCamelCase 是否開啟駝峰命名自動映射,即從經典數據庫列名 A_COLUMN 映射到經典 Java 屬性名 aColumn。 true / false false
localCacheScope MyBatis 利用本地緩存機制(Local Cache)防止循環引用和加速重復的嵌套查詢。 默認值為 SESSION,會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地緩存將僅用於執行語句,對相同 SqlSession 的不同查詢將不會進行緩存。 SESSION /STATEMENT SESSION
jdbcTypeForNull 當沒有為參數指定特定的 JDBC 類型時,空值的默認 JDBC 類型。 某些數據庫驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 JdbcType 常量,常用值:NULL、VARCHAR 或 OTHER。 OTHER
設置名 描述 有效 默認值
lazyLoadTriggerMethods 指定對象的哪些方法觸發一次延遲加載。 用逗號分隔的方法列表 equals,clone,hashCode,toString
defaultScriptingLanguage 指定動態 SQL 生成使用的默認腳本語言。 一個類型別名或全限定類名 org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
defaultEnumTypeHandler 指定 Enum 使用的默認 TypeHandler 。(新增於 3.4.5) 一個類型別名或全限定類名。 org.apache.ibatis.type.EnumTypeHandler
設置名 描述 有效 默認值
callSettersOnNulls 指定當結果集中值為 null 的時候是否調用映射對象的 setter(map 對象時為 put)方法,這在依賴於 Map.keySet() 或 null 值進行初始化時比較有用。註意基本類型(int、boolean 等)是不能設置成 null 的。 true / false false
returnInstanceForEmptyRow 當返回行的所有列都是空時,MyBatis默認返回 null。 當開啟這個設置時,MyBatis會返回一個空實例。 請註意,它也適用於嵌套的結果集(如集合或關聯)。(新增於 3.4.2) true / false false
logPrefix 指定 MyBatis 增加到日志名稱的前綴。 任何字符串 未設置
logImpl 指定 MyBatis 所用日志的具體實現,未指定時將自動查找。 SLF4J /LOG4J/ LOG4J2/JDK_LOGGING/COMMONS_LOGGING /STDOUT_LOGGING/NO_LOGGING 未設置
proxyFactory 指定 Mybatis 創建可延遲加載對象所用到的代理工具。 CGLIB JAVASSIST
vfsImpl 指定 VFS 的實現 自定義 VFS 的實現的類全限定名,以逗號分隔。 未設置
useActualParamName 允許使用方法簽名中的名稱作為語句參數名稱。 為瞭使用該特性,你的項目必須采用 Java 8 編譯,並且加上 -parameters 選項。(新增於 3.4.1) true / false true
configurationFactory 指定一個提供 Configuration 實例的類。 這個被返回的 Configuration 實例用來加載被反序列化對象的延遲加載屬性值。 這個類必須包含一個簽名為static Configuration getConfiguration() 的方法。(新增於 3.2.3) 一個類型別名或完全限定類名。 未設置
shrinkWhitespacesInSql Removes extra whitespace characters from the SQL. Note that this also affects literal strings in SQL. (Since 3.5.5) true / false false

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: