| Configuration是干嘛的Configuration就像是Mybatis的總管,Mybatis的所有配置信息都存放在這里,此外,它還提供了設置這些配置信息的方法。Configuration可以從配置文件里獲取屬性值,也可以通過程序直接設置。Configuration里可供配置的屬性有: 1.       properties屬性  1)       配置示例 <properties resource="org/mybatis/example/config.properties">   <property name="username" value="dev_user"/>   <property name="password" value="F2Fa3!33TYyg"/>   </properties>  
2)       用途 properties里配置的屬性將被存放在Configuration的variables變量里,供Mybatis使用。此外在配置文件中,也可以使用這些屬性,用來對配置項實現(xiàn)動態(tài)配置。比如: <dataSource type="POOLED">   <property name="driver" value="${driver}"/>   <property name="url" value="${url}"/>   <property name="username" value="${username}"/>   <property name="password" value="${password}"/>   </dataSource>  
3)       注意事項 resource里也可指定屬性值,并且resource里屬性值的優(yōu)先級高于property子節(jié)點里配置的值,也就是說resource的同名屬性將會覆蓋于property子節(jié)點里的值。 2.        settings設置  1)       配置示例 <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="enhancementEnabled" value="false"/>   <setting name="defaultExecutorType" value="SIMPLE"/>   <setting name="defaultStatementTimeout" value="25000"/>   </settings>  
2)       用途 setting節(jié)點里配置的值會直接改寫Configuration對應的變量值,這些變量描述的是Mybatis的全局運行方式,如果對這些屬性的含義不熟悉的話建議不要配置,使用默認值即可。下面這個表格描述了各個配置項的含義和默認值: 
| 設置參數(shù)  | 描述  | 有效值  | 默認值  |  
| cacheEnabled  | 這個配置使全局的映射器啟用或禁用緩存。  | true | false  | true  |  
| lazyLoadingEnabled  | 全局啟用或禁用延遲加載。當禁用時,所有關聯(lián)對象都會即時加載。  | true | false  | true  |  
| aggressiveLazyLoading  | 當啟用時,有延遲加載屬性的對象在被調(diào)用時將會完全加載任意屬性。否則,每種屬性將會按需要加載。  | true | false  | true  |  
| multipleResultSetsEnabled  | 允許或不允許多種結(jié)果集從一個單獨的語句中返回(需要適合的驅(qū)動)。  | true | false  | true  |  
| useColumnLabel  | 使用列標簽代替列名。不同的驅(qū)動在這方便表現(xiàn)不同。參考驅(qū)動文檔或充分測試兩種方法來決定所使用的驅(qū)動。  | true | false  | true  |  
| useGeneratedKeys  | 允許JDBC支持生成的鍵。需要適合的驅(qū)動。如果設置為true則這個設置強制生成的鍵被使用,盡管一些驅(qū)動拒絕兼容但仍然有效(比如Derby)。  | true | false  | false  |  
| autoMappingBehavior  | 指定MyBatis如何自動映射列到字段/屬性。PARTIAL只會自動映射簡單,沒有嵌套的結(jié)果。FULL會自動映射任意復雜的結(jié)果(嵌套的或其他情況)。  | NONE,  PARTIAL,  FULL  | PARTIAL  |    3)       注意事項 謹慎修改這些配置值。 3.       typeAliases類型命名  1)       配置示例 <typeAliases>   <typeAlias alias="Author" type="domain.blog.Author"/>   <typeAlias alias="Blog" type="domain.blog.Blog"/>   <typeAlias alias="Comment" type="domain.blog.Comment"/>   <typeAlias alias="Post" type="domain.blog.Post"/>   <typeAlias alias="Section" type="domain.blog.Section"/>   <typeAlias alias="Tag" type="domain.blog.Tag"/>   </typeAliases>  
2)       用途 別名是為Java類型命名一個短的名字。它只用在XML配置文件里,用來減少類完全限定名的多余部分。例如在配置文件里需要使用domain.blog.Author的地方可以簡單的使用Author替換。 3)       注意事項 Mybatis里有一些默認的別名,不要覆蓋這些別名: 
| 別名  | 映射的類型  |  
| _byte  | byte  |  
| _long  | long  |  
| _short  | short  |  
| _int  | int  |  
| _integer  | int  |  
| _double  | double  |  
| _float  | float  |  
| _boolean  | boolean  |  
| string  | String  |  
| byte  | Byte  |  
| long  | Long  |  
| short  | Short  |  
| int  | Integer  |  
| integer  | Integer  |  
| double  | Double  |  
| float  | Float  |  
| boolean  | Boolean  |  
| date  | Date  |  
| decimal  | BigDecimal  |  
| bigdecimal  | BigDecimal  |  
| object  | Object  |  
| map  | Map  |  
| hashmap  | HashMap  |  
| list  | List  |  
| arraylist  | ArrayList  |  
| collection  | Collection  |  
| iterator  | Iterator  |    4.       typeHandlers類型處理器  1)       配置示例 <typeHandlers>   <typeHandler javaType="String" jdbcType="VARCHAR" handler="org.mybatis.example.ExampleTypeHandler"/>   </typeHandlers>  
2)       用途 無論是MyBatis在預處理語句中設置一個參數(shù),還是從結(jié)果集中取出一個值時,類型處理器被用來將獲取的值以合適的方式轉(zhuǎn)換成Java類型。 3)       注意事項 Mybatis已經(jīng)有了若干個類型處理器了,編寫自己的類型處理器時勿重新發(fā)明輪子。 
| 類型處理器  | Java類型? | JDBC類型? |  
| BooleanTypeHandler  | Boolean,boolean  | 任何兼容的布爾值  |  
| ByteTypeHandler  | Byte,byte  | 任何兼容的數(shù)字或字節(jié)類型  |  
| ShortTypeHandler  | Short,short  | 任何兼容的數(shù)字或短整型 |  
| IntegerTypeHandler  | Integer,int  | 任何兼容的數(shù)字和整型  |  
| LongTypeHandler  | Long,long  | 任何兼容的數(shù)字或長整型 |  
| FloatTypeHandler  | Float,float  | 任何兼容的數(shù)字或單精度浮點型 |  
| DoubleTypeHandler  | Double,double  | 任何兼容的數(shù)字或雙精度浮點型 |  
| BigDecimalTypeHandler  | BigDecimal  | 任何兼容的數(shù)字或十進制小數(shù)類型 |  
| StringTypeHandler  | String  | CHAR和VARCHAR類型? |  
| ClobTypeHandler  | String  | CLOB和LONGVARCHAR類型? |  
| NStringTypeHandler  | String  | NVARCHAR和NCHAR類型? |  
| NClobTypeHandler  | String  | NCLOB類型? |  
| ByteArrayTypeHandler  | byte[]  | 任何兼容的字節(jié)流類型  |  
| BlobTypeHandler  | byte[]  | BLOB和LONGVARBINARY類型 |  
| DateTypeHandler  | Date(java.util)? | TIMESTAMP類型? |  
| DateOnlyTypeHandler  | Date(java.util)? | DATE類型? |  
| TimeOnlyTypeHandler  | Date(java.util)? | TIME類型? |  
| SqlTimestampTypeHandler  | Timestamp(java.sql) | TIMESTAMP類型? |  
| SqlDateTypeHandler  | Date(java.sql)? | DATE類型? |  
| SqlTimeTypeHandler  | Time(java.sql)? | TIME類型? |  
| ObjectTypeHandler  | Any  | 其他或未指定類型  |  
| EnumTypeHandler  | Enumeration類型  | VARCHAR-任何兼容的字符串類型,作為代碼存儲(而不是索引) |    5.       objectFactory對象工廠  略(不常用) 6.       plugins插件  1)       配置示例 <plugins>   <plugin interceptor="org.mybatis.example.ExamplePlugin">   <property name="someProperty" value="100"/>   </plugin>   </plugins>  
2)       用途 插件可以改變某些類的執(zhí)行, MyBatis允許被插件來攔截的類有: 
 Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)   ParameterHandler (getParameterObject, setParameters)   ResultSetHandler (handleResultSets, handleOutputParameters)   StatementHandler (prepare, parameterize, batch, update, query)  
