MyBatis全局配置文件
配置properties
可以在全局配置文件中配置properties標簽來進行外部配置
設置屬性的方式有三種
- 在properties的屬性節點resource或url所指定的資源文件中配置
- 在properties的子節點property中配置
- 在構建SqlSessionFactory時通過方法傳入參數
外部配置文件引入
jdbc.driver=com.MySQL.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=123456
<!-- 使用 properties來引入外部配置文件內容-->
<!-- resource 引入類路徑下的資源
url 引入網路或磁盤路徑下的資源
-->
<properties resource="jdbc.properties">
</properties>
<!-- 數據庫配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
property子節點配置
<!-- 也可以使用property子節點來進行配置 -->
<properties resource="jdbc.properties">
<property name="jdbc.password" value="123456"/>
<!-- 啟用默認值特性 -->
<property name="org.Apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
<!-- 修改默認值的分隔符 -->
<property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
</properties>
<!-- 數據庫配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<!-- 可以使用:來為占位符設置默認值,如果沒有讀取到該屬性的值,會使用該默認值
該特性默認關閉,需要配置 <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
如果開啟該特性,默認使用:分隔
可以使用 <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
來修改默認分隔符
-->
<property name="password" value="${jdbc.password?:123456}"/>
</dataSource>
</environment>
</environments>
實例化時方法傳參
public static SqlSessionFactory createFactory(){
// 獲取到mybatis-config.xml配置文件,進而構建SqlSessionFactory
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
Properties props = new Properties();
props.put("jdbc.password","123456");
return new SqlSessionFactoryBuilder().build(is,props);
}
三種方式的順序
- 首先讀取property子節點中指定的屬性
- 再讀取使用resources或url引入的外部配置文件中屬性,并覆蓋之前的同名屬性
- 最后讀取作為方法傳遞的參數,并覆蓋之前的同名屬性
配置settings
進行mybatis的自定義設置
設置名 |
描述 |
有效值 |
默認值 |
cacheEnabled |
全局性地開啟或關閉所有映射器配置文件中已配置的任何緩存。 |
true | false |
true |
lazyLoadingEnabled |
延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置 fetchType 屬性來覆蓋該項的開關狀態。 |
true | false |
false |
aggressiveLazyLoading |
開啟時,任一方法的調用都會加載該對象的所有延遲加載屬性。 否則,每個延遲加載屬性會按需加載(參考 lazyLoadTriggerMethods)。 |
true | false |
false (在 3.4.1 及之前的版本中默認為 true) |
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: 輸出警告日志(' |
NONE, WARNING, FAILING |
NONE |
defaultExecutorType |
配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(PreparedStatement); BATCH 執行器不僅重用語句還會執行批量更新。 |
SIMPLE REUSE BATCH |
SIMPLE |
defaultStatementTimeout |
設置超時時間,它決定數據庫驅動等待數據庫響應的秒數。 |
任意正整數 |
未設置 (null) |
defaultFetchSize |
為驅動的結果集獲取數量(fetchSize)設置一個建議值。此參數只可以在查詢設置中被覆蓋。 |
任意正整數 |
未設置 (null) |
defaultResultSetType |
指定語句默認的滾動策略。(新增于 3.5.2) |
FORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT(等同于未設置) |
未設置 (null) |
safeRowBoundsEnabled |
是否允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設置為 false。 |
true | false |
False |
safeResultHandlerEnabled |
是否允許在嵌套語句中使用結果處理器(ResultHandler)。如果允許使用則設置為 false。 |
true | false |
True |
mapUnderscoreToCamelCase |
是否開啟駝峰命名自動映射,即從經典數據庫列名 A_COLUMN 映射到經典 JAVA 屬性名 aColumn。 |
true | false |
False |
localCacheScope |
MyBatis 利用本地緩存機制(Local Cache)防止循環引用和加速重復的嵌套查詢。 默認值為 SESSION,會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地緩存將僅用于執行語句,對相同 SqlSession 的不同查詢將不會進行緩存。 |
SESSION | STATEMENT |
SESSION |
jdbcTypeForNull |
當沒有為參數指定特定的 JDBC 類型時,空值的默認 JDBC 類型。 某些數據庫驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 |
JdbcType 常量,常用值:NULL、VARCHAR 或 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會返回一個空實例。 請注意,它也適用于嵌套的結果集(如集合或關聯)。(新增于 3.4.2) |
true | false |
false |
logPrefix |
指定 MyBatis 增加到日志名稱的前綴。 |
任何字符串 |
未設置 |
logImpl |
指定 MyBatis 所用日志的具體實現,未指定時將自動查找。 |
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING |
未設置 |
proxyFactory |
指定 Mybatis 創建可延遲加載對象所用到的代理工具。 |
CGLIB | JAVASSIST |
JAVASSIST (MyBatis 3.3 以上) |
vfsImpl |
指定 VFS 的實現 |
自定義 VFS 的實現的類全限定名,以逗號分隔。 |
未設置 |
useActualParamName |
允許使用方法簽名中的名稱作為語句參數名稱。 為了使用該特性,你的項目必須采用 Java 8 編譯,并且加上 -parameters 選項。(新增于 3.4.1) |
true | false |
true |
configurationFactory |
指定一個提供 Configuration 實例的類。 這個被返回的 Configuration 實例用來加載被反序列化對象的延遲加載屬性值。 這個類必須包含一個簽名為static Configuration getConfiguration() 的方法。(新增于 3.2.3) |
一個類型別名或完全限定類名。 |
未設置 |
shrinkWhitespacesInSql |
從SQL中刪除多余的空格字符。請注意,這也會影響SQL中的文字字符串。 (新增于 3.5.5) |
true | false |
false |
defaultSqlProviderType |
Specifies an sql provider class that holds provider method (Since 3.5.6). This class apply to the type(or value) attribute on sql provider annotation(e.g. @SelectProvider), when these attribute was omitted. |
|
|
配置typeAliases類型別名
類型別名可以為java類型設置別名,之后使用全類名時可以使用別名
<typeAliases>
<!-- typeAlias為某個類起別名 -->
<typeAlias type="com.zhanghe.study.mybatis.model.User" alias="User"/>
<!-- 為某個包下所有類批量起別名
默認值為類名首字母小寫
-->
<package name="com.zhanghe.study.mybatis.model"/>
</typeAliases>
也可以在類上使用@Alias注解來設置該類的別名
配置類型處理器typeHandlers
數據庫類型和java類型進行轉換
實現 org.apache.ibatis.type.TypeHandler 接口, 或繼承 org.apache.ibatis.type.BaseTypeHandler, 并且可以將它映射到一個 JDBC 類型
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getString(columnName);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getString(columnIndex);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getString(columnIndex);
}
}
<typeHandlers>
<typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
配置插件plugins
mybatis可以使用插件來在映射語句執行過程中的某一點進行攔截調用,包括
- Executor (update、query、flushStatements、commit、rollback、getTransaction、close、isClose)
- ParameterHandler (getParameterObject、setParameters)
- ResultSetHandler (handleResultSets、handleOutputParameters)
- StatementHandler (prepare、parameterize、batch、update、query)
需要實現Interceptor接口,并指定想要攔截的方法簽名來使用插件
Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
private Properties properties = new Properties();
public Object intercept(Invocation invocation) throws Throwable {
// implement pre processing if need
Object returnObject = invocation.proceed();
// implement post processing if need
return returnObject;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
注意:如果有多個插件攔截相同方法的時候,會按照配置的先后順序來進行包裝代理,在執行時會執行最外層的插件,也就是逆向執行
配置環境environments
mybatis可以配置多個環境,可以連接多個數據庫,但是每個SqlSessionFactory實例只可以選擇一種環境
在構建sqlSessionFactory的時候可以指定選擇創建哪個環境
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
<!-- 環境 default表示默認使用環境 -->
<environments default="development">
<environment id="development">
<!-- 事務管理器有兩種類型
1、JDBC 該配置直接使用了JDBC的提交和回滾,依賴從數據源獲得的連接來管理事務作用域
2、MANAGED 使用容器來管理事務的整個生命周期(spring會使用自帶的管理器,不需要配置mybatis的事務管理器)
-->
<transactionManager type="JDBC"/>
<!-- 數據源有三種類型
1、UNPOOLED 每次請求時打開和關閉連接
額外屬性 - defaultTransactionIsolationLevel 默認的連接事務隔離級別
- defaultNetworkTimeout 等待數據庫操作完成的默認網絡超時時間
2、POOLED 利用連接池的概念將JDBC連接對象組織起來,避免了創建新的連接實例
額外屬性
- poolMaximumactiveConnections 在任意時間可存在的活動連接數,默認10
- poolMaximumIdleConnections 任意時間可能存在的空閑連接數
- poolMaximumCheckoutTime 在被強制返回之前,池中連接被檢出時間,默認20000毫秒
- poolTimeToWait 如果獲取連接花費了很長的時間,連接池會打印狀態日志并重新嘗試獲取一個連接,默認20000毫秒
- poolMaximumLocalBadConnectionTolerance 如果一個線程獲取到一個壞的連接,數據源允許這個線程嘗試重新獲取一個新的連接,
嘗試次數不應該超過poolMaximumIdleConnections與poolMaximumLocalBadConnectionTolerance之和,默認為3
- poolPingQuery 發送到數據庫的偵測查詢,用來檢驗連接是否正常工作 默認 NO PING QUERY SET
- poolPingEnabled 是否啟用偵測查詢 默認false
- poolPingConnectionsNotUsedFor 配置poolPingQuery的頻率(可以設置為和數據庫連接超時時間一樣,避免不必要的偵測) 默認0
3、JNDI 在外部配置數據源,然后一個JNDI上下文數據源引用
額外屬性
- initial_context 用來在InitialContext中尋找上下文
- data_source 引用數據源實例的上下文路徑
-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<!-- 可以使用:來為占位符設置默認值,如果沒有讀取到該屬性的值,會使用該默認值
該特性默認關閉,需要配置 <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
如果開啟該特性,默認使用:分隔
可以使用 <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
來修改默認分隔符
-->
<property name="password" value="${jdbc.password?:123456}"/>
</dataSource>
</environment>
也可以實現
org.apache.ibatis.datasource.DataSourceFactory接口來自定義數據源實現,然后進行配置
配置數據庫廠商標識 databaseIdProvider
mybatis可以根據不同的數據庫廠商執行不同的語句,基于映射語句中的databaseId屬性。mybatis會加載帶有匹配當前數據庫databaseId屬性個所有不帶databaseId屬性的語句。如果同時找到帶有databaseId的不帶databaseId的相同語句,后者會被舍棄
<!-- 數據庫廠商標識 -->
<databaseIdProvider type="DB_VENDOR">
<!-- name為使用DatabaseMetaData#getDatabaseProductName()返回的廠商名稱
value為所設置的別名,使用databaseId時使用別名即可 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
在mapper.xml中可以配置不同數據庫的sql語句
<!-- 查詢數據的方法 -->
<!-- mysql -->
<select id="selectUser" resultType="User" databaseId="mysql">
select * from users where id = #{id}
</select>
<!-- oracle -->
<select id="selectUser" resultType="User" databaseId="oracle">
select * from users where id = #{id}
</select>
可以實現
org.apache.ibatis.mapping.DatabaseIdProvider接口自定義DatabaseIdProvider
配置映射器mappers
將寫好的sql映射文件(mapper.xml)注冊到全局配置文件中
<!-- mapper配置 -->
<mappers>
<!-- resource 引入類路徑下的資源 -->
<mapper resource="mapper/UserMapper.xml"/>
<!-- url 引入網絡或者磁盤路徑下的sql映射文件 -->
<mapper url=""/>
<!-- class 基于注解的方式,注冊類文件 -->
<mapper class="com.zhanghe.study.mybatis.mapper.UserMapper"/>
<!-- 批量注冊 注冊整個包下的-->
<package name="com.zhanghe.study.mybatis.mapper"/>
</mappers>