configuration —— 根元素 html
environment java
transactionManager —— 事務管理器web
dataSource —— 數據源sql
properties —— 定義配置外在化數據庫
settings —— 一些全局性的配置緩存
typeAliases —— 爲一些類定義別名服務器
typeHandlers —— 定義類型處理,也就是定義java類型與數據庫中的數據類型之間的轉換關係session
objectFactorymybatis
plugins —— Mybatis的插件,插件能夠修改Mybatis內部的運行規則app
environments —— 配置Mybatis的環境
databaseIdProvider
mappers —— 指定映射文件或映射類
<!--樣例--><properties resource="org/mybatis/example/config.properties"><property name="username" value="dev_user"/><property name="password" value="F2Fa3!33TYyg"/></properties>
配置外在化的屬性還能夠經過SqlSessionFactoryBuilder.build()方法提供,如:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props);
配置外在化的優先級是 build方法->resource屬性指定的文件->property元素
設置參數 | 描述 | 有效值 | 默認值 |
---|---|---|---|
cacheEnabled | 這個配置使全局的映射器啓用或禁用 緩存。 | true | false | true |
lazyLoadingEnabled | 全局啓用或禁用延遲加載。當禁用時, 全部關聯對象都會即時加載。 | true | false | true |
aggressiveLazyLoading | 當啓用時, 有延遲加載屬性的對象在被 調用時將會徹底加載任意屬性。不然, 每種屬性將會按須要加載。 | true | false | true |
multipleResultSetsEnabled | 容許或不容許多種結果集從一個單獨 的語句中返回(須要適合的驅動) | true | false | true |
useColumnLabel | 使用列標籤代替列名。 不一樣的驅動在這 方便表現不一樣。 參考驅動文檔或充分測 試兩種方法來決定所使用的驅動。 | true | false | true |
useGeneratedKeys | 容許 JDBC 支持生成的鍵。 須要適合的 驅動。 若是設置爲 true 則這個設置強制 生成的鍵被使用, 儘管一些驅動拒絕兼 容但仍然有效(好比 Derby) | true | false | False |
autoMappingBehavior | 指定 MyBatis 如何自動映射列到字段/ 屬性。PARTIAL 只會自動映射簡單, 沒有嵌套的結果。FULL 會自動映射任 意複雜的結果(嵌套的或其餘狀況) 。 | NONE, PARTIAL, FULL | PARTIAL |
defaultExecutorType | 配置默認的執行器。SIMPLE 執行器沒 有什麼特別之處。REUSE 執行器重用 預處理語句。BATCH 執行器重用語句 和批量更新 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 設置超時時間, 它決定驅動等待一個數 據庫響應的時間。 | Any positive integer | Not Set (null) |
safeRowBoundsEnabled | Allows using RowBounds on nested statements. | true | false | False |
mapUnderscoreToCamelCase | Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn. | true | false | False |
localCacheScope | MyBatis uses local cache to prevent circular references and speed up repeated nested queries. By default (SESSION) all queries executed during a session are cached. If localCacheScope=STATEMENT local session will be used just for statement execution, no data will be shared between two different calls to the same SqlSession. | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | Specifies the JDBC type for null values when no specific JDBC type was provided for the parameter. Some drivers require specifying the column JDBC type but others work with generic values like NULL, VARCHAR or OTHER. | JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER | OTHER |
lazyLoadTriggerMethods | Specifies which Object's methods trigger a lazy load | A method name list separated by commas | equals,clone,hashCode,toString |
<typeAliases><typeAlias alias="Author" type="domain.blog.Author"/><typeAlias alias="Blog" type="domain.blog.Blog"/><typeAlias alias="Comment" type="domain.blog.Comment"/><typeAlias alias="Post" type="domain.blog.Post"/><typeAlias alias="Section" type="domain.blog.Section"/><typeAlias alias="Tag" type="domain.blog.Tag"/></typeAliases>
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 |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
每當MyBatis 設置參數到PreparedStatement 或者從ResultSet 結果集中取得值時,就會使用TypeHandler 來處理數據庫類型與java 類型之間轉換。
實現TypeHandler接口
View Code
在配置文件中聲明自定義的TypeHandler
View Code
類型處理器 | Java 類型 | JDBC 類型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean, boolean | 任何兼容的布爾值 |
ByteTypeHandler | java.lang.Byte, byte | 任何兼容的數字或字節類型 |
ShortTypeHandler | java.lang.Short, short | 任何兼容的數字或短整型 |
IntegerTypeHandler | java.lang.Integer, int | 任何兼容的數字和整型 |
LongTypeHandler | java.lang.Long, long | 任何兼容的數字或長整型 |
FloatTypeHandler | java.lang.Float, float | 任何兼容的數字或單精度浮點型 |
DoubleTypeHandler | java.lang.Double, double | 任何兼容的數字或雙精度浮點型 |
BigDecimalTypeHandler | java.math.BigDecimal | 任何兼容的數字或十進制小數類型 |
StringTypeHandler | java.lang.String | CHAR 和 VARCHAR 類型 |
ClobTypeHandler | java.lang.String | CLOB 和 LONGVARCHAR 類型 |
NStringTypeHandler | java.lang.String | NVARCHAR 和 NCHAR 類型 |
NClobTypeHandler | java.lang.String | NCLOB 類型 |
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 | 其餘或未指定類型 |
EnumTypeHandler | Enumeration Type | VARCHAR-任何兼容的字符串類型, 做爲代碼存儲(而不是索引) |
EnumOrdinalTypeHandler | Enumeration Type | Any compatible NUMERIC or DOUBLE, as the position is stored (not the code itself). |
下面演示瞭如何自定義ObjectFactory
1.繼承DefaultObjectFactory
View Code
// ExampleObjectFactory.javapublic class ExampleObjectFactory extends DefaultObjectFactory {public Object create(Class type) {return super.create(type); }public Object create(
2.在配置文件中配置自定義的ObjectFactory
View Code
// MapperConfig.xml<objectFactory type="org.mybatis.example.ExampleObjectFactory"><property name="someProperty" value="100"/></objectFactory>
MyBatis 容許您在映射語句執行的某些點攔截方法調用。默認狀況下,MyBatis 容許插件(plugins)攔截下面的方法:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
下面是自定義plugin示例:
實現Interceptor接口,並用註解聲明要攔截的方法
// ExamplePlugin.java@Intercepts({@Signature( type= Executor.class, method = "update", args = {MappedStatement.class,Object.class})})public class ExamplePlugin implements Interceptor {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) { } }
在配置文件中聲明插件
View Code
能夠配置多個運行環境,可是每一個SqlSessionFactory 實例只能選擇一個運行環境。
View Code
<environments default="development"><environment id="development"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>
MyBatis 有兩種事務管理類型(即type=」[JDBC|MANAGED]」):
JDBC – 這個配置直接簡單使用了 JDBC 的提交和回滾設置。 它依賴於從數據源得 到的鏈接來管理事務範圍。
MANAGED – 這個配置幾乎沒作什麼。它歷來不提交或回滾一個鏈接。而它會讓 容器來管理事務的整個生命週期(好比 Spring 或 JEE 應用服務器的上下文) 默認 狀況下它會關閉鏈接。 然而一些容器並不但願這樣, 所以若是你須要從鏈接中中止 它,將 closeConnection 屬性設置爲 false。例如:
<transactionManager type="MANAGED"><property name="closeConnection" value="false"/></transactionManager>
自定義事務管理器:
實現TranscactionFactory,它的接口定義以下:
View Code
實現TransactionFactory,它的接口定義以下:
public interface Transaction { Connection getConnection();void commit() throws SQLException;void rollback() throws SQLException;void close() throws SQLException; }
dataSource 元素使用標準的JDBC 數據源接口來配置JDBC 鏈接對象源。
MyBatis 內置了三種數據源類型:
UNPOOLED – 這個數據源的實現是每次被請求時簡單打開和關閉鏈接。它有一點慢, 這是對簡單應用程序的一個很好的選擇, 由於它不須要及時的可用鏈接。 不一樣的數據庫對這 個的表現也是不同的, 因此對某些數據庫來講配置數據源並不重要, 這個配置也是閒置的。 UNPOOLED 類型的數據源僅僅用來配置如下 5 種屬性:
driver – 這是 JDBC 驅動的 Java 類的徹底限定名(若是你的驅動包含,它也不是 數據源類)。
url – 這是數據庫的 JDBC URL 地址。
username – 登陸數據庫的用戶名。
password – 登陸數據庫的密碼。
defaultTransactionIsolationLevel – 默認的鏈接事務隔離級別。
做爲可選項,你能夠傳遞數據庫驅動的屬性。要這樣作,屬性的前綴是以「driver.」開 頭的,例如:
driver.encoding=UTF8
這 樣 就 會 傳 遞 以 值 「 UTF8 」 來 傳 遞 屬 性 「 encoding 」, 它 是 通 過 DriverManager.getConnection(url,driverProperties)方法傳遞給數據庫驅動。
POOLED – 這是 JDBC 鏈接對象的數據源鏈接池的實現,用來避免建立新的鏈接實例 時必要的初始鏈接和認證時間。這是一種當前 Web 應用程序用來快速響應請求很流行的方 法。
除了上述(UNPOOLED)的屬性以外,還有不少屬性能夠用來配置 POOLED 數據源:
poolMaximumActiveConnections – 在任意時間存在的活動(也就是正在使用)連 接的數量。默認值:10
poolMaximumIdleConnections – 任意時間存在的空閒鏈接數。
poolMaximumCheckoutTime – 在被強制返回以前,池中鏈接被檢查的時間。默認 值:20000 毫秒(也就是 20 秒)
poolTimeToWait – 這是給鏈接池一個打印日誌狀態機會的低層次設置,還有從新 嘗試得到鏈接, 這些狀況下每每須要很長時間 爲了不鏈接池沒有配置時靜默失 敗)。默認值:20000 毫秒(也就是 20 秒)
poolPingQuery – 發送到數據的偵測查詢,用來驗證鏈接是否正常工做,而且準備 接受請求。默認是「NO PING QUERY SET」 ,這會引發許多數據庫驅動鏈接由一 個錯誤信息而致使失敗。
poolPingEnabled – 這是開啓或禁用偵測查詢。若是開啓,你必須用一個合法的 SQL 語句(最好是很快速的)設置 poolPingQuery 屬性。默認值:false。
poolPingConnectionsNotUsedFor – 這是用來配置 poolPingQuery 屢次時間被用一次。 這能夠被設置匹配標準的數據庫鏈接超時時間, 來避免沒必要要的偵測。 默認值: 0(也就是全部鏈接每一時刻都被偵測-但僅僅當 poolPingEnabled 爲 true 時適用)。
JNDI – 這個數據源的實現是爲了使用如 Spring 或應用服務器這類的容器, 容器能夠集 中或在外部配置數據源,而後放置一個 JNDI 上下文的引用。這個數據源配置只須要兩個屬 性:
initial_context – 這 個 屬 性 用 來 從 初 始 上 下 文 中 尋 找 環 境 ( 也 就 是 initialContext.lookup(initial——context) 。這是個可選屬性,若是被忽略,那麼 data_source 屬性將會直接以 initialContext 爲背景再次尋找。
data_source – 這是引用數據源實例位置的上下文的路徑。它會以由 initial_context 查詢返回的環境爲背景來查找,若是 initial_context 沒有返回結果時,直接以初始 上下文爲環境來查找。
和其餘數據源配置類似, 它也能夠經過名爲 「env.」 的前綴直接向初始上下文發送屬性。 好比:
env.encoding=UTF8
在初始化以後,這就會以值「UTF8」向初始上下文的構造方法傳遞名爲「encoding」 的屬性。
既然 MyBatis 的行爲已經由上述元素配置完了,咱們如今就要定義 SQL 映射語句了。 可是, 首先咱們須要告訴 MyBatis 到哪裏去找到這些語句。 Java 在這方面沒有提供一個很好 的方法, 因此最佳的方式是告訴 MyBatis 到哪裏去找映射文件。 你可使用相對於類路徑的 資源引用,或者字符表示,或 url 引用的徹底限定名(包括 file:///URLs) 。例如:
<!-- Using classpath relative resources --><mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/></mappers>
<!-- Using url fully qualified paths --><mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <mapper url="file:///var/mappers/BlogMapper.xml"/> <mapper url="file:///var/mappers/PostMapper.xml"/></mappers>
<!-- Using mapper interface classes --><mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/></mappers>
<!-- Register all interfaces in a package as mappers --><mappers> <package name="org.mybatis.builder"/></mappers>