主頁 > 後端開發 > MyBatis(五):配置之屬性優化

MyBatis(五):配置之屬性優化

2022-09-09 06:21:50 後端開發

一、什么是配置之屬性優化

在解答這個問題之前我們應該先明白MyBatis的配置有哪些?

官方檔案中文網:配置_MyBatis中文網,

我們還是直接看官方檔案中給出的內容:

MyBatis 的組態檔包含了會深深影響 MyBatis 行為的設定和屬性資訊, 配置檔案的頂層結構如下:

configuration(配置)

  properties(屬性)

  settings(設定)

  typeAliases(型別別名)

  typeHandlers(型別處理器)

  objectFactory(物件工廠)

  plugins(插件)

  environments(環境配置)

    environment(環境變數)

      transactionManager(事務管理器)

      dataSource(資料源)

  databaseIdProvider(資料庫廠商標識)

  mappers(映射器)

ok,看到上面的配置結構,我們會發現有一些是我們接觸過的,沒錯,就是environments(環境配置)和mappers(映射器),我們在建立第一個MyBatis程式的時候,就在mybatis-config.xml組態檔中對它們進行了配置,當時他們是這樣的:

<?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>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/MyBaties?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
  </environments>
  
  <mappers>
    <mapper resource="com/jms/dao/UserMapper.xml"/>
  </mappers>
</configuration>

既然如此,我們在對屬性進行優化之前,先了解environments(環境配置)的一些內容,

環境配置(environments)

MyBatis 可以配置成適應多種環境,這種機制有助于將 SQL 映射應用于多種資料庫之中, 現實情況下有多種理由需要這么做,例如,開發、測驗和生產環境需要有不同的配置;或者想在具有相同 Schema 的多個生產資料庫中使用相同的 SQL 映射,還有許多類似的使用場景,

不過要記住:盡管可以配置多個環境,但每個 SqlSessionFactory 實體只能選擇一種環境,

這是官方檔案的內容,其中說可以配置多種環境,也就是說<environment id="development">...</environment>可以有多個,我們通過default="..."選擇其中一個,就像下面的例子:

<?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>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/MyBaties?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
    
     <environment id="test">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/MyBaties?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
  </environments>
  
  <mappers>
    <mapper resource="com/jms/dao/UserMapper.xml"/>
  </mappers>
</configuration>

這里我配置了兩個環境,一個id為development,還有一個id為test,但是由于default="development",所以我選擇的是id為development的環境,

OK,明白了default和id所代表的含義,我們接下來看<transactionManager type="JDBC"/>事務管理器,還是先看官方給出的檔案:

事務管理器(transactionManager)

在 MyBatis 中有兩種型別的事務管理器(也就是 type="[JDBC|MANAGED]"):

JDBC – 這個配置直接使用了 JDBC 的提交和回滾設施,它依賴從資料源獲得的連接來管理事務作用域,

MANAGED – 這個配置幾乎沒做什么,它從不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如 JEE 應用服務器的背景關系), 默認情況下它會關閉連接,然而一些容器并不希望連接被關閉,因此需要將 closeConnection 屬性設定為 false 來阻止默認的關閉行為,

提示:如果你正在使用 Spring + MyBatis,則沒有必要配置事務管理器,因為 Spring 模塊會使用自帶的管理器來覆寫前面的配置,

所以說,事務管理器其實有JDBC和MANAGED兩種,但是我們一般都會選擇JDBC,

<dataSource type="POOLED">資料源:

資料源(dataSource)

dataSource 元素使用標準的 JDBC 資料源介面來配置 JDBC 連接物件的資源,

大多數 MyBatis 應用程式會按示例中的例子來配置資料源,雖然資料源配置是可選的,但如果要啟用延遲加載特性,就必須配置資料源,

有三種內建的資料源型別(也就是 type="[UNPOOLED|POOLED|JNDI]"):

UNPOOLED– 這個資料源的實作會每次請求時打開和關閉連接,雖然有點慢,但對那些資料庫連接可用性要求不高的簡單應用程式來說,是一個很好的選擇, 性能表現則依賴于使用的資料庫,對某些資料庫來說,使用連接池并不重要,這個配置就很適合這種情形,UNPOOLED 型別的資料源僅僅需要配置以下 5 種屬性:

driver – 這是 JDBC 驅動的 Java 類全限定名(并不是 JDBC 驅動中可能包含的資料源類),

url – 這是資料庫的 JDBC URL 地址,

username – 登錄資料庫的用戶名,

password – 登錄資料庫的密碼,

defaultTransactionIsolationLevel – 默認的連接事務隔離級別,

defaultNetworkTimeout – 等待資料庫操作完成的默認網路超時時間(單位:毫秒),查看 java.sql.Connection#setNetworkTimeout() 的 API 檔案以獲取更多資訊,

作為可選項,你也可以傳遞屬性給資料庫驅動,只需在屬性名加上“driver.”前綴即可,例如:

driver.encoding=UTF8

這將通過 DriverManager.getConnection(url, driverProperties) 方法傳遞值為 UTF8 的 encoding 屬性給資料庫驅動,

POOLED– 這種資料源的實作利用“池”的概念將 JDBC 連接物件組織起來,避免了創建新的連接實體時所必需的初始化和認證時間, 這種處理方式很流行,能使并發 Web 應用快速回應請求,

除了上述提到 UNPOOLED 下的屬性外,還有更多屬性用來配置 POOLED 的資料源:

poolMaximumActiveConnections – 在任意時間可存在的活動(正在使用)連接數量,默認值:10

poolMaximumIdleConnections – 任意時間可能存在的空閑連接數,

