MyBatis筆記(二)——配置(環境配置,別名優化,mapper映射器,屬性 properties),生命週期和作用域

MyBatis筆記(二)——配置(環境配置,別名優化,mapper映射器,屬性 properties),生命週期和作用域


參考: https://www.bilibili.com/video/BV1NE411Q7Nx

視頻原作者CSDN: https://blog.csdn.net/qq_33369905

這篇是自己整理了一下,以便自己複習。

1.核心配置

配置文件MyBatis-config.xml,可配置內容如下:

configuration(配置)
properties(屬性)
settings(設置)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins(插件)
environments(環境配置)
environment(環境變量)
transactionManager(事務管理器)
dataSource(數據源)
databaseIdProvider(數據庫廠商標識)
mappers(映射器)
<!-- 注意元素節點的順序!順序不對會報錯 -->

2.環境配置environments

  • 開發環境environments 設置多個environment:開發環境,測試環境,生產環境
  • transactionManager事務管理器 JDBC(默認)或者MANAGED
  • datasource數據源 UNPOOLED POOLED(默認) JNDI

數據源也有很多第三方的實現,比如dbcp,c3p0,druid等等…

<?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>
    <!--    1.開發環境environments   <environments default="development">  還可設置測試環境,生產環境
     default指定默認的環境 -->
    <environments default="development">
        <environment id="development">
            <!--     2.transactionManager事務管理器 JDBC(默認)或者MANAGED
                 JDBC 直接用jdbc的提交和回滾事務,依賴於從數據源得到的連接來管理 事務作用域
                 MANAGED(幾乎沒做什麼配置,默認關閉連接)     (managed)     -->
            <transactionManager type="JDBC"/>

            <!--   3.數據源  UNPOOLED  POOLED(默認) JNDI
             UNPOOLED這個數據源的實現只是每次被請求時打開或者關閉連接,慢
             POOLED 利用“池”的概念將JDBC連接對象組織起來,避免創建新的連接實例時所需要初始化和認證的時間(更快速)
             JNDI目前用的很少
             -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://47.107.229.140:3306/MyBatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="23573"/>
            </dataSource>
        </environment>
        
                
        <environment id="test">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="測試環境的數據庫連接驅動driver (例如換成別的數據庫:Oracle)"/>
                <property name="url" value="測試環境的數據庫連接url"/>
                <property name="username" value="測試環境的數據庫連接 用戶名"/>
                <property name="password" value="測試環境的數據庫連接 密碼"/>
            </dataSource>
        </environment>
        
    </environments>

    <!--    每一個mapper都需要在配置文件中註冊 mapper.xml  默認從resource-->
    <mappers>
        <!--   三種寫法 類class 絕對地址url resource(一般用這個) -->
        <!-- 舉例-->
        <mapper resource="com/piao/dao/UserMapper.xml"/>
    </mappers>

</configuration>

3.mappers映射器配置⚡️

上述片段中的 中的內容

三種寫法 類class 絕對地址url resource相對於類路徑的資源引用(一般用這個)

或者寫package


    <!--   在配置文件註冊各個mapper.xml -->
<mappers>
        <!--   三種寫法 類class 絕對地址url resource相對於類路徑的資源引用(一般用這個) -->
        
        <!-- resource相對於類路徑的資源引用-->
        <mapper resource="com/piao/dao/UserMapper.xml"/>
        
        <!-- 完全限定資源定位符(URL)
         路徑對應的是網絡上了某個文件,注意file:// 前綴 +路徑+文件名-->
        <mapper url="file:///var/mappers/BlogMapper.xml"/>
        
        <!-- 使用映射器接口實現類的完全限定類名(包名+類名)
          需要配置文件名稱和接口名稱一致,並且位於同一目錄下-->
        <mapper class="com.piao.dao.UserMapper"/>
        
        <!--  推薦使用一個包
        將包內的映射器接口實現全部註冊爲映射器
        但是需要配置文件名稱和接口名稱一致,並且位於同一目錄下
        -->
        <package name="com.piao.dao"/>

</mappers>

