MyBatis XML屬性配置


1、MyBatis 的配置文件結構

配置文件的結構如下:

<configuration>
    <!-- 屬性 -->
    <properties></properties />
    <!-- 設置 -->
    <settings></settings />
    <!-- 類型別名 -->
    <typeAliases></typeAliases />
    <!-- 類型處理器 -->
    <typeHandlers></typeHandlers />
    <!-- 對象工廠 -->
    <objectFactory></objectFactory />
    <!-- 插件 -->
    <plugins> </plugins>
    <!-- 環境 -->
    <environment></environment>
    <!-- 數據庫廠商標識 -->
    <databaseIdProvider></databaseIdProvider>
    <!-- 映射器 -->
    <mappers></mappers>
</configuration>

 properties

  屬性配置,可以通過幾個不同方式進行配置,Java 屬性文件中配置,亦可通過 properties 元素的子元素來傳遞。

如果屬性在不只一個地方進行了配置,那么 MyBatis 將按照下面的順序來加載:

  • 在 properties 元素體內指定的屬性首先被讀取。
  • 然后根據 properties 元素中的 resource 屬性讀取類路徑下屬性文件或根據 url 屬性指定的路徑讀取屬性文件,並覆蓋已讀取的同名屬性。
  • 最后讀取作為方法參數傳遞的屬性,並覆蓋已讀取的同名屬性。 

例如以下的配置中:

<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="dev_user"/>
  <property name="password" value="F2Fa3!33TYyg"/>
</properties>

 其中的屬性就可以在整個配置文件中被用來替換需要動態配置的屬性值。

<dataSource type="POOLED">
  <property name="driver" value="${driver}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</dataSource>

‘uername’和‘password’ 這兩個值最開始通過property屬性值進行傳入,接下來由配置文件 config.properties 中如果也有這兩值,那么‘uername’和‘password’ 的值將會被配置文件中的值覆蓋,再接下來的配置中‘uername’和‘password’ 的值會通過變量值傳入進來,所以最終使用的會是傳入的變量值。

settings

  settings中的參數及相關說明:

設置參數 描述 有效值 默認值
cacheEnabled 全局地開啟或關閉配置文件中的所有映射器已經配置的任何緩存。 true | false true
lazyLoadingEnabled 延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態。 true | false false
aggressiveLazyLoading 當開啟時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性會按需加載(參考lazyLoadTriggerMethods). true | false false (true in ≤3.4.1)
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 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。 SIMPLE REUSE BATCH SIMPLE
defaultStatementTimeout 設置超時時間,它決定驅動等待數據庫響應的秒數。 任意正整數 Not Set (null)
defaultFetchSize 為驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只可以在查詢設置中被覆蓋。 任意正整數 Not Set (null)
safeRowBoundsEnabled 允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設置為false。 true | false False
safeResultHandlerEnabled 允許在嵌套語句中使用分頁(ResultHandler)。如果允許使用則設置為false。 true | false True
mapUnderscoreToCamelCase 是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。 true | false False
localCacheScope MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重復嵌套查詢。 默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。 SESSION | STATEMENT SESSION
jdbcTypeForNull 當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 JdbcType 常量. 大多都為: NULL, VARCHAR and 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會返回一個空實例。 請注意,它也適用於嵌套的結果集 (i.e. collectioin and association)。(從3.4.2開始) true | false false
logPrefix 指定 MyBatis 增加到日志名稱的前綴。 任何字符串 Not set
logImpl 指定 MyBatis 所用日志的具體實現,未指定時將自動查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING Not set
proxyFactory 指定 Mybatis 創建具有延遲加載能力的對象所用到的代理工具。 CGLIB | JAVASSIST JAVASSIST (MyBatis 3.3 or above)
vfsImpl 指定VFS的實現 自定義VFS的實現的類全限定名,以逗號分隔。 Not set
useActualParamName 允許使用方法簽名中的名稱作為語句參數名稱。 為了使用該特性,你的工程必須采用Java 8編譯,並且加上-parameters選項。(從3.4.1開始) true | false true
configurationFactory 指定一個提供Configuration實例的類。 這個被返回的Configuration實例用來加載被反序列化對象的懶加載屬性值。 這個類必須包含一個簽名方法static Configuration getConfiguration(). (從 3.2.3 版本開始) 類型別名或者全類名. Not set 

