【測試開發】知識點-mybatis,全域性配置檔案介紹
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
寫包名。