一、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 將按照下面的順序來加載:緩存
例如如下的配置中: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, 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 | 數據庫兼容的 NUMERIC 或 BYTE |
ShortTypeHandler | java.lang.Short, short | 數據庫兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler | java.lang.Integer, int | 數據庫兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long, long | 數據庫兼容的 NUMERIC 或 LONG INTEGER |
FloatTypeHandler | java.lang.Float, float | 數據庫兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler | java.lang.Double, double | 數據庫兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | 數據庫兼容的 NUMERIC 或 DECIMAL |
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 | 任何兼容的 NUMERIC 或 DOUBLE 類型,存儲枚舉的索引(而不是名稱)。 |
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 容許使用插件來攔截的方法調用包括:
只需實現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>