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

image.png

這部分就先混個臉熟先,後續涉及到對應知識點再進一步學習。

五、插件(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寫包名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章