MyBatis筆記二:配置
1.全局配置
1.properites
這個配置主要是引入我們的 properites 配置文件的:
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
可以看到我們使用 <properties resource="db.properties"/> 引入了我們的數(shù)據(jù)據(jù)庫的配置文件,然后這個標簽有兩個屬性 : resource 和 uri 第一種直接是引用項目下的文件。第二個就是引用網(wǎng)絡路徑的和我們本地文件系統(tǒng)的資源。
2.settings
非常重要?。?!
<!--全局配置-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
裝了Mybatis 插件的話我們會看到我們的設置的代碼提示,都不用自己去記的。
3.typeAliases
可以為我們的 Java 類型取別名。避免我們?nèi)懞荛L的類包名,等等。并且這里提供了三種取別名的方式:
1. typeAlias
<typeAliases>
<typeAlias type="lwen.entries.Employee" alias="emp"/>
</typeAliases>
這就是給我們的 Java 類取的別名,我們在 xml 中配置返回值,參數(shù),命名空間的時候就不用寫那么長了。我們直接寫 emp 即可,但是注意的是我們?nèi)绻粚?alias 屬性他就會配置默認的別名,也就是我們的類名首字母小寫。在這里就是employee
2.package
批量取別名,有時候我們的一個包下面的類太多了我們希望給他們都取上默認別名,我們就可以使用這個標簽,但是注意這個標簽不能和 typeAlias標簽共存 ,這個標簽指定的包其實是對我們的這個包以及他的子包進行別名操作,并且都是默認別名
<typeAliases>
<package name="lwen.entries"/>
</typeAliases>
3.@Alias
因為上面的兩個標簽不能同時存在,所以我們沒辦法給某一個包下的特定的類取別名,這里我們就需要使用 @Alias 來做注解別名了,這樣可以解決上面的問題。
@Alias("emps")
其實除了這些我們需要自定義的一些別名,系統(tǒng)幫我們預先設定好了很多常用的別名:
| 別名 | 映射的類型 |
|---|---|
| _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 |
可以看到規(guī)律就是類名小寫,然后基本類型就是下劃線。
4.typeHandler
這個東西其實就是把我們的Java類型和數(shù)據(jù)庫的類型相對應,這里暫時不具體說。
5.plugins
插件功能,對下面對象的方法進行攔截,他的原理就是動態(tài)代理。
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
6.environments
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC">
<property name="hah" value="heh"/>
</transactionManager>
<dataSource type="POOLED">
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
最外層就是我們的 environments 這個就是配置各種環(huán)境(比如:開發(fā),測試,線上...),所以說我們的這個標簽有一個 default 屬性,就是用來制定我們的具體激活哪個環(huán)境的,這里用的是 dev 。然后下面就是具體的環(huán)境了,環(huán)境的 id 就是我們配置的環(huán)境的名稱,每一個環(huán)境里有且只有兩個屬性,就是 transactionManager 和 dataSource 他們必須配置否則會報錯。
可以看到 transactionManager 有一個 Type 就是用來指定使用哪個食物管理器,這里它使用了 JDBC 的,其實在Mybatis中只有兩種:type=”[JDBC|MANAGED]”
- JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設置,它依賴于從數(shù)據(jù)源得到的連接來管理事務作用域。
- MANAGED – 這個配置幾乎沒做什么。它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如 JEE 應用服務器的上下文)。 默認情況下它會關(guān)閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設置為 false 來阻止它默認的關(guān)閉行為。例如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
然后我們就很好奇這些 MANAGED 之類的東西在哪有定義,我們是否可以配置自己的書屋管理器比如強大的 Spring的事務管理。
org.apache.ibatis.session.Configuration 在這個類里我們發(fā)現(xiàn)了
typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);
typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);
typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);
也就是說他們都是別名而已。那么我們就可以配置自己的類了,我們直接在 type 位置寫上我們的事務管理器全類名,或者使用別名機制也可以。具體的對應的類需要什么特性我們直接看看他本來自帶的兩個類就明白了。
顯然下面的配置數(shù)據(jù)源也是如此,默認的采用了連接池,也就是我們的 sqlSession 對象會被緩存起來不用每次去數(shù)據(jù)庫里獲取。
7.databaseIdProvider
MyBatis 可以根據(jù)不同的數(shù)據(jù)庫廠商執(zhí)行不同的語句,這種多廠商的支持是基于映射語句中的 databaseId 屬性。 MyBatis 會加載不帶 databaseId 屬性和帶有匹配當前數(shù)據(jù)庫 databaseId 屬性的所有語句。 如果同時找到帶有 databaseId 和不帶 databaseId 的相同語句,則后者會被舍棄。
我們通過設置屬性別名來使其變短 :
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
<property name="MySQL" value="mysql" />
</databaseIdProvider>
然后我們在 mapper 的xml文件中就可以匹配這些數(shù)據(jù)提供商:
<select id="getEmployeeById" resultType="lwen.entries.Employee" databaseId="mysql">
select * from employee where id=#{id}
</select>
<select id="getEmployeeById" resultType="lwen.entries.Employee" databaseId="oracle">
select * from employee where id=#{id}
</select>
那么他會按照數(shù)據(jù)源來確定當前是哪個數(shù)據(jù)源,我們需要使用哪個sql語句。這些都是自動進行的,無需我們的干預。
8.mappers
這個就是用來配置我們的 mapper 的 xml 標簽了。我們在里面配置 xml 有以下三種方式:
1.使用 mapper 標簽
<!--我們的mapper文件的位置-->
<mappers>
<mapper resource="EmployeeMapper.xml"/>
<mapper resource="EmployeeMapperInterface.xml"/>
</mappers>
顯然這個地方的 mapper 標簽還有兩個屬性 分別就是 resource 和 uri 就是和上面是一樣的。
2.使用包掃描的方式
<package name="lwen"/>
lwen 包下面的xml 映射文件都被加載進去。
3.注解
我們可以使用對應的注解 注解名 就是我們的 sql 語句的動作。 @Select Update 等等
注意以上的標簽都是有順序的,順序不能隨便配置