1. 程式人生 > 其它 >【測試開發】知識點-mybatis,全域性配置檔案介紹

【測試開發】知識點-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>

返回型別resultTypecom.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個不可或缺的標籤:transactionManagerdataSource

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寫包名。

--不要用肉體的勤奮,去掩蓋思考的懶惰--