一、properties配置java
<properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password" value="F2Fa3!33TYyg"/> </properties>
用法一:數據庫
${username}和${password}被替換成dev_user和F2Fa3!33TYygapache
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>
用法二:mybatis
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props); 或 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
二、若是屬性在不僅一個地方進行了配置,那麼 MyBatis 將按照下面的順序來加載:app
(1)在 properties 元素體內指定的屬性首先被讀取。dom
(2)而後根據 properties 元素中的 resource 屬性讀取類路徑下屬性文件或根據 url 屬性指定的路徑讀取屬性文件,並覆蓋已讀取的同名屬性。ui
(3)最後讀取做爲方法參數傳遞的屬性,並覆蓋已讀取的同名屬性。this
三、爲佔位符指定一個默認值url
<dataSource type="POOLED"> <property name="username" value="${username:ut_user}"/> <!-- If 'username' property not present, username become 'ut_user' --> </dataSource>
添加一個指定的屬性來開啓這個特性插件
<properties resource="org/mybatis/example/config.properties"> <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- Enable this feature --> </properties>
四、使用三元運算符
<properties resource="org/mybatis/example/config.properties"> <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- Change default value of separator --> </properties> <dataSource type="POOLED"> <property name="username" value="${db:username?:ut_user}"/> </dataSource>
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" 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>
類型別名是爲 Java 類型設置一個短的名字。它只和 XML 配置有關,存在的意義僅在於用來減小類徹底限定名的冗餘。例如:
<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>
指定一個包名:
<typeAliases> <package name="domain.blog"/> </typeAliases>
一、不管是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,仍是從結果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型。
二、你能夠重寫類型處理器或建立你本身的類型處理器來處理不支持的或非標準的類型。具體作法爲:實現 org.apache.ibatis.type.TypeHandler 接口, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler, 而後能夠選擇性地將它映射到一個 JDBC 類型。
三、MyBatis 不會窺探數據庫元信息來決定使用哪一種類型,因此你必須在參數和結果映射中指明那是 VARCHAR 類型的字段, 以使其可以綁定到正確的類型處理器上。
(1)經過類型處理器的泛型,MyBatis 能夠得知該類型處理器處理的 Java 類型,不過這種行爲能夠經過兩種方法改變:在類型處理器的配置元素(typeHandler element)上增長一個 javaType 屬性(好比:javaType="String");在類型處理器的類上(TypeHandler class)增長一個 @MappedTypes 註解來指定與其關聯的 Java 類型列表。 若是在 javaType 屬性中也同時指定,則註解方式將被忽略。
(2)能夠經過兩種方式來指定被關聯的 JDBC 類型:
在類型處理器的配置元素上增長一個 jdbcType 屬性(好比:jdbcType="VARCHAR"); 在類型處理器的類上(TypeHandler class)增長一個 @MappedJdbcTypes 註解來指定與其關聯的 JDBC 類型列表。 若是在 jdbcType 屬性中也同時指定,則註解方式將被忽略。
(3)讓 MyBatis 爲你查找類型處理器:
<typeHandlers> <package name="org.mybatis.example"/> </typeHandlers>
<!-- mybatis-config.xml --> <typeHandlers> <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/> </typeHandlers>
// ExampleObjectFactory.java public class ExampleObjectFactory extends DefaultObjectFactory { public Object create(Class type) { return super.create(type); } public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) { return super.create(type, constructorArgTypes, constructorArgs); } public void setProperties(Properties properties) { super.setProperties(properties); } public <T> boolean isCollection(Class<T> type) { return Collection.class.isAssignableFrom(type); }}
<!-- mybatis-config.xml --> <objectFactory type="org.mybatis.example.ExampleObjectFactory"> <property name="someProperty" value="100"/> </objectFactory>
MyBatis 容許你在已映射語句執行過程當中的某一點進行攔截調用。
// 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) { } } <!-- mybatis-config.xml --> <plugins> <plugin interceptor="org.mybatis.example.ExamplePlugin"> <property name="someProperty" value="100"/> </plugin> </plugins>
一、每一個數據庫對應一個 SqlSessionFactory 實例
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties); 忽略環境參數: SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
二、數據源
UNPOOLED
POOLED
JNDI
告訴 MyBatis 到哪裏去找映射文件
<!-- 使用相對於類路徑的資源引用 --> <mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers> <!-- 使用徹底限定資源定位符(URL) --> <mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <mapper url="file:///var/mappers/BlogMapper.xml"/> <mapper url="file:///var/mappers/PostMapper.xml"/> </mappers> <!-- 使用映射器接口實現類的徹底限定類名 --> <mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/> </mappers> <!-- 將包內的映射器接口實現所有註冊爲映射器 --> <mappers> <package name="org.mybatis.builder"/> </mappers>