MyBatis 的配置文件包含了會深深影響 MyBatis 行爲的設置和屬性信息。
具體學習可以結合官方文檔:https://mybatis.org/mybatis-3/zh/configuration.html
一、屬性(properties)
mybatis 可以通過 properties 標籤來引入外部 properties 配置文件裏的內容。
最常見的就是引入外部配置文件裏的數據庫連接信息,在之前的 mybatis 配置文件裏是寫死的,現在來引入我們項目配置文件application.properties
裏的數據庫信息.
那麼 mybatis 配置文件現在可以這麼寫:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="application.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${spring.datasource.driver-class-name}"/>
<property name="url" value="${spring.datasource.url}"/>
<property name="username" value="${spring.datasource.username}"/>
<property name="password" value="${spring.datasource.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
在標籤<<properties>
中:
- 如果使用
resource
:讀取類路徑下屬性文件 - 如果使用
url
:指定的路徑讀取屬性文件,並覆蓋之前讀取過的同名屬性
引入配置文件application.properties
之後就可以使用${}
來使用配置文件裏的屬性名了。
二、設置(settings)
這是 MyBatis 中極爲重要的設置,會改變 MyBatis 運行時的行爲。文檔裏的設置項很多,可以逐個看下混個臉熟,以後使用到的時候知道哪裏找。
比如mapUnderscoreToCamelCase
,作用是: 是否開啓駝峯命名自動映射,即從經典數據庫列名A_COLUMN
映射到經典 Java 屬性名aColumn
。
舉個栗子:
數據庫字段:user_name,開啓配置後,就可以映射 java 屬性名 userName
配置文件這樣寫:
...
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
...
三、類型別名(typeAliases)
1. 單個起別名
類型別名可爲 Java 類型設置一個縮寫名字。 它僅用於 XML 配置,方便引用的時候使用。
比如在 xml 文件UserMapper.xml
中:
<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
<select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User">
select * from user where id = #{id}
</select>
</mapper>
返回類型resultType
是com.pingguo.bloomtest.pojo.User
,全類名有點長,給它起個別名。
回到全局配置文件mybatis-config.xml
中:
<typeAliases>
<typeAlias type="com.pingguo.bloomtest.pojo.User" alias="user" />
</typeAliases>
type
: 寫上全類名alias
: 不寫的話默認是類名小寫
然後引用的時候就可以使用別名:
<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
<select id="getUserById" resultType="user">
select * from user where id = #{id}
</select>
</mapper>
2. 批量起別名
標籤<typeAlias>
一次只可以給一個類型起別名,如果要起別名的很多,可以進行批量處理。
使用package
標籤:
<typeAliases>
<!--<typeAlias type="com.pingguo.bloomtest.pojo.User" alias="user" />-->
<package name="com.pingguo.bloomtest.pojo" />
</typeAliases>
name
:指定包名,爲這個包以及下面的所有後代包的每一個類都起一個默認別名(類名小寫)
如果引用的時候resultType="User"
我換成大寫開頭,運行也是OK的,別名不區分大小寫。
3. @Alias 給類指定別名
假如com.pingguo.bloomtest.pojo
包下還有一個子包,而這個子包下面也有一個類叫User
,這時候就是別名衝突了,mybatis 運行報錯。
可以使用@Alias
給類指定別名:
@Alias("User2")
public class User {
@TableId(type = IdType.ID_WORKER)
private Long id;
private String username;
private String password;
...
4. 內置別名
mybatis 有爲常見的 Java 類型內建的類型別名。它們都是不區分大小寫的,採取了特殊的命名風格。
我們自定義別名的時候不要與內置的重複。
不過不用別名,就用全類名也有好處。比如在用 idea編輯器,可以直接按住ctrl+左擊
類名跳過去,很方便。
四、類型處理器(typeHandlers)
類型處理器的作用,簡單來說就是架起了java 類型和數據庫類型一一映射的橋樑。
比如 java 對象中的 String 類型的變量,保存到數據庫兼容的 varchar 或者 char。
這部分就先混個臉熟先,後續涉及到對應知識點再進一步學習。
五、插件(plugins)
MyBatis 允許你在映射語句執行過程中的某一點進行攔截調用。默認情況下,MyBatis 允許使用插件來攔截的方法調用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed),執行器,常見的增刪改查
- ParameterHandler (getParameterObject, setParameters),參數處理,sql語句預編譯設置參數
- ResultSetHandler (handleResultSets, handleOutputParameters),結果集處理,查詢到結果後拿到結果集並封裝成Javabean對象
- StatementHandler (prepare, parameterize, batch, update, query),sql語句處理器
這4個對象裏有很多各自的方法(括號裏),通過插件可以在方法執行之前做一些自定義的處理,來改變一些默認行爲。
這裏同樣混臉熟,後續學習了mybatis 運行機制和原理的時候,再進一步學習。
六、環境配置(environments)
MyBatis 可以配置多種環境,這種機制有助於將 SQL 映射應用於多種數據庫之中。
在之前已經用過這個標籤<environments>
:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${spring.datasource.driver-class-name}"/>
<property name="url" value="${spring.datasource.url}"/>
<property name="username" value="${spring.datasource.username}"/>
<property name="password" value="${spring.datasource.password}"/>
</dataSource>
</environment>
</environments>
其中<environment>
可以配置一個具體的環境信息,id
代表當前環境的唯一標識,可以通過default
動態的指定當前我要使用的環境。
另外,裏面還有2個不可或缺的標籤:transactionManager
和 dataSource
。
transactionManager
transactionManager
事務管理器,type
是管理器的類型。
在 MyBatis 中有兩種類型的事務管理器:
- JDBC – 這個配置直接使用了 JDBC 的提交和回滾設施,它依賴從數據源獲得的連接來管理事務作用域。
- MANAGED – 這個配置幾乎沒做什麼。它從不提交或回滾一個連接,而是讓容器來管理事務的整個生命週期(比如 JEE 應用服務器的上下文)。 默認情況下它會關閉連接。然而一些容器並不希望連接被關閉,因此需要將 closeConnection 屬性設置爲 false 來阻止默認的關閉行爲。
如果我們使用Spring + MyBatis
,則沒有必要配置事務管理器,因爲 Spring 模塊會使用自帶的管理器來覆蓋前面的配置。
dataSource
dataSource
數據源,type
是數據源的類型。有三種內建的數據源類型:
UNPOOLED
: 這個數據源的實現會每次請求時打開和關閉連接。雖然有點慢,但對那些數據庫連接可用性要求不高的簡單應用程序來說,是一個很好的選擇。 性能表現則依賴於使用的數據庫,對某些數據庫來說,使用連接池並不重要,這個配置就很適合這種情形POOLED
: 這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來,避免了創建新的連接實例時所必需的初始化和認證時間。 這種處理方式很流行,能使併發 Web 應用快速響應請求。JNDI
: 這個數據源實現是爲了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然後放置一個 JNDI 上下文的數據源引用。
七、數據庫廠商標識(databaseIdProvider)
MyBatis 可以根據不同的數據庫廠商執行不同的語句,databaseIdProvider
這個標籤其實就是 mybatis 在一致性方面的作爲。
你只需要告訴 mybatis 你寫的 sql 是屬於哪個數據庫廠商下的,那麼它就可以動態的根據數據庫廠商標識,來發送不同的sql語句。
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
這個DB_VENDOR
,作用就是得到數據庫廠商的標識(驅動自帶獲取廠商標識的方法)。
name
設置不同的數據庫標識,value
可以設置別名。
最後,需要在 sql映射文件裏告訴mybatis 這條 sql 是又哪個廠商去執行:
<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
<select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User" databaseId="mysql">
select * from user where id = #{id}
</select>
</mapper>
這裏databaseId
裏的值就是上面配置的別名。
八、映射器(mappers)
既然 MyBatis 的行爲已經由上述元素配置完了,我們現在就要來定義 SQL 映射語句了。
mappers
標籤就是將 sql 映射註冊到全局配置文件中去,比如之前寫的:
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
每個<mapper>
註冊一個 sql映射,其中又會涉及到如下幾個屬性:
resource
<!-- 使用相對於類路徑的資源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
url
<!-- 使用完全限定資源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
class
上面2個是註冊配置文件的,而這個是用來註冊接口的,裏面寫接口全類名
<!-- 使用映射器接口實現類的全類名 -->
<mappers>
<mapper class="com.pingguo.bloomtest.dao.UserMapper"/>
</mappers>
但是要注意:sql映射文件必須和接口同名,並且放在同一目錄下。
另外,註冊接口的情況下,也是可以不寫 sql 映射文件的,所有的sql都利用註解寫在接口上。
public interface UserMapper {
@Select("select * from user where id = #{id}")
User getUserById(Integer id);
}
感覺寫註解很方便啊?可以mybatis好不容易讓sql與代碼分離這不又回去了?
沒關係,混合用就好了。可以把比較重要的、複雜的用來寫 sql映射文件,簡單的可以寫註解裏,方便快速開發。
批量註冊
上面是單個的註冊,現在同樣也可以批量進行註冊:
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
name
寫包名。