常用配置如下:

<settings>
        <!-- 這個配置使全局的映射器啟用或禁用 緩存 -->
        <setting name="cacheEnabled" value="true" />
        <!-- 全局啟用或禁用延遲加載。當禁用時, 所有關聯對象都會即時加載 -->
        <setting name="lazyLoadingEnabled" value="true" />
        <!-- 允許或不允許多種結果集從一個單獨 的語句中返回(需要適合的驅動) -->
        <setting name="multipleResultSetsEnabled" value="true" />
        <!-- 使用列標簽代替列名。 不同的驅動在這 方便表現不同。 參考驅動文檔或充分測 試兩種方法來決定所使用的驅動 -->
        <setting name="useColumnLabel" value="true" />
        <!-- 允許 JDBC 支持生成的鍵。 需要適合的 驅動。 如果設置為 true 則這個設置強制 生成的鍵被使用, 盡管一些驅動拒絕兼 容但仍然有效(比如 
            Derby) -->
        <setting name="useGeneratedKeys" value="false" />
        <!-- 配置默認的執行器。SIMPLE 執行器沒 有什么特別之處。REUSE 執行器重用 預處理語句。BATCH 執行器重用語句 和批量更新 -->
        <setting name="defaultExecutorType" value="SIMPLE" />
        <!-- 設置超時時間, 它決定驅動等待一個數 據庫響應的時間 -->
        <setting name="defaultStatementTimeout" value="100" />
        <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>

typeAliases

  類型別名是為 Java 類型設置一個短的名字。它只和 XML 配置有關,存在的意義僅在於用來減少類完全限定名的冗余。有兩種方法來指定:

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
  <typeAlias alias="Comment" type="domain.blog.Comment"/>
</typeAliases>

  也可以指定一個包名,MyBatis 會在包名下面搜索需要的 Java Bean對象。

<typeAliases>
    <!--掃描指定包下的所有實體類-->
    <package name="com.gw.facade.account.entity"/>
    <package name="com.gw.facade.account.vo"/>
</typeAliases>

  一般在沒有注解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。 比如 com.gw.facade.account.entity.Account 的別名為 account;若有注解,則別名為其注解。下面是由注解的情況

@Alias("account")
public class Account {
    ...
}

typeHandlers

  無論是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,還是從結果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型。下表描述了一些默認的類型處理器。

類型處理器 Java 類型 JDBC 類型
BooleanTypeHandler java.lang.Boolean, boolean 數據庫兼容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte 數據庫兼容的 NUMERICBYTE
ShortTypeHandler java.lang.Short, short 數據庫兼容的 NUMERICSHORT INTEGER
IntegerTypeHandler java.lang.Integer, int 數據庫兼容的 NUMERICINTEGER
LongTypeHandler java.lang.Long, long 數據庫兼容的 NUMERICLONG INTEGER
FloatTypeHandler java.lang.Float, float 數據庫兼容的 NUMERICFLOAT
DoubleTypeHandler java.lang.Double, double 數據庫兼容的 NUMERICDOUBLE
BigDecimalTypeHandler java.math.BigDecimal 數據庫兼容的 NUMERICDECIMAL
StringTypeHandler java.lang.String CHAR, VARCHAR
ClobReaderTypeHandler java.io.Reader -
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
NStringTypeHandler java.lang.String NVARCHAR, NCHAR
NClobTypeHandler java.lang.String NCLOB
BlobInputStreamTypeHandler java.io.InputStream -
ByteArrayTypeHandler byte[] 數據庫兼容的字節流類型
BlobTypeHandler byte[] BLOB, LONGVARBINARY
DateTypeHandler java.util.Date TIMESTAMP
DateOnlyTypeHandler java.util.Date DATE
TimeOnlyTypeHandler java.util.Date TIME
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP
SqlDateTypeHandler java.sql.Date DATE
SqlTimeTypeHandler java.sql.Time TIME
ObjectTypeHandler Any OTHER 或未指定類型
EnumTypeHandler Enumeration Type VARCHAR-任何兼容的字符串類型,存儲枚舉的名稱(而不是索引)
EnumOrdinalTypeHandler Enumeration Type 任何兼容的 NUMERICDOUBLE 類型,存儲枚舉的索引(而不是名稱)。
InstantTypeHandler java.time.Instant TIMESTAMP
LocalDateTimeTypeHandler java.time.LocalDateTime TIMESTAMP
LocalDateTypeHandler java.time.LocalDate DATE
LocalTimeTypeHandler java.time.LocalTime TIME
OffsetDateTimeTypeHandler java.time.OffsetDateTime TIMESTAMP
OffsetTimeTypeHandler java.time.OffsetTime TIME
ZonedDateTimeTypeHandler java.time.ZonedDateTime TIMESTAMP
YearTypeHandler java.time.Year INTEGER
MonthTypeHandler java.time.Month INTEGER
YearMonthTypeHandler java.time.YearMonth VARCHAR or LONGVARCHAR
JapaneseDateTypeHandler java.time.chrono.JapaneseDate DATE

  可以重寫類型處理器或創建你自己的類型處理器來處理不支持的或非標准的類型。 具體做法為:實現 org.apache.ibatis.type.TypeHandler 接口, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler, 然后可以選擇性地將它映射到一個 JDBC 類型。

