調整 settings 中的設置是很是關鍵的,它們會改變 MyBatis 的運行時行爲。下表描述了設置中各項的意圖、默認值等。java
設置參數 | 描述 | 有效值 | 默認值 |
---|---|---|---|
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 元素的示例以下:mysql
<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>
MyBatis 能夠配置成適應多種環境,這種機制有助於將 SQL 映射應用於多種數據庫之中,現實狀況下有多種理由須要這麼作。例如,開發、測試和生產環境須要有不一樣的配置;或者共享相同 Schema 的多個生產數據庫,想使用相同的 SQL 映射。許多相似的用例。sql
不過要記住:儘管能夠配置多個環境,每一個 SqlSessionFactory 實例只能選擇其一。數據庫
因此,若是你想鏈接兩個數據庫,就須要建立兩個 SqlSessionFactory 實例,每一個數據庫對應一個。而若是是三個數據庫,就須要三個實例,依此類推,記起來很簡單:apache
爲了指定建立哪一種環境,只要將它做爲可選的參數傳遞給 SqlSessionFactoryBuilder 便可。能夠接受環境配置的兩個方法簽名是:緩存
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
若是忽略了環境參數,那麼默認環境將會被加載,以下所示:mybatis
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
Environments配置示例app
<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>
注意這裏的關鍵點:ide
默認的環境和環境 ID 是自我解釋的。你能夠使用你喜歡的名稱來命名,只要肯定默認的要匹配其中之一。工具
既然 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>