配置文件的基本結構
- configuration —— 根元素
- properties —— 定義配置外在化
- settings —— 一些全局性的配置
- typeAliases —— 為一些類定義別名
- typeHandlers —— 定義類型處理,也就是定義java類型與數據庫中的數據類型之間的轉換關系
- objectFactory
- plugins —— Mybatis的插件,插件可以修改Mybatis內部的運行規則
- environments —— 配置Mybatis的環境
- environment
- transactionManager —— 事務管理器
- dataSource —— 數據源
- environment
- databaseIdProvider ——數據庫廠商標識
- mappers —— 指定映射文件或映射類
主要的幾點:
settings
調整 settings 中的設置是非常關鍵的,它們會改變 MyBatis 的運行時行為。下表描述了設置中各項的意圖、默認值等。
| 設置參數 | 描述 | 有效值 | 默認值 |
|---|---|---|---|
| cacheEnabled | 該配置影響的所有映射器中配置的緩存的全局開關。 | true | false | true |
| lazyLoadingEnabled | 延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態。 | true | false | false |
| aggressiveLazyLoading | 當啟用時,帶有延遲加載屬性的對象的加載與否完全取決於對任意延遲屬性的調用;反之,每種屬性將會按需加載。 | true | false | 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 |
| defaultExecutorType | 配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements);BATCH 執行器將重用語句並執行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
| defaultStatementTimeout | 設置超時時間,它決定驅動等待數據庫響應的秒數。 | Any positive integer | Not Set (null) |
| safeRowBoundsEnabled | 允許在嵌套語句中使用行分界(RowBounds)。 | true | false | False |
| mapUnderscoreToCamelCase | 是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。 | true | false | False |
| localCacheScope | MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重復嵌套查詢。默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。 | SESSION | STATEMENT | SESSION |
| jdbcTypeForNull | 當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 | JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER | OTHER |
| lazyLoadTriggerMethods | 指定哪個對象的方法觸發一次延遲加載。 | A method name list separated by commas | equals,clone,hashCode,toString |
| defaultScriptingLanguage | 指定動態 SQL 生成的默認語言。 | A type alias or fully qualified class name. | org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver |
| callSettersOnNulls | 指定當結果集中值為 null 的時候是否調用映射對象的 setter(map 對象時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意原始類型(int、boolean等)是不能設置成 null 的。 | true | false | false |
| logPrefix | 指定 MyBatis 增加到日志名稱的前綴。 | Any String | Not set |
| logImpl | 指定 MyBatis 所用日志的具體實現,未指定時將自動查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | Not set |
| proxyFactory | 為 Mybatis 用來創建具有延遲加載能力的對象設置代理工具。 | CGLIB | JAVASSIST | CGLIB |
一個配置完整的 settings 元素的示例如下:
<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="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <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>
配置環境(environments)
MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 映射應用於多種數據庫之中,現實情況下有多種理由需要這么做。例如,開發、測試和生產環境需要有不同的配置;或者共享相同 Schema 的多個生產數據庫,想使用相同的 SQL 映射。許多類似的用例。
不過要記住:盡管可以配置多個環境,每個 SqlSessionFactory 實例只能選擇其一。
所以,如果你想連接兩個數據庫,就需要創建兩個 SqlSessionFactory 實例,每個數據庫對應一個。而如果是三個數據庫,就需要三個實例,依此類推,記起來很簡單:
- 每個數據庫對應一個 SqlSessionFactory 實例
為了指定創建哪種環境,只要將它作為可選的參數傳遞給 SqlSessionFactoryBuilder 即可。可以接受環境配置的兩個方法簽名是:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
如果忽略了環境參數,那么默認環境將會被加載,如下所示:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
Environments配置示例
<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>
<environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/wifi?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments>
注意這里的關鍵點:
- 默認的環境 ID(比如:default=”development”)。
- 每個 environment 元素定義的環境 ID(比如:id=”development”)。
- 事務管理器的配置(比如:type=”JDBC”)。
- 數據源的配置(比如:type=”POOLED”)。
默認的環境和環境 ID 是自我解釋的。你可以使用你喜歡的名稱來命名,只要確定默認的要匹配其中之一。
映射器(mappers)
既然 MyBatis 的行為已經由上述元素配置完了,我們現在就要定義 SQL 映射語句了。但是首先我們需要告訴 MyBatis 到哪里去找到這些語句。Java 在自動查找這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪里去找映射文件。你可以使用相對於類路徑的資源引用,或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等。例如:
<!-- 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>