@MappedTypes(Boolean.class)
@MappedJdbcTypes(JdbcType.SMALLINT)
public class BooleanTypeHandler implements TypeHandler<Boolean>{
    public Object getResult(ResultSet arg0, int arg1) throws SQLException {
        int num = arg0.getInt(arg1);
        Boolean rt = Boolean.FALSE;
        if (num == 1){
            rt = Boolean.TRUE;
        }
        return rt; 
    }
    public Object getResult(ResultSet arg0, String arg1) throws SQLException {
        int num = arg0.getInt(arg1);
        Boolean rt = Boolean.FALSE;
        if (num == 1){
            rt = Boolean.TRUE;
        }
        return rt;
    }
    public Object getResult(CallableStatement arg0, int arg1)
            throws SQLException {
        Boolean b = arg0.getBoolean(arg1);
        return b == true ? 1 : 0;
    }
    public void setParameter(PreparedStatement arg0, int arg1, Boolean arg2,JdbcType arg3) throws SQLException {
        Boolean b = (Boolean) arg2;
        int value = (Boolean) b == true ? 1 : 0;
        arg0.setInt(arg1, value);
    }
}

  上面代碼中可以按照我們的要求將java的Boolean和jdbc的SMALLINT進行轉換,對於這兩種數據類型的聲明有兩種方式:一種是如上在類加上注解進行聲明;另外也可以在typeHandler類聲明中說明,如下圖。

    <typeHandlers>
        <typeHandler javaType="Boolean" jdbcType="SMALLINT" handler="com.gw.common.core.mybatis.BooleanTypeHandler" />
    </typeHandlers>

 插件(plugins)

  MyBatis 允許你在已映射語句執行過程中的某一點進行攔截調用。默認情況下,MyBatis 允許使用插件來攔截的方法調用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query) 

  只需實現Interceptor接口同時指明需要攔截的方法簽名,並在mybatis的配置文件中聲明該簽名:

@Intercepts({ @Signature
        (type = Executor.class,
        method = "query",
        args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }
        )
})
public class ExecutorInterceptor extends AbstractInterceptor {

    public Object intercept(Invocation invocation) throws Throwable {
        return invocation.proceed();
    }
    
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    public void setProperties(Properties properties) {
        
    }
}
<!-- mybatis-config.xml配置 -->
<plugins>  
        <plugin interceptor="com.gw.common.core.mybatis.interceptor.ExecutorInterceptor">  
        </plugin>  
</plugins> 

上面的插件將會攔截在Executor實例中所有的‘query’方法。

映射器(mapper)

配置真正執行的SQL語句文件地址,通過<mappers>標簽指定路徑

<mappers>
        <mapper resource="mybatis/mapper/PaymentRecord.Mapper.xml" />
        <mapper resource="mybatis/mapper/TradeImportRecord.Mapper.xml" />
        <mapper resource="mybatis/mapper/RefundImportRecord.Mapper.xml" />
</mappers>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM