完整配置
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="application.properties"/>
<!-- 參數(shù)設(shè)置 -->
<settings>
<!-- 這個配置使全局的映射器啟用或禁用緩存 -->
<setting name="cacheEnabled" value="true" />
<!-- 全局啟用或禁用延遲加載细溅。當(dāng)禁用時,所有關(guān)聯(lián)對象都會即時加載 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 當(dāng)啟用時牛郑,有延遲加載屬性的對象在被調(diào)用時將會完全加載任意屬性羔挡。否則纵顾,每種屬性將會按需要加載 -->
<setting name="aggressiveLazyLoading" value="true" />
<!-- 允許或不允許多種結(jié)果集從一個單獨的語句中返回(需要適合的驅(qū)動) -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 使用列標(biāo)簽代替列名伍茄。不同的驅(qū)動在這方便表現(xiàn)不同。參考驅(qū)動文檔或充分測試兩種方法來決定所使用的驅(qū)動 -->
<setting name="useColumnLabel" value="true" />
<!-- 允許JDBC支持生成的鍵施逾。需要適合的驅(qū)動敷矫。如果設(shè)置為true則這個設(shè)置強(qiáng)制生成的鍵被使用,盡管一些驅(qū)動拒絕兼容但仍然有效(比如Derby) -->
<setting name="useGeneratedKeys" value="true" />
<!-- 指定MyBatis如何自動映射列到字段/屬性汉额。PARTIAL只會自動映射簡單曹仗,沒有嵌套的結(jié)果。FULL會自動映射任意復(fù)雜的結(jié)果(嵌套的或其他情況) -->
<setting name="autoMappingBehavior" value="PARTIAL" />
<!--當(dāng)檢測出未知列(或未知屬性)時蠕搜,如何處理怎茫,默認(rèn)情況下沒有任何提示,這在測試的時候很不方便妓灌,不容易找到錯誤轨蛤。 NONE : 不做任何處理
(默認(rèn)值) WARNING : 警告日志形式的詳細(xì)信息 FAILING : 映射失敗,拋出異常和詳細(xì)信息 -->
<setting name="autoMappingUnknownColumnBehavior" value="WARNING" />
<!-- 配置默認(rèn)的執(zhí)行器虫埂。SIMPLE執(zhí)行器沒有什么特別之處祥山。REUSE執(zhí)行器重用預(yù)處理語句。BATCH執(zhí)行器重用語句和批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- 設(shè)置超時時間掉伏,它決定驅(qū)動等待一個數(shù)據(jù)庫響應(yīng)的時間 -->
<setting name="defaultStatementTimeout" value="25000" />
<!--設(shè)置查詢返回值數(shù)量缝呕,可以被查詢數(shù)值覆蓋 -->
<setting name="defaultFetchSize" value="100" />
<!-- 允許在嵌套語句中使用分頁 -->
<setting name="safeRowBoundsEnabled" value="false" />
<!--是否開啟自動駝峰命名規(guī)則(camel case)映射澳窑,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 到經(jīng)典 Java 屬性名 aColumn
的類似映射。 -->
<setting name="mapUnderscoreToCamelCase" value="false" />
<!--MyBatis 利用本地緩存機(jī)制(Local Cache)防止循環(huán)引用(circular references)和加速重復(fù)嵌套查詢供常。
默認(rèn)值為 SESSION摊聋,這種情況下會緩存一個會話中執(zhí)行的所有查詢。 若設(shè)置值為 STATEMENT栈暇,本地會話僅用在語句執(zhí)行上栗精,對相同 SqlSession
的不同調(diào)用將不會共享數(shù)據(jù)。 -->
<setting name="localCacheScope" value="SESSION" />
<!-- 當(dāng)沒有為參數(shù)提供特定的 JDBC 類型時瞻鹏,為空值指定 JDBC 類型。 某些驅(qū)動需要指定列的 JDBC 類型鹿寨,多數(shù)情況直接用一般類型即可新博,比如
NULL、VARCHAR OTHER脚草。 -->
<setting name="jdbcTypeForNull" value="OTHER" />
<!-- 指定哪個對象的方法觸發(fā)一次延遲加載赫悄。 -->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
</settings>
<!-- 別名定義 -->
<!--<typeAliases>
<typeAlias alias="pageAccessURL" type="com.lgm.mybatis.model.PageAccessURL" />
</typeAliases>-->
<!--自定義類型處理器 -->
<typeHandlers>
<!-- <typeHandler handler="com.xhm.util.BooleanTypeHandlder" /> -->
<!--掃描整個包下的自定義類型處理器 -->
<package name="com.xiaolyuh.util" />
</typeHandlers>
<!--plugins插件之 分頁攔截器 -->
<!-- <plugins>
<plugin interceptor="com.xhm.util.PageInterceptor"></plugin>
</plugins>-->
<!--配置environment環(huán)境 -->
<environments default="development1">
<!-- 環(huán)境配置1,每個SqlSessionFactory對應(yīng)一個環(huán)境 -->
<environment id="development1">
<!-- 事務(wù)配置 type= JDBC馏慨、MANAGED 1.JDBC:這個配置直接簡單使用了JDBC的提交和回滾設(shè)置埂淮。它依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)范圍。
2.MANAGED:這個配置幾乎沒做什么写隶。它從來不提交或回滾一個連接倔撞。而它會讓容器來管理事務(wù)的整個生命周期(比如Spring或JEE應(yīng)用服務(wù)器的上下文)。
默認(rèn)情況下它會關(guān)閉連接慕趴。然而一些容器并不希望這樣痪蝇,因此如果你需要從連接中停止它,將closeConnection屬性設(shè)置為false -->
<transactionManager type="JDBC" />
<!-- <transactionManager type="MANAGED"> <property name="closeConnection"
value="false"/> </transactionManager> -->
<!-- 數(shù)據(jù)源類型:type = UNPOOLED冕房、POOLED躏啰、JNDI 1.UNPOOLED:這個數(shù)據(jù)源的實現(xiàn)是每次被請求時簡單打開和關(guān)閉連接。它有一點慢耙册,這是對簡單應(yīng)用程序的一個很好的選擇给僵,因為它不需要及時的可用連接。
不同的數(shù)據(jù)庫對這個的表現(xiàn)也是不一樣的详拙,所以對某些數(shù)據(jù)庫來說配置數(shù)據(jù)源并不重要帝际,這個配置也是閑置的 2.POOLED:這是JDBC連接對象的數(shù)據(jù)源連接池的實現(xiàn),用來避免創(chuàng)建新的連接實例時必要的初始連接和認(rèn)證時間溪厘。
這是一種當(dāng)前Web應(yīng)用程序用來快速響應(yīng)請求很流行的方法胡本。 3.JNDI:這個數(shù)據(jù)源的實現(xiàn)是為了使用如Spring或應(yīng)用服務(wù)器這類的容器,容器可以集中或在外部配置數(shù)據(jù)源畸悬,然后放置一個JNDI上下文的引用 -->
<dataSource type="UNPOOLED">
<property name="driver" value="${spring.datasource.driver-class-name}"/>
<property name="url" value="${spring.datasource.url}"/>
<property name="username" value="${spring.datasource.username}"/>
<property name="password" value="${spring.datasource.password}"/>
<!-- 默認(rèn)連接事務(wù)隔離級別 <property name="defaultTransactionIsolationLevel" value=""
/> -->
</dataSource>
</environment>
<!-- 環(huán)境配置2 -->
<environment id="development2">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${spring.datasource.driver-class-name}"/>
<property name="url" value="${spring.datasource.url}"/>
<property name="username" value="${spring.datasource.username}"/>
<property name="password" value="${spring.datasource.password}"/>
<!-- 在任意時間存在的活動(也就是正在使用)連接的數(shù)量 -->
<property name="poolMaximumActiveConnections" value="10" />
<!-- 任意時間存在的空閑連接數(shù) -->
<property name="poolMaximumIdleConnections" value="5" />
<!-- 在被強(qiáng)制返回之前侧甫,池中連接被檢查的時間 -->
<property name="poolMaximumCheckoutTime" value="20000" />
<!-- 這是給連接池一個打印日志狀態(tài)機(jī)會的低層次設(shè)置珊佣,還有重新嘗試獲得連接,這些情況下往往需要很長時間(為了避免連接池沒有配置時靜默失斉凇) -->
<property name="poolTimeToWait" value="20000" />
<!-- 發(fā)送到數(shù)據(jù)的偵測查詢咒锻,用來驗證連接是否正常工作,并且準(zhǔn)備接受請求守屉。 -->
<property name="poolPingQuery" value="NO PING QUERY SET" />
<!-- 這是開啟或禁用偵測查詢惑艇。如果開啟,你必須用一個合法的SQL語句(最好是很快速的)設(shè)置poolPingQuery屬性 -->
<property name="poolPingEnabled" value="false" />
<!-- 這是用來配置poolPingQuery多次時間被用一次拇泛。這可以被設(shè)置匹配標(biāo)準(zhǔn)的數(shù)據(jù)庫連接超時時間滨巴,來避免不必要的偵測 -->
<property name="poolPingConnectionsNotUsedFor" value="0" />
</dataSource>
</environment>
<!-- 環(huán)境配置3 -->
<environment id="development3">
<transactionManager type="JDBC" />
<dataSource type="JNDI">
<property name="data_source" value="java:comp/env/jndi/mybatis" />
<property name="env.encoding" value="UTF8" />
<!-- <property name="initial_context" value=""/> <property name="env.encoding"
value="UTF8"/> -->
</dataSource>
</environment>
</environments>
<!-- 映射文件,mapper的配置文件 -->
<mappers>
<!--直接映射到相應(yīng)的mapper文件 -->
<mapper resource="mybaits/PersonMapper.xml" />
<!--掃描包路徑下所有xxMapper.java文件 -->
<package name="com.xiaolyuh.domain.mapper.*Mapper" />
</mappers>
</configuration>
一級配置
屬性名 | 說明 | 備注 |
---|---|---|
properties | 引入外部的properties文件俺叭,配置的屬性可以在整個配置文件中其他位置進(jìn)行引用恭取; | 重要,主要作用是解耦 |
settings | 用于指定MyBatis的一些全局配置屬性熄守,這些屬性非常重要蜈垮,它們會改變MyBatis的運行時行為; | 重要 |
typeAliases | 別名裕照,為Java類型設(shè)置一個短的名字攒发,映射時方便使用;分為系統(tǒng)定義別名和自定義別名晋南; | 可以通過xml和注解配置 |
typeHandlers | 用于jdbcType與javaType之間的轉(zhuǎn)換惠猿,如枚舉; | 無特殊需求不需要調(diào)整负间; |
ObjectFactory | MyBatis每次創(chuàng)建結(jié)果對象的新實例時紊扬,它都會使用對象工廠(ObjectFactory)去構(gòu)建POJO | 大部分場景下無需修改 |
plugins | 插件配置,MyBatis允許你在已映射的語句執(zhí)行過程中的某一點進(jìn)行攔截調(diào)用唉擂; | |
environments | 用于配置多個數(shù)據(jù)源餐屎,每個數(shù)據(jù)源分為數(shù)據(jù)庫源和事務(wù)的配置; | 在多數(shù)據(jù)源環(huán)境使用 |
databaseIdProvider | MyBatis可以根據(jù)不同的數(shù)據(jù)庫廠商執(zhí)行不同的語句玩祟,用于一個系統(tǒng)內(nèi)多廠商數(shù)據(jù)源支持腹缩。 | 大部分場景下無需修改 |
mappers | 配置引入映射器的方法】赵可以使用相對于類路徑的資源引用藏鹊、或完全限定資源定位符(包括file:///的URL),或類名和包名等等 | 后面會專題說明 |
setting
這是 MyBatis 中極為重要的調(diào)整設(shè)置转锈,它們會改變 MyBatis 的運行時行為盘寡。 下表描述了設(shè)置中各項的意圖、默認(rèn)值等撮慨。
設(shè)置名 | 描述 | 有效值 | 默認(rèn)值 |
---|---|---|---|
cacheEnabled | 全局地開啟或關(guān)閉配置文件中的所有映射器已經(jīng)配置的任何緩存竿痰。 | true脆粥、false | true |
lazyLoadingEnabled | 延遲加載的全局開關(guān)。當(dāng)開啟時影涉,所有關(guān)聯(lián)對象都會延遲加載变隔。 特定關(guān)聯(lián)關(guān)系中可通過設(shè)置 fetchType 屬性來覆蓋該項的開關(guān)狀態(tài)。 | true蟹倾、false | false |
aggressiveLazyLoading | 當(dāng)開啟時匣缘,任何方法的調(diào)用都會加載該對象的所有屬性。 否則鲜棠,每個屬性會按需加載(參考 lazyLoadTriggerMethods)肌厨。 | true、false | false (在 3.4.1 及之前的版本默認(rèn)值為 true) |
multipleResultSetsEnabled | 是否允許單一語句返回多結(jié)果集(需要驅(qū)動支持)豁陆。 | true夏哭、false | true |
useColumnLabel | 使用列標(biāo)簽代替列名。不同的驅(qū)動在這方面會有不同的表現(xiàn)献联,具體可參考相關(guān)驅(qū)動文檔或通過測試這兩種不同的模式來觀察所用驅(qū)動的結(jié)果。 | true何址、false | true |
useGeneratedKeys | 允許 JDBC 支持自動生成主鍵里逆,需要驅(qū)動支持。 如果設(shè)置為 true 則這個設(shè)置強(qiáng)制使用自動生成主鍵用爪,盡管一些驅(qū)動不能支持但仍可正常工作(比如 Derby)原押。 | true、false | False |
autoMappingBehavior | 指定 MyBatis 應(yīng)如何自動映射列到字段或?qū)傩浴?NONE 表示取消自動映射偎血;PARTIAL 只會自動映射沒有定義嵌套結(jié)果集映射的結(jié)果集诸衔。 FULL 會自動映射任意復(fù)雜的結(jié)果集(無論是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 指定發(fā)現(xiàn)自動映射目標(biāo)未知列(或者未知屬性類型)的行為颇玷。NONE : 不做任何反應(yīng)笨农;WARNING : 輸出提醒日志;('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等級必須設(shè)置為 WARN)帖渠;FAILING : 映射失敗 (拋出 SqlSessionException) |
NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配置默認(rèn)的執(zhí)行器谒亦。SIMPLE 就是普通的執(zhí)行器;REUSE 執(zhí)行器會重用預(yù)處理語句(prepared statements)空郊; BATCH 執(zhí)行器將重用語句并執(zhí)行批量更新份招。 | SIMPLE、REUSE狞甚、BATCH | SIMPLE |
defaultStatementTimeout | 設(shè)置超時時間锁摔,它決定驅(qū)動等待數(shù)據(jù)庫響應(yīng)的秒數(shù)。 | 任意正整數(shù) | 未設(shè)置 (null) |
defaultFetchSize | 為驅(qū)動的結(jié)果集獲取數(shù)量(fetchSize)設(shè)置一個提示值哼审。此參數(shù)只可以在查詢設(shè)置中被覆蓋谐腰。 | 任意正整數(shù) | 未設(shè)置 (null) |
defaultResultSetType | Specifies a scroll strategy when omit it per statement settings. (Since: 3.5.2) | FORWARD_ONLY孕豹、SCROLL_SENSITIVE 、SCROLL_INSENSITIVE怔蚌、DEFAULT(same behavior with 'Not Set') | Not Set (null) |
safeRowBoundsEnabled | 允許在嵌套語句中使用分頁(RowBounds)巩步。如果允許使用則設(shè)置為 false。 | true桦踊、false | False |
safeResultHandlerEnabled | 允許在嵌套語句中使用分頁(ResultHandler)椅野。如果允許使用則設(shè)置為 false。 | true籍胯、false | True |
mapUnderscoreToCamelCase | 是否開啟自動駝峰命名規(guī)則(camel case)映射竟闪,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 到經(jīng)典 Java 屬性名 aColumn 的類似映射。 | true杖狼、false | False |
localCacheScope | MyBatis 利用本地緩存機(jī)制(Local Cache)防止循環(huán)引用(circular references)和加速重復(fù)嵌套查詢炼蛤。 默認(rèn)值為 SESSION,這種情況下會緩存一個會話中執(zhí)行的所有查詢蝶涩。 若設(shè)置值為 STATEMENT理朋,本地會話僅用在語句執(zhí)行上,對相同 SqlSession 的不同調(diào)用將不會共享數(shù)據(jù)绿聘。 | SESSION嗽上、STATEMENT | SESSION |
jdbcTypeForNull | 當(dāng)沒有為參數(shù)提供特定的 JDBC 類型時,為空值指定 JDBC 類型熄攘。 某些驅(qū)動需要指定列的 JDBC 類型兽愤,多數(shù)情況直接用一般類型即可,比如 NULL挪圾、VARCHAR 或 OTHER浅萧。 | JdbcType 常量,常用值:NULL, VARCHAR 或 OTHER哲思。 | OTHER |
lazyLoadTriggerMethods | 指定哪個對象的方法觸發(fā)一次延遲加載洼畅。 | 用逗號分隔的方法列表。 | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定動態(tài) SQL 生成的默認(rèn)語言棚赔。 | 一個類型別名或完全限定類名土思。 | org.apache.ibatis.scripting.xmltags.XMLLanguageDriver |
defaultEnumTypeHandler | 指定 Enum 使用的默認(rèn) TypeHandler 。(新增于 3.4.5) | 一個類型別名或完全限定類名忆嗜。 | org.apache.ibatis.type.EnumTypeHandler |
callSettersOnNulls | 指定當(dāng)結(jié)果集中值為 null 的時候是否調(diào)用映射對象的 setter(map 對象時為 put)方法己儒,這在依賴于 Map.keySet() 或 null 值初始化的時候比較有用。注意基本類型(int捆毫、boolean 等)是不能設(shè)置成 null 的闪湾。 | true、false | false |
returnInstanceForEmptyRow | 當(dāng)返回行的所有列都是空時绩卤,MyBatis默認(rèn)返回 null途样。 當(dāng)開啟這個設(shè)置時江醇,MyBatis會返回一個空實例。 請注意何暇,它也適用于嵌套的結(jié)果集 (如集合或關(guān)聯(lián))陶夜。(新增于 3.4.2) | true、false | false |
logPrefix | 指定 MyBatis 增加到日志名稱的前綴裆站。 | 任何字符串 | 未設(shè)置 |
logImpl | 指定 MyBatis 所用日志的具體實現(xiàn)条辟,未指定時將自動查找。 | SLF4J宏胯、LOG4J羽嫡、LOG4J2、JDK_LOGGING肩袍、COMMONS_LOGGING杭棵、STDOUT_LOGGING、NO_LOGGING | 未設(shè)置 |
proxyFactory | 指定 Mybatis 創(chuàng)建具有延遲加載能力的對象所用到的代理工具氛赐。 | CGLIB魂爪、JAVASSIST | JAVASSIST (MyBatis 3.3 以上) |
vfsImpl | 指定 VFS 的實現(xiàn) | 自定義 VFS 的實現(xiàn)的類全限定名,以逗號分隔艰管。 | 未設(shè)置 |
useActualParamName | 允許使用方法簽名中的名稱作為語句參數(shù)名稱滓侍。 為了使用該特性,你的項目必須采用 Java 8 編譯蛙婴,并且加上 -parameters 選項。(新增于 3.4.1) | true尔破、false | true |
configurationFactory | 指定一個提供 Configuration 實例的類街图。 這個被返回的 Configuration 實例用來加載被反序列化對象的延遲加載屬性值。 這個類必須包含一個簽名為static Configuration getConfiguration() 的方法懒构。(新增于 3.2.3) | 類型別名或者全類名. | 未設(shè)置 |
environment
environment 元素是配置一個數(shù)據(jù)源的開始餐济,屬性id是它的唯一標(biāo)識
transactionManager
transactionManager 元素配置數(shù)據(jù)庫事務(wù),其中type屬性有三種配置方式:
- jdbc胆剧,采用jdbc的方式管理事務(wù)絮姆;
- managed,采用容器的方式管理事務(wù)秩霍,在JNDI數(shù)據(jù)源中使用篙悯;
- 自定義,自定義數(shù)據(jù)庫事務(wù)管理辦法铃绒;
dataSource
dataSource 元素配置數(shù)據(jù)源連接信息鸽照,type屬性是連接數(shù)據(jù)庫的方式配置,有四種配置方式:
- UNPOOLED 非連接池方式連接
- POOLED 使用連接池連接
- JNDI 使用JNDI數(shù)據(jù)源
- 自定義數(shù)據(jù)源
mappers
既然 MyBatis 的行為已經(jīng)由上述元素配置完了颠悬,我們現(xiàn)在就要定義 SQL 映射語句了矮燎。 但是首先我們需要告訴 MyBatis 到哪里去找到這些語句定血。 Java 在自動查找這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪里去找映射文件诞外。 你可以使用相對于類路徑的資源引用澜沟, 或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等峡谊。例如:
用classPath下資源引用
<!-- 使用相對于類路徑的資源引用 -->
<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>
<!-- 使用映射器接口實現(xiàn)類的完全限定類名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 將包內(nèi)的映射器接口實現(xiàn)全部注冊為映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
參考
https://mybatis.org/mybatis-3/zh/configuration.html#mappers
源碼
https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases
spring-boot-student-mybatis工程