1、核心配置
MyBatis 的配置文件包含了會深深影響 MyBatis 行為的設置和屬性信息。 配置文檔的頂層結構如下:
- configuration(配置)
- properties(屬性)
- settings(設置)
- typeAliases(類型別名)
- typeHandlers(類型處理器)
- objectFactory(對象工廠)
- plugins(插件)
- environments(環境配置)
- environment(環境變量)
- transactionManager(事務管理器)
- dataSource(數據源)
- environment(環境變量)
- databaseIdProvider(數據庫廠商標識)
- mappers(映射器)
Mybatis九大類全局配置節點按照如下順序排序,位置不能顛倒。
properties=>settings=>typeAliases=>typeHandlers=>objectFactory=>plugins=>environment=>databaseIdProvider=>mappers
2、環境配置(environments)
mybatis可以配置成適應多個環境,但每個SqlSessionFactory實例只能選擇一種環境。
<?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核心配置文件--> <configuration> <!-- 引入外部配置文件 --> <properties resource="db.properties" /> <!--可以給實體類起別名--> <typeAliases> <typeAlias type="com.example.pojo.User" alias="User" /> <!--也可以使用包路徑 <package name=""/>--> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <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> <!--每一個Mapper.xml都需要在Mybatis核心配置文件中注冊!--> <mappers> <mapper resource="com/example/dao/UserMapper.xml"/> </mappers> </configuration>
2.1事務管理器(transactionManager)
mybatis中有兩種類型的事務管理器,type=[JDBC|MANAGED],默認JDBC
(1)使用JDBC的事務管理機制。
這種機制就是利用java.sql.Connection對象完成對事務的提交
(2)使用MANAGED的事務管理機制。
這種機制mybatis自身不會去實現事務管理,而是讓程序的Web容器或者Spring容器來實現對事務的管理。
2.2數據源(dataSource)
dataSource元素使用標准的JDBC數據源接口來配置JDBC連接對象的資源,有三種內建的數據源類型:
- UNPOOLED:這個數據源的實現只是每次被請求時打開和關閉連接
- POOLED:這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來,避免了創建新的連接實例時所必需的初始化和認證時間。 這是一種使得並發 Web 應用快速響應請求的流行處理方式
- JNDI:這個數據源的實現是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用
3、屬性(properties)
properties為屬性配置文件,它為上下文提供相關的資源,properties有三種配置資源的方式:
方式一:通過properties子元素配置
<properties> <property name="username" value="root"/> <property name="password" value="root"/> </properties>
方式二:通過properise的屬性配置
<!-- 引入外部配置文件 --> <properties resource="db.properties" />
方式三:通過屬性參數傳遞配置
即把屬性傳遞到SqlSessionFactoryBuilder.build()中
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props); // ... or ... SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
Tip:當在mybatis配置文件中同時存在三種方式時,優先級順序如下:
(1)首先讀取properties子元素屬性
(2)其次讀取properties元素的屬性(resource和url)(外部配置文件)
(3)最后讀取作為方法參數傳遞的屬性,並覆蓋以讀取的同名屬性
三種方式,存在優先級,且排在后面的配置覆蓋排在前面同名屬性的配置,鑒於此,建議在配置時,不要使用混合方式。
4、設置(settings)
settings決定mybatis運行時行為,均有很多可配置的行為,如下為一個較完整的settings配置
<settings> <!--全局全局地開啟或關閉配置文件中的所有映射器已經配置的任何緩存,默認為true--> <setting name="cacheEnabled" value="true"/> <!--延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置 fetchType屬性來覆蓋該項的開關狀態。默認值為false --> <setting name="lazyLoadingEnabled" value="false"/> <!--當開啟時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性會按需加載,默認值false--> <setting name="aggressiveLazyLoading" value="false"/> <!--是否允許單一語句返回多結果集,默認值為true --> <setting name="multipleResultSetsEnabled" value="true"/> <!--使用列標簽代替列名,默認值為true --> <setting name="useColumnLabel" value="true"/> <!--允許 JDBC 支持自動生成主鍵,需要驅動兼容,默認值為false --> <setting name="useGeneratedKeys" value="false"/> <!--指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意復雜的結果集 (無論是否嵌套),默認值為PARTIAL--> <setting name="autoMappingBehavior" value="PARTIAL"/> <!--指定發現自動映射目標未知列(或者未知屬性類型)的行為。NONE: 不做任何反應; ARNING: 輸出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等級必須設置為 WARN);FAILING: 映射失敗 (拋出 SqlSessionException),默認值為NONE --> <setting name="autoMappingUnknownColumnBehavior" value="NONE"/> <!--配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。默認值為SIMPLE --> <setting name="defaultExecutorType" value="SIMPLE"/> <!--設置超時時間,它決定驅動等待數據庫響應的秒數。參數為任意正整數,未設置默認值--> <setting name="defaultStatementTimeout" value="25"/> <!--為驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只可以在查詢設置中被覆蓋。參數為任意正整數, 未設置默認值 --> <setting name="defaultFetchSize" value="100"/> <!--允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設置為false,默認值未false --> <setting name="safeRowBoundsEnabled" value="false"/> <!--允許在嵌套語句中使用分頁(ResultHandler)。如果允許使用則設置為false。默認值為true --> <setting name="safeResultHandlerEnabled" value="true"/> <!--是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射,默認值為false --> <setting name="mapUnderscoreToCamelCase" value="false"/> <!--MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重復嵌套查詢。 默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地會話僅用在語 句執行上,對相同 SqlSession 的不同調用將不會共享數據。--> <setting name="localCacheScope" value="SESSION"/> <!--當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情 況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。默認值為OTHER --> <setting name="jdbcTypeForNull" value="OTHER"/> <!--指定哪個對象的方法觸發一次延遲加載。 --> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <!--指定動態 SQL 生成的默認語言。--> <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/> <!--指定當結果集中值為 null 的時候是否調用映射對象的 setter(map 對象時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本類型(int、boolean等)是不能設置成 null 的。--> <setting name="callSettersOnNulls" value="false"/> <!--當返回行的所有列都是空時,MyBatis默認返回null。 當開啟這個設置時,MyBatis會返回一個空實例。 請注意,它也適用於嵌套的 結果集 (i.e. collectioin and association)。(從3.4.2開始--> <setting name="returnInstanceForEmptyRow" value="false"/> <!--指定 MyBatis 增加到日志名稱的前綴--> <setting name="logPrefix" value="log"/> <!--指定 MyBatis 所用日志的具體實現,未指定時將自動查找 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING。 --> <setting name="logImpl" value="LOG4J"/> <!--指定 Mybatis 創建具有延遲加載能力的對象所用到的代理工具。CGLIB | JAVASSIST--> <setting name="proxyFactory" value="JAVASSIST"/> <!--指定VFS的實現--> <setting name="vfsImpl" value="vfs"/> <!--允許使用方法簽名中的名稱作為語句參數名稱。 為了使用該特性,你的工程必須采用Java 8編譯,並且加上-parameters選項。 (從3.4.1開始)--> <setting name="useActualParamName" value="true"/> <!--指定一個提供Configuration實例的類。 這個被返回的Configuration實例用來加載被反序列化對象的懶加載屬性值。 這個類必須包含一個簽名方法static Configuration getConfiguration(). (從 3.2.3 版本開始)--> <setting name="configurationFactory" value="configClass"/> </settings>
5、類型別名(typeAliases)
類型別名為Java類型設置一個簡短名字,它只與xml有關,用來減少類完全限定名的冗余
<typeAliases> <typeAlias type="demo.mybatis.entity.UserInfo" alias="UserInfo"/> </typeAliases>
這樣配置后,任何使用demo.mybatis.entity.UserInfo的地方,都可用UserInfo來代替
除此之外,還可以指定一個包名,mybatis會在包名下搜索需要的Java Bean,比如:
<typeAliases> <package name="demo.mybatis.entity"/> </typeAliases>
在沒注解的情況下,每個在demo.mybatis.entity中的Java Bean,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。 比如demo.mybatis.entity.UserInfo的別名為userInfo.
若存在注解,則別名為注解名。
POJO設置別名
@Alias("Users")
public class User{
}
Mapper.xml
<select id="getUserInfoById" resultType="Users"> SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id} </select>
6、其他配置
- typeHandlers(類型處理器)
- objectFactory(對象工廠)
- plugins(插件)
- mybatis-generator-core
- mybatis-plus
- 通用mapper
7、映射文件(mappers)
mappers關聯映射配置文件,即告訴mybatis到哪里去找映射配置文件。有四種基本方式可以關聯映射配置文件:
方式一:使用相對於類路徑的資源引用(推薦使用)
<!--類路徑方式--> <mapper resource="demo/mybatis/resources/userInfo-config.xml"/>
方式二:使用class文件綁定注冊
<mapper class="demo.mybatis.service.UserInfoAnnotation"/>
注意:
- 接口和mapper配置文件必須同名。
- 接口和mapper配置文件必須在同一個包下。
方式三:使用掃描包進行綁定注冊
<package name="demo.mybatis.service"/>
注意:
- 接口和mapper配置文件必須同名。
- 接口和mapper配置文件必須在同一個包下。
