MyBatis框架:第六章:mybatis的核心配置
mybatis的核心配置之properties
創(chuàng)建jdbc.properties
一般在實(shí)際的項(xiàng)目中。數(shù)據(jù)庫(kù)的連接信息。會(huì)存放在一個(gè)jdbc.properties的屬性配置文件中
username=root
password=root
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
在mybatis-config.xml中修改引入properties資源
<!-- properties 配置一些屬性。使用的時(shí)候,用${name} 進(jìn)行輸出
resource指定屬性的位置
-->
<properties resource="jdbc.properties">
<!-- 也可以在properties配置中定義一些屬性。當(dāng)然并不推薦 -->
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
特別說(shuō)明:引入的jdbc.properties屬性文件中的信息,會(huì)覆蓋掉原來(lái)使用property標(biāo)簽定義的屬性值。
修改原來(lái)數(shù)據(jù)庫(kù)連接的信息。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 配置數(shù)據(jù)庫(kù)連接信息 -->
<property name="driver" value="${driverClass}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
mybatis的核心配置之settings
這是 MyBatis 中極為重要的調(diào)整設(shè)置,它們會(huì)改變 MyBatis 的運(yùn)行時(shí)行為。常用的設(shè)置參數(shù)
cacheEnabled 該配置影響的所有映射器中配置的緩存的全局開(kāi)關(guān)。 true | false 默認(rèn)值true
lazyLoadingEnabled 延遲加載的全局開(kāi)關(guān)。當(dāng)開(kāi)啟時(shí),所有關(guān)聯(lián)對(duì)象都會(huì)延遲加載。 特定關(guān)聯(lián)關(guān)系中可通過(guò)設(shè)置fetchType屬性來(lái)覆蓋該項(xiàng)的開(kāi)關(guān)狀態(tài)。 true | false 默認(rèn)值false
lazyLoadTriggerMethods 指定哪個(gè)對(duì)象的方法觸發(fā)一次延遲加載。
mybatis的核心配置之typeAliases
類型別名是為 Java 類型設(shè)置一個(gè)短的名字。它只和 XML 配置有關(guān),存在的意義僅在于用來(lái)減少類完全限定名的冗余。
<!-- typeAliases 可以配置別名 -->
<typeAliases>
<!--
typeAlias 配置一個(gè)別名
type 是具體的全類名
alias 是別名
<typeAlias type="com.atguigu.pojo.User" alias="user"/> -->
<!-- 通過(guò)配置包名,讓程序自動(dòng)掃描所有包下的類,自動(dòng)加別名
自動(dòng)加的別名是。類名首字母小寫(xiě)
User user
-->
<package name="com.atguigu.pojo"/>
<package name="com.atguigu.entity"/>
</typeAliases>
mybatis的核心配置之typeHandlers:這個(gè)我不經(jīng)常用
JDK8,新特性,時(shí)間的處理。類型處理器。
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.InstantTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.YearTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.MonthTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.JapaneseDateTypeHandler" />
</typeHandlers>
mybatis的核心配置之environments和transactionManager
<!--
environments標(biāo)簽用來(lái)定義多個(gè)數(shù)據(jù)庫(kù)環(huán)境
-->
<environments default="development">
<!-- environment用來(lái)定義一個(gè)數(shù)據(jù)庫(kù)環(huán)境 -->
<environment id="development">
<!--
transactionManager配置事務(wù)管理器
事務(wù)管理器類型有兩種:
JDBC – 這個(gè)配置就是直接使用了 JDBC 的提交和回滾設(shè)置,它依賴于從數(shù)據(jù)源得到的連接來(lái)管理事務(wù)范圍。
MANAGED – 這個(gè)配置幾乎沒(méi)做什么。它從來(lái)不提交或回滾一個(gè)連接,而是讓容器來(lái)管理事務(wù)的整個(gè)生命周期(比如 JEE 應(yīng)用服務(wù)器的上下文)。
-->
<transactionManager type="JDBC"/>
<!-- 修改數(shù)據(jù)庫(kù)的四個(gè)連接屬性 -->
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
environments
一般情況下。在工作的時(shí)候。會(huì)定義多個(gè)環(huán)境信息。
那么定義多個(gè)環(huán)境有什么用?
比如說(shuō):我可以定義一個(gè)環(huán)境是dev開(kāi)發(fā)環(huán)境。可以在自己寫(xiě)代碼的時(shí)候測(cè)試用。連接的是自己的數(shù)據(jù)庫(kù)。
又定義一個(gè)環(huán)境run是實(shí)際布暑的數(shù)據(jù)庫(kù)連接環(huán)境。
那么當(dāng)我們要發(fā)布項(xiàng)目的時(shí)候。只需要把default值改為run就好
transactionManager
JDBC (JdbcTransactionFactory) – 這個(gè)配置就是直接使用了 JDBC 的提交和回滾設(shè)置,它依賴于從數(shù)據(jù)源得到的連接來(lái)管理事務(wù)范圍。
<transactionManager type=“JDBC” />
MANAGED (ManagedTransactionFactory)– 這個(gè)配置幾乎沒(méi)做什么。它從來(lái)不提交或回滾一個(gè)連接,而是讓容器來(lái)管理事務(wù)的整個(gè)生命周期(比如 JEE 應(yīng)用服務(wù)器的上下文)。 默認(rèn)情況下它會(huì)關(guān)閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設(shè)置為 false 來(lái)阻止它默認(rèn)的關(guān)閉行為。例如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
自定義:實(shí)現(xiàn)TransactionFactory接口,然后在type=全類名
注意:如果你正在使用 Spring + MyBatis,則沒(méi)有必要配置事務(wù)管理器, 因?yàn)?Spring 模塊會(huì)使用自帶的管理器來(lái)覆蓋前面的配置。一般情況下,我們都會(huì)整合Spring + MyBatis 一起使用。使用的都是Spring的事務(wù)管理。
dataSource 標(biāo)簽說(shuō)明
<dataSource type=“POOLED”>
這個(gè)標(biāo)簽是配置是否啟動(dòng)數(shù)據(jù)庫(kù)連接池配置。
type 屬性的值有三種: UNPOOLED 、 POOLED 、 JNDI
UNPOOLED – 這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)只是每次被請(qǐng)求時(shí)打開(kāi)和關(guān)閉連接。雖然一點(diǎn)慢,它對(duì)在及時(shí)可用連接方面沒(méi)有性能要求的簡(jiǎn)單應(yīng)用程序是一個(gè)很好的選擇。 不同的數(shù)據(jù)庫(kù)在這方面表現(xiàn)也是不一樣的,所以對(duì)某些數(shù)據(jù)庫(kù)來(lái)說(shuō)使用連接池并不重要,這個(gè)配置也是理想的。
POOLED – 這種數(shù)據(jù)源的實(shí)現(xiàn)利用“池”的概念將 JDBC 連接對(duì)象組織起來(lái),避免了創(chuàng)建新的連接實(shí)例時(shí)所必需的初始化和認(rèn)證時(shí)間。 這是一種使得并發(fā) Web 應(yīng)用快速響應(yīng)請(qǐng)求的流行處理方式。
JNDI – (Java Naming and Directory Interface) 這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)是為了能在如 EJB 或應(yīng)用服務(wù)器這類容器中使用,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個(gè) JNDI 上下文的引用。
自定義 - 實(shí)現(xiàn)DataSourceFactory接口,定義自己的數(shù)據(jù)源實(shí)現(xiàn)。
注意:一般情況下,我們都全整合Spring + MyBatis 一起使用。所以數(shù)據(jù)源整合之后都是使用Spring的數(shù)據(jù)源。
mybatis的核心配置之databaseIdProvider
MyBatis 可以根據(jù)不同的數(shù)據(jù)庫(kù)廠商執(zhí)行不同的語(yǔ)句,這種多廠商的支持是基于映射語(yǔ)句中的 databaseId 屬性。 MyBatis 會(huì)加載不帶 databaseId 屬性和帶有匹配當(dāng)前數(shù)據(jù)庫(kù) databaseId 屬性的所有語(yǔ)句。
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver" />
<property name="MySQL" value="mysql" />
<property name="DB2" value="db2" />
<property name="Oracle" value="oracle" />
</databaseIdProvider>
mybatis提供了一個(gè)類VendorDatabaseIdProvider,中的getDatabaseId() 方法用于獲取數(shù)據(jù)庫(kù)的標(biāo)識(shí)。
property 標(biāo)簽name屬性是獲取數(shù)據(jù)庫(kù)ID標(biāo)識(shí)。
property 標(biāo)簽value屬性是我們給mybatis定義的一個(gè)簡(jiǎn)短的標(biāo)識(shí)。
databaseId測(cè)試
這樣子,我們就可以在mapper的配置文件中,在定義sql語(yǔ)句的時(shí)候,添加標(biāo)識(shí)。
<select id="selectUserById" parameterType="int"
resultType="User" databaseId="mysql">
select id , last_name from t_user where id = #{value}
</select>
這樣子,當(dāng)mybaits讀取mapper中的sql語(yǔ)句的時(shí)候,只會(huì)讀取和數(shù)據(jù)庫(kù)標(biāo)識(shí)對(duì)應(yīng)得上的sql語(yǔ)句。
如果把 databaseId屬性改為oracle。而當(dāng)前的數(shù)據(jù)庫(kù)是mysql的話。
<select id="selectUserById" parameterType="int"
resultType="User" databaseId="oracle">
那么 執(zhí)行selectUserById 語(yǔ)句的時(shí)候就會(huì)報(bào)錯(cuò)。
mybatis的核心配置之Mapper
把mapper配置文件注入到mybatis-config.xml核心配置文件中有三種常用方式。
1、在classpath路徑下引入
2、使用mapper接口的形式導(dǎo)入配置
3、使用包掃描的方式引入配置文件
<!-- 從classpath路徑下導(dǎo)入指定的配置文件 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml" />
<mapper resource="org/mybatis/builder/BlogMapper.xml" />
<mapper resource="org/mybatis/builder/PostMapper.xml" />
</mappers>
<!-- 使用mapper接口類導(dǎo)入配置文件 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper" />
<mapper class="org.mybatis.builder.BlogMapper" />
<mapper class="org.mybatis.builder.PostMapper" />
</mappers>
<!-- 掃描包下所有的配置文件
1、接口名和Mapper配置文件名必須相同
2、接口文件和Mapper配置文件必須在同一個(gè)包下
-->
<mappers>
<package name="org.mybatis.builder" />
</mappers>