4.屬性 properties⚡️

使用properties改造MyBatis配置:

新建db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://ip:端口/數據庫名?useSSL=true&useUnicode=true&characterEncoding=utf8
username=用戶
password=密碼

在覈心配置文件MyBatis-config.xml中引入該文件db.properties

需要寫在configuration標籤的首部,因爲該配置文件有規定的配置順序:

配置文件規定的配置順序:

The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”.

即先properties標籤,然後settings,然後typeAliases,等等…最後是mappers標籤

    <!--    引入自己的寫的db.properties-->
    <properties resource="db.properties"></properties>

使用 ${ } 獲取properties文件中的值

<?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>

    <!--    引入自己的寫的db.properties-->
    <properties resource="db.properties"></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>

    <!--    每一個mapper都需要在配置文件中註冊 mapper.xml  默認從resource-->
    <mappers>
        <!--   三種寫法 類class 絕對地址url resource(一般用這個) -->
        <mapper resource="com/piao/dao/UserMapper.xml"/>
    </mappers>


</configuration>

properties本身也可編寫屬性配置,但會優先選擇resource屬性指定的外部配置文件中的屬性。

5.類別名 typeAliases

起個別名 這樣xml中resultType可以使用別名如User代替全限定名 如com.piao.pojo.User
1.給實體類 起個別名

2.指定一個包中的類,在沒有用註解@Alias指定的情況下,默認別名爲類名首字母小寫。

3。Java類中使用註解@Alias起別名

    <!--   起個別名 這樣xml中resultType可以使用User代替com.piao.pojo.User
             1.給實體類  起個別名 
             <typeAlias type="com.piao.pojo.User" alias="User"/>
             2.指定一個包中的類,在沒有用註解@Alias指定的情況下,默認別名爲類名首字母小寫。
             <package name="com.piao.pojo"/>
             3。Java類中使用註解@Alias起別名
                 -->
    <typeAliases>
        <typeAlias type="com.piao.pojo.User" alias="User"/>
        <package name="com.piao.pojo"/>
    </typeAliases>

Java

@Alias("user")
public class User {
  ...
}

同樣得遵守配置標籤得順序,typeAliases寫在properties,settings之後

配置文件規定的配置順序:

The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”.

還有一些其他得配置,具體可前往官方文檔查看:

Mybatis官方中文文檔(最好的MyBatis文檔)⚡️ : http://www.mybatis.org/mybatis-3/zh/index.html

6.生命週期與作用域

Mybatis的執行過程 :主要是過程一

過程二是直接通過sqlsession去操作數據庫,現已不推薦不用

以下兩圖 來源自百度

mybatis生命週期

sqlsession生命週期

以下摘自MyBatis官網:

作用域(Scope)和生命週期

理解我們之前討論過的不同作用域和生命週期類別是至關重要的,因爲錯誤的使用會導致非常嚴重的併發問題。


提示 對象生命週期和依賴注入框架

依賴注入框架可以創建線程安全的、基於事務的 SqlSession 和映射器,並將它們直接注入到你的 bean 中,因此可以直接忽略它們的生命週期。 如果對如何通過依賴注入框架使用 MyBatis 感興趣,可以研究一下 MyBatis-Spring 或 MyBatis-Guice 兩個子項目。


SqlSessionFactoryBuilder

這個類可以被實例化、使用和丟棄,一旦創建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。 你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但最好還是不要一直保留着它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。

SqlSessionFactory

SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創建另一個實例。 使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複創建多次,多次重建 SqlSessionFactory 被視爲一種代碼“壞習慣”。因此 SqlSessionFactory 的最佳作用域是應用作用域。 有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

SqlSession

每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。 絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。 也絕不能將 SqlSession 實例的引用放在任何類型的託管作用域中,比如 Servlet 框架中的 HttpSession。 如果你現在正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求相似的作用域中。 換句話說,每次收到 HTTP 請求,就可以打開一個 SqlSession,返回一個響應後,就關閉它。 這個關閉操作很重要,爲了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。 下面的示例就是一個確保 SqlSession 關閉的標準模式:

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