poolMaximumCheckoutTime – 在被強制回傳之前,池中連接被檢出(checked out)時間,默認值:20000 毫秒(即 20 秒)

poolTimeToWait – 這是一個底層設定,如果獲取連接花費了相當長的時間,連接池會列印狀態日志并重新嘗試獲取一個連接(避免在誤配置的情況下一直失敗且不列印日志),默認值:20000 毫秒(即 20 秒),

poolMaximumLocalBadConnectionTolerance – 這是一個關于壞連接容忍度的底層設定, 作用于每一個嘗試從快取池獲取連接的執行緒, 如果這個執行緒獲取到的是一個壞的連接,那么這個資料源允許這個執行緒嘗試重新獲取一個新的連接,但是這個重新嘗試的次數不應該超過 poolMaximumIdleConnections 與 poolMaximumLocalBadConnectionTolerance 之和, 默認值:3(新增于 3.4.5)

poolPingQuery – 發送到資料庫的偵測查詢,用來檢驗連接是否正常作業并準備接受請求,默認是“NO PING QUERY SET”,這會導致多數資料庫驅動出錯時回傳恰當的錯誤訊息,

poolPingEnabled – 是否啟用偵測查詢,若開啟,需要設定 poolPingQuery 屬性為一個可執行的 SQL 陳述句(最好是一個速度非常快的 SQL 陳述句),默認值:false,

poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的頻率,可以被設定為和資料庫連接超時時間一樣,來避免不必要的偵測,默認值:0(即所有連接每一時刻都被偵測 — 當然僅當 poolPingEnabled 為 true 時適用),

JNDI – 這個資料源實作是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置資料源,然后放置一個 JNDI 背景關系的資料源參考,這種資料源配置只需要兩個屬性:

initial_context – 這個屬性用來在 InitialContext 中尋找背景關系(即,initialContext.lookup(initial_context)),這是個可選屬性,如果忽略,那么將會直接從 InitialContext 中尋找 data_source 屬性,

data_source – 這是參考資料源實體位置的背景關系路徑,提供了 initial_context 配置時會在其回傳的背景關系中進行查找,沒有提供時則直接在 InitialContext 中查找,

和其他資料源配置類似,可以通過添加前綴“env.”直接把屬性傳遞給 InitialContext,比如:

env.encoding=UTF8

這就會在 InitialContext 實體化時往它的構造方法傳遞值為 UTF8 的 encoding 屬性,

看了以上檔案,我們主要要了解事務管理器的默認是JDBC,資料源默認的是POOLED,

接下來就只剩下環境配置中<property />標簽的內容了,很明顯,這就是屬性標簽,對于組態檔,官方給出的默認的格式是這樣的:

<property name="driver" value="https://www.cnblogs.com/jmsstudy/p/${driver}"/>
<property name="url" value="https://www.cnblogs.com/jmsstudy/p/${url}"/>
<property name="username" value="https://www.cnblogs.com/jmsstudy/p/${username}"/>
<property name="password" value="https://www.cnblogs.com/jmsstudy/p/${password}"/>

那么我們怎么樣才能和官方這種默認的格式匹配起來呢,現在我們就需要對屬性進行優化了,

屬性(properties)

這些屬性可以在外部進行配置,并可以進行動態替換,你既可以在典型的 Java 屬性檔案中配置這些屬性,也可以在 properties 元素的子元素中設定,

例如:

<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="https://www.cnblogs.com/jmsstudy/p/dev_user"/>
  <property name="password" value="https://www.cnblogs.com/jmsstudy/p/F2Fa3!33TYyg"/>
</properties>

官方檔案中是這樣說明的,我們將屬性在外部配置或在properties的子元素中設定就是對屬性的優化,

二、怎么進行屬性的優化

1.在java屬性檔案中配置

(1)首先建立一個屬性檔案db.properties,其中的內容如下:

diver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/MyBaties?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456

(2)修改mybatis-config.xml組態檔

<?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="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>
  
  <mappers>
    <mapper resource="com/jms/dao/UserMapper.xml"/>
  </mappers>
</configuration>

我們通過<properties resource="db.properties"> </properties>對db.properties檔案進行了參考,在這種配置下我們去測驗是完全可以的,

(2)直接在<properties>元素的子元素中進行設定

我現在先把db.properties檔案中的username和password兩項刪掉,再去將<properties>元素內容修改為以下樣式:

 <properties resource="db.properties">
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
  </properties>

此時我們去測驗依舊沒有問題,

以上就是對屬性的優化,那么問題來了,既可以直接在環境配置中賦值,又可以通過properties檔案和<properties>元素的子元素堆屬性進行配置,當其中有重復的屬性配置時,該使用哪一個配置呢?

官方在檔案中作出了以下規定:

如果一個屬性在不只一個地方進行了配置,那么,MyBatis 將按照下面的順序來加載:

首先讀取在 properties 元素體內指定的屬性,

然后根據 properties 元素中的 resource 屬性讀取類路徑下屬性檔案,或根據 url 屬性指定的路徑讀取屬性檔案,并覆寫之前讀取過的同名屬性,

最后讀取作為方法引數傳遞的屬性,并覆寫之前讀取過的同名屬性,

因此,通過方法引數傳遞的屬性具有最高優先級,resource/url 屬性中指定的組態檔次之,最低優先級的則是 properties 元素中指定的屬性,

 

(本文僅作個人學習記錄用,如有紕漏敬請指正)

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505934.html

標籤:Java

上一篇:面試官:@Autowired, @Resource, @Inject 三個注解的區別?一下懵了。。。

下一篇:day05-執行緒的應用04

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more