3)       注意事項 插件可以改變MyBatis底層的行為,因此功能非常強大。但在對MyBatis深入理解前不要急著編寫自己的插件,因為若插件編寫不當,將導致整個MyBatis都不能正常工作。本系列的后面會有專門的章節(jié)介紹插件機制以及兩個有用的插件,歡迎持續(xù)關注。 7.       environments環(huán)境  environments里可以配置多個environment,每個environment對應一個數(shù)據(jù)庫環(huán)境。一個完整的定義如下: <environments default="development">   <environment id="development">   <transactionManager type="JDBC">   </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屬性表示默認的數(shù)據(jù)庫環(huán)境,與某個environment的id相對應。 1)       environment環(huán)境變量 environment通過id屬性與其他數(shù)據(jù)庫環(huán)境區(qū)別。它有兩個子節(jié)點: a)       transactionManager事務管理器  在MyBatis中有兩種事務管理器類型(也就是type=”[JDBC|MANAGED]”): l JDBC–這個配置直接簡單使用了JDBC的提交和回滾設置。它依賴于從數(shù)據(jù)源得到的連接來管理事務范圍。 l MANAGED–這個配置幾乎沒做什么。它從來不提交或回滾一個連接。而它會讓容器來管理事務的整個生命周期(比如Spring或JEE應用服務器的上下文) b)       dataSource數(shù)據(jù)源  在MyBatis中有三種數(shù)據(jù)源類型(也就是type=”[UNPOOLED | POOLED| JNDI]”): l UNPOOLED –這個數(shù)據(jù)源的實現(xiàn)是每次被請求時簡單打開和關閉連接,需要配置的屬性: driver – 這是JDBC驅(qū)動的Java類的完全限定名 url – 這是數(shù)據(jù)庫的JDBC URL地址。 username – 
登錄數(shù)據(jù)庫的用戶名。 password – 
登錄數(shù)據(jù)庫的密碼。 defaultTransactionIsolationLevel – 
默認的連接事務隔離級別。 l POOLED –mybatis實現(xiàn)的簡單的數(shù)據(jù)庫連接池類型,它使得數(shù)據(jù)庫連接可被復用,不必在每次請求時都去創(chuàng)建一個物理的連接。 l JNDI – 通過jndi從tomcat之類的容器里獲取數(shù)據(jù)源。 8.       mapper映射器  1)       配置示例 <mappers>   <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>   <mapper resource="org/mybatis/builder/BlogMapper.xml"/>   <mapper resource="org/mybatis/builder/PostMapper.xml"/>   </mappers>  
2)       用途 Mappers用于告訴Mybatis去哪里尋找sql映射文件。sql映射文件是Mybatis最靈活的地方。sql映射文件在后續(xù)的章節(jié)里會進一步詳細描述,歡迎持續(xù)關注。 如何構建configuration前面介紹了Configuration的各個屬性以及在文件里配置他們的方法。這一節(jié)介紹如何從文件里解析這些配置項以及簡化配置的方法。Configuration在SqlSessionFactoryBuilder創(chuàng)建SqlSessionFactory時創(chuàng)建,通過XMLConfigBuilder的parse方法創(chuàng)建。下面一個個的介紹: 1.       properties屬性 通過XMLConfigBuilder的propertiesElement方法解析,解析后的結(jié)果存放在Configuration的variables變量里。解析順序,先解析子節(jié)點里的屬性值,再解析resource屬性指定的配置文件里的值。后者會覆蓋前者的值。 2.        settings設置  通過XMLConfigBuilder的settingsElement方法解析,解析前校驗屬性是否是可配置的,只要有一個不可配置,整個mybatis就會異常退出,所以配置這些屬性務必小心。 3.       typeAliases類型命名  通過XMLConfigBuilder的typeAliasesElement方法解析,在該方法內(nèi)部調(diào)用TypeAliasRegistry的registerAlias方法完成注冊,并將注冊的別名存入本地緩存中。XMLConfigBuilder調(diào)用的registerAlias方法并沒有什么特別的地方,但TypeAliasRegistry卻提供了批量注冊別名的方法,該方法只需要一個包名參數(shù)。該方法會在指定的包路徑下掃描可注冊的類(接口和內(nèi)部類除外),并以類的簡單名為key完整名為value注冊別名。這個方法極大的簡化了配置,后續(xù)章節(jié)將要介紹的spring與mybatis的整合模塊里就使用了這個方法使得配置量大大減少。 4.       typeHandlers類型處理器  通過XMLConfigBuilder的typeHandlerElement方法解析,在該方法內(nèi)部調(diào)用TypeHandlerRegistry的register方法完成注冊,并將注冊的類型處理器存入本地緩存中。同typeAliases一樣,TypeHandlerRegistry也提供了批量注冊的方法,該方法同樣只需要一個包名參數(shù)。該方法會在指定的包路徑下掃描可注冊的類(接口、抽象類和內(nèi)部類除外),不過只注冊那些配置了MappedTypes注解的類。這個方法極大的簡化了配置,后續(xù)章節(jié)將要介紹的spring與mybatis的整合模塊里就使用了這個方法使得配置量大大減少。 5.       objectFactory對象工廠  略(不常用) 6.       plugins插件  通過XMLConfigBuilder的pluginElement方法解析,在該方法內(nèi)部實例化插件對象后存入Configuration的interceptorChain變量里。 7.       environments環(huán)境  通過XMLConfigBuilder的environmentsElement方法解析,在該方法內(nèi),先判斷默認是否指定了環(huán)境ID,沒有的話就使用默認的環(huán)境ID嗎,然后在各個環(huán)境里取ID對應的項。也就是說一個Configuration只會保存一個數(shù)據(jù)庫環(huán)境,如果要配置多數(shù)據(jù)庫環(huán)境的話需要創(chuàng)建多個Configuration對象。在改方法內(nèi)先解析事務工廠、再解析數(shù)據(jù)源、然后再解析數(shù)據(jù)庫環(huán)境,在解析數(shù)據(jù)庫環(huán)境的過程中會訪問一次數(shù)據(jù)庫,以取得數(shù)據(jù)庫類型信息。 8.        mapper映射器  通過XMLConfigBuilder的mapperElement方法解析,在該方法內(nèi)部通過調(diào)用XMLMapperBuilder的parse方法完成。mapper的解析是mybatis的核心功能,涉及的流程較復雜,在下一章將專門分析,敬請期待。   |