根元素<configuration>,子元素:
- <properties>
- <setttings>
- <typeAliases>
- <typeHandlers>
- <objectFactory>
- <plugins>
- <environments>
- <databaseIdProvider>
- <mappers>
這些子元素的配置是有順序的,只能按照上面的順序配置。
可缺省部分子元素。
<properties>
用於將內部的配置外在化,在<properties>中引入外部配置即可。
比如數據庫的連接信息,我們可以直接寫在全局配置文件中:
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT"/> <property name="username" value="chy"/> <property name="password" value="abcd"/> </dataSource> </environment> </environments>
考慮到更換數據庫時,運維從一大堆代碼不好找數據庫的連接信息,我們可以把數據庫的連接信息拿出來,單獨寫在一個配置文件中。
sql.properties:
mysql_driver=com.mysql.cj.jdbc.Driver mysql_url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT mysql_username=chy mysql_password=abcd #oracle_driver=..... #oracle_url=..... #oracle_username=..... #oracle_password=.....
mybatis-config.xml:
<properties resource="sql.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${mysql_driver}"/> <property name="url" value="${mysql_url}"/> <property name="username" value="${mysql_username}"/> <property name="password" value="${mysql_password}"/> </dataSource> </environment> </environments>
<settings>
用於設置mybatis運行時的參數。常用的項有:
- cacheEnabled:是否使用緩存,boolean值,默認為false
- lazyLoadingEnabled :是否使用懶加載,boolean值,默認為false
- defaultStatementTimeout:設置超時時間,默認單位秒
- mapUnderscoreToCamelCase:是否啟用camel命名規則的映射,boolean值,默認為false
- logImpl:使用的日志框架
一般只需配置logImpl:
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
如果不使用日志框架,可以缺省此配置。
<typeAlias>
用於配置pojo類別名。
在映射文件中,如果parameterType、 resultType是自己寫的pojo類,必須使用全限定類名:
resultType="com.chy.pojo.Student"
又臭又長,很麻煩。可以使用別名。
配置pojo類的別名:
<typeAliases>
<typeAlias type="com.chy.pojo.Student" alias="Student"/>
<typeAlias type="com.chy.pojo.Teacher" alias="Teacher"/>
</typeAliases>
resultType="Student"
直接寫別名即可。
如果缺省alias屬性,默認為類名的camel寫法,比如Student => student。
也可以使用注解來配置pojo類的別名:
@Alias(value = "Student") public class Student { //...... }
可以缺省屬性名,簡寫為
@Alias("Student")
如果覺得一個一個地配置pojo類很麻煩,可以使用包自動掃描:
<typeAliases>
<package name="com.chy.pojo"/>
</typeAliases>
這個包下所有的pojo類都使用camel命名方式的別名。
在映射文件中使用別名有一個缺點:Ctrl+左鍵不會轉到定義處。
<typeHandlers>
將參數傳給預處理語句時,需要將數據從javaType(java類型)轉換為jdbcType(jdbc類型);
將結果集中的數據轉換為指定類型時,需要將數據從jdbcType轉換為javaType。
這2個過程都要用到typeHandler(類型轉換器)。一般我們使用mybatis自帶的類型轉換器即可,也可以在<typeHandlers>中引用自定義的類型轉換器。
<objectFactory>
ObjectFactory負責創建結果實例。
將查詢結果映射為指定對象時,默認的ObjectFactory先調用無參的構造器創建pojo類的實例,再調用setter方法注入值。
一般我們使用默認的ObjectFactory即可,也可以在<objectFactory>中引用自定義的ObjectFactory類。
<plugins>
mybatis允許在將查詢結果映射為指定類型的過程中,以插件形式執行自定義的代碼。
<environments>
環境配置,mybatis是持久層框架,它的環境自然是數據庫,即數據庫的配置。
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${mysql_driver}"/> <property name="url" value="${mysql_url}"/> <property name="username" value="${mysql_username}"/> <property name="password" value="${mysql_password}"/> </dataSource> </environment> </environments>
一般要配置多個環境,開發一個環境,正式使用一個環境。default指定要使用哪個<environment>。
一個<environment>即一個環境(數據庫配置)。
<transactionManager>指定使用哪種事務管理,通常使用JDBC的事務管理。如果搭配Spring使用,一般使用Spring的事務管理(在spring中配置事務管理),不在mybatis中配置事務。
<dataSource>配置數據源,mybatis提供了三種數據源:
- UNPOOLED 不使用連接池
- POOLED 使用連接池
- JNDI 適合在在EJB或應用服務器等容器中使用
type指定使用哪種數據源,<property>子元素設置具體選項。
UNPOOLED
不使用連接池,適合對性能沒有要求的、簡單的應用程序。
常用屬性:
- driver、url、username、password
- defaultTransactionlsolationLevel 設置默認的事務隔離級別
POOLED
操作數據庫速度更快,適合高並發的程序,很常用。
常用屬性:
- driver、url、username、password
- defaultTransactionlsolationLevel 設置默認的事務隔離級別
- poolMaximumActiveConnections 最大活躍連接數
- poolMaximumIdleConnections 最大閑置連接數
<mapper>
用於引入映射文件。寫法很多,常用的有3種:
- 通過映射文件的路徑引入
<mappers>
<mapper resource="com/chy/mapper/StudentMapper.xml"/>
<mapper resource="com/chy/mapper/TeacherMapper.xml"/>
</mappers>
- 通過mapper接口類引入
<mappers>
<mapper class="com.chy.mapper.StudentMapper"/>
</mappers>
- 通過包名引入
<mappers>
<package name="com.chy.mapper"/>
</mappers>
這種最常用,可以一次性引入mapper包下所有的映射文件。
