MyBatis XML屬性配置

一、MyBatis 的配置文件結構java

配置文件的結構以下:sql

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

 properties數據庫

  屬性配置,能夠經過幾個不一樣方式進行配置,Java 屬性文件中配置,亦可經過 properties 元素的子元素來傳遞。apache

若是屬性在不僅一個地方進行了配置,那麼 MyBatis 將按照下面的順序來加載:緩存

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

例如如下的配置中:session

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

 其中的屬性就能夠在整個配置文件中被用來替換須要動態配置的屬性值。mybatis

<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’ 的值會經過變量值傳入進來,因此最終使用的會是傳入的變量值。app

settingsdom

  settings中的參數及相關說明:ide

設置參數 描述 有效值 默認值
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>
相關文章
相關標籤/搜索