mybatis高級特性

文章目錄

  • 數據庫事務管理
  • 批處理
  • 插件擴展
  • 持久化和ORM
  • 緩存機制

數據庫事務管理

通過注解方式: 在需要進行事務管理的方法上添加@Transactional注解,該注解可以用于類或方法上。在配置文件中開啟事務管理器,并指定事務管理器的類型和連接池等相關信息。
示例

java
@Transactional
public void updateUserInfo(UserInfo userInfo) {// 執行更新操作// ...
}

通過XML配置方式: 在Mapper XML文件中使用標簽來配置事務管理器,以及tx:advice標簽配置事務的傳播行為和異常處理策略。

xml
<transactions><transactionManager type="JDBC"><dataSource type="POOLED"><!-- 配置數據源 --></dataSource></transactionManager><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/></tx:attributes></tx:advice>
</transactions>

在配置文件中,還需要配置事務管理器和數據源相關的信息。

xml
<environments default="development"><environment id="development"><transactionManager type="JDBC"><dataSource type="POOLED"><!-- 配置數據源 --></dataSource></transactionManager></environment>
</environments>

需要注意的是,事務管理器的類型和數據源的配置需根據具體的數據庫和連接池來進行配置。

另外,MyBatis還支持對事務的手動提交和回滾操作,可通過SqlSession實例的commit()和rollback()方法來手動控制事務的提交和回滾

java
SqlSession sqlSession = sqlSessionFactory.openSession();
try {// 執行數據庫操作sqlSession.commit();
} catch (Exception e) {sqlSession.rollback();
} finally {sqlSession.close();
}

以上方式配置和管理事務,可以保證MyBatis在執行數據庫操作時的數據一致性和事務的可靠性

批處理

批處理是指一次性執行多個數據庫操作語句的功能。這在某些場景下可以提高性能。

  • 在MyBatis中,使用SqlSession的insert、update和delete方法來執行批處理。這些方法可以接受一個包含多個參數的集合,每個參數表示一次數據庫操作。例如:
java
List<User> userList = new ArrayList<>();
userList.add(new User("user1"));
userList.add(new User("user2"));SqlSession sqlSession = sqlSessionFactory.openSession();
try {sqlSession.insert("insertUser", userList);sqlSession.commit();
} finally {sqlSession.close();
}
  • 在上面的示例中,insertUser是一個Mapper中的插入語句,userList是包含多個User對象的集合,表示多次插入操作。調用insert方法后,MyBatis會將每個User對象作為參數執行一次插入操作。

  • 需要注意的是,為了提高批處理的性能,通常需要將SqlSession的autoCommit屬性設置為false,并在執行完批處理后手動調用commit方法提交事務。

  1. MyBatis還提供了一種更高效的方式來執行批處理,即使用批量插入/更新/刪除語句。這種方式可以通過在Mapper接口中定義一個返回類型為int的方法,并使用@InsertProvider、@UpdateProvider和@DeleteProvider注解來指定相應的動態SQL提供者。例如:
java
@Mapper
public interface UserMapper {@InsertProvider(type = BatchInsertProvider.class, method = "insert")int batchInsert(List<User> userList);
}public class BatchInsertProvider {public String insert(Map<String, Object> map) {List<User> userList = (List<User>) map.get("list");StringBuilder sb = new StringBuilder();sb.append("INSERT INTO user (username) VALUES ");for (User user : userList) {sb.append("(#{item.username}),");}sb.deleteCharAt(sb.length() - 1);return sb.toString();}
}List<User> userList = new ArrayList<>();
userList.add(new User("user1"));
userList.add(new User("user2"));int result = userMapper.batchInsert(userList);
  1. 上面的示例中,BatchInsertProvider是一個動態SQL提供者,根據傳入的參數動態生成批量插入語句。batchInsert方法接受一個包含多個User對象的集合,并返回插入成功的記錄數。
    需要注意的是,使用批量插入/更新/刪除語句時,對應的Mapper方法的返回類型必須為int,表示插入/更新/刪除的記錄數。

插件擴展

插件是用于擴展和增強MyBatis框架功能的組件。它可以攔截MyBatis的執行過程,實現一些自定義的邏輯。
常用的MyBatis插件擴展

  1. 攔截器(Interceptor):Interceptor接口,可以在MyBatis執行的各個階段攔截方法調用,并加入自定義的邏輯。常見的用途包括日志記錄、權限控制、結果集處理等。
  2. 類型處理器(Type Handler):類型處理器用于將Java類型與數據庫中的數據類型進行轉換。可以通過實現TypeHandler接口,自定義類型轉換邏輯,以支持自定義的數據類型。
  3. 參數處理器(Parameter Handler):參數處理器用于將Java對象轉換為SQL語句的參數。通過實現TypeHandler接口,可以實現自定義的參數轉換邏輯。
  4. 數據源(DataSource):MyBatis默認使用的是JDBC連接池來管理數據庫連接。通過實現DataSource接口,可以自定義數據源,以實現對其他連接池的支持。

持久化和ORM

  1. 持久化就是程序的數據,在瞬時狀態(new)和持久狀態(數據庫等)之間轉化。通過數據庫操作進行轉化。
    • 瞬態狀態指的是對象在沒有被持久化到數據庫之前的狀態。在瞬態狀態下,對象的屬性可能已經被賦值,但這些改變還沒有被保存到數據庫中。
    • 持久狀態是指對象在數據庫中的持久化狀態,它提供了方便的數據庫訪問和操作方式,同時支持緩存以提高查詢效率。
  2. ORM.(O=javaBean)(R=關系型數據庫)(M=映射)
    • JavaBean是指遵循特定命名約定和規范的Java類,用來封裝數據和提供訪問這些數據的方法。它是Java語言中一種編程規范。
    • 關系型數據庫(Relational Database)是指采用了關系模型的數據庫管理系統。關系模型是由埃德加·科德提出的,它將數據組織為表格的形式,表格由行和列組成。關系型數據庫通過在不同表格之間建立關系(通過主鍵和外鍵),來表示實體之間的聯系。
    • 映射是一個廣泛應用的概念,在不同的領域中有著不同的含義和作用,但核心的概念都是將一個對象或值關聯到另一個對象或值上的過程或規則。
    • 注意:ORM這三方面要保持一致。任意部分的變動都要一起檢測。

緩存機制

  1. 一級緩存
    • session級別的緩存。
    • 默認都會有,不需要手動開啟。
    • 線程不共享的。
    • 當session關閉或者flush時。session清空。
  2. 二級緩存
    • sessionFactroy級別的緩存。同一個namespace內的select會被緩存。
    • 默認緩存不開啟。需要手動開啟。
    • 線程共享。
    • 當進行增刪改的時候,緩存將被清空。
  3. 二級緩存開啟的步驟
    • 在mybatis的主配置文件中,開啟緩存
<configuration><settings><setting name="cacheEnable" value="true"/><setting name="lazyLoadingEnabled" value="false"/></settings>
</configuration>
  • 在mapper中的設置緩存
<cacheeviction="FIFO"    // 回收策略flushInterval="60000"  // 緩存刷新的間隔時間size="512"         // 緩存大小readOnly="true" />  // 默認時false,表示其他線程調用都是復制緩存對象。如果為true,線程使用的時原始的緩存對象

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39488.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39488.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39488.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java SpringBoot Vue智能停車系統

基礎環境 JDK1.8、Maven、Mysql、IntelliJ IDEA 內置功能 系統管理&#xff1a;角色管理、接口管理、系統菜單、全局配置 賬號管理&#xff1a;用戶管理、合作單位 系統監控&#xff1a;監控大屏、日志監控 財務管理&#xff1a;訂單列表 停車記錄&#xff1a;停車記錄 車輛管…

Labview選項卡之實現被選擇選項卡工作

文章目錄 前言一、使用選項卡二、實現被選擇選項卡工作1、需求2、分析3、實現①、前面板②、程序框圖 三、效果展示四、源碼自取 前言 有些時候&#xff0c;我們做界面&#xff0c;需要好多個界面切換。如果是同一個 VI 里界面切換&#xff0c;一般都是選項卡了。切換不同選項…

使用phpstorm開發調試thinkphp

1.環境準備 1.開發工具下載&#xff1a;PhpStorm: PHP IDE and Code Editor from JetBrains 2.PHP下載&#xff1a;PHP: Downloads 3. PHP擴展&#xff1a;PECL :: Package search 4.用與調試的xdebug模塊&#xff1a; Xdebug: Downloads xdebug模塊&#xff0c;如果是php8以…

23.8.16日總結

原先寫的評論是每級評論用縮進來區分&#xff0c;所以最多設置的是九級評論&#xff0c;修改了排版和格式&#xff1a; 還有管理員頁面&#xff0c;查看文章時可以進行點贊&#xff0c;收藏的操作&#xff0c;現在進行了修改&#xff0c;將相關操作隱藏。 還有點擊查看未發布…

js如何獲取字符串大小是幾M

js如何獲取字符串大小是幾M 在JavaScript中&#xff0c;可以使用以下方法來獲取字符串的大小&#xff08;以字節為單位&#xff09;&#xff1a; function getStringSizeInBytes(str) {// 使用UTF-8編碼計算字符串的字節長度let totalBytes new Blob([str]).size;// 將字節長…

14-矩陣相乘及其運算法則

矩陣與向量的乘法 在這一篇文章中我們就將基于上一篇重新審視矩陣的這個視點來理解矩陣的乘法&#xff0c;那么在這一篇&#xff0c;我們主要來看一下矩陣和向量的乘法。這里這個線性方程組是上一小節給大家舉的模擬的一個非常簡單的小型經濟系統的例子&#xff0c;我們可以把…

文件的導入與導出

文章目錄 一、需求二、分析1. Excel 表格數據導出2. Excel 表格數據導入一、需求 在我們日常開發中,會有文件的導入導出的需求,如何在 vue 項目中寫導入導出功能呢 二、分析 以 Excel 表格數據導出為例 1. Excel 表格數據導出 調用接口將返回的數據進行 Blob 轉換,附: 接…

logstash日志換行處理小解

logstash主用于日志實時數據收集、解析&#xff0c;并將數據轉發的工具&#xff0c;內置的功能也相當強大。但&#xff0c;同時意味著&#xff0c;他可能接收到各種情況的數據。 此處&#xff0c;我們主要講解我實際使用中&#xff0c;碰到的一個小問題&#xff0c;換行(\n)。…

redis 和 mongodb 比較

Redis和MongoDB是兩種不同類型的數據庫&#xff0c;它們在數據存儲和查詢方式、數據模型以及適用場景等方面有一些明顯的區別。下面是Redis和MongoDB之間的一些比較&#xff1a; 數據模型&#xff1a; Redis&#xff1a;Redis是一個鍵值存儲系統&#xff0c;支持多種數據結構如…

FPGA應用學習筆記--時鐘域的控制 亞穩態的解決

時鐘域就是同一個時鐘的區域&#xff0c;體現在laways語句邊緣觸發語句中&#xff0c;設計規模增大就會導致時鐘不同步&#xff0c;有時差&#xff0c;就要設計多時鐘域。 會經過與門的延時產生的新時鐘域&#xff0c;這種其實不推薦使用&#xff0c;但在ascl里面很常見 在處理…

八大排序超詳解(動圖+源碼)

&#x1f493;博主個人主頁:不是笨小孩&#x1f440; ?專欄分類:數據結構與算法&#x1f440; 刷題專欄&#x1f440; C語言&#x1f440; &#x1f69a;代碼倉庫:笨小孩的代碼庫&#x1f440; ?社區&#xff1a;不是笨小孩&#x1f440; &#x1f339;歡迎大家三連關注&…

虛幻5中Lumen提供哪些功能以及如何工作的

虛幻引擎 5 中的 Lumen 是一個完全動態的全局照明和反射系統。它可以在虛幻引擎 5 中使用&#xff0c;因此創作者無需自行設置。它是為下一代控制臺和建筑可視化等高端可視化而設計的。那么它提供了哪些功能以及如何工作&#xff1f; 全局照明 當光離開光源時&#xff0c;它會…

負載均衡搭建

LVS-DR部署 [客戶端] node1 192.168.157.148 [lvs] node2 192.168.157.142 [web服務器] node3 192.168.157.145 node4 192.168.157.146&#xff08;1&#xff09;[lvs] yum install -y ipvsadm.x86_64 配置LVS負載均衡服務 &#xff08;1&#xff09;手動添加LVS轉發1&#xff…

系統架構設計專業技能 · 軟件工程之軟件測試與維護(六)【系統架構設計師】

系列文章目錄 系統架構設計專業技能 網絡規劃與設計&#xff08;三&#xff09;【系統架構設計師】 系統架構設計專業技能 系統安全分析與設計&#xff08;四&#xff09;【系統架構設計師】 系統架構設計高級技能 軟件架構設計&#xff08;一&#xff09;【系統架構設計師…

MAVEN利器:一文帶你了解MAVEN以及如何配置

前言&#xff1a; 強大的構建工具——Maven。作為Java生態系統中的重要組成部分&#xff0c;Maven為開發人員提供了一種簡單而高效的方式來構建、管理和發布Java項目。無論是小型項目還是大型企業級應用&#xff0c;Maven都能幫助開發人員輕松處理依賴管理、編譯、測試和部署等…

YOLOV7改進:加入RCS-OSA模塊,提升檢測速度

1.該文章屬于YOLOV5/YOLOV7/YOLOV8改進專欄,包含大量的改進方式,主要以2023年的最新文章和2022年的文章提出改進方式。 2.提供更加詳細的改進方法,如將注意力機制添加到網絡的不同位置,便于做實驗,也可以當做論文的創新點。 2.漲點效果:RCS-OSA模塊更加輕量化,有效提升檢…

Spring Boot業務代碼中使用@Transactional事務失效踩坑點總結

1.概述 接著之前我們對Spring AOP以及基于AOP實現事務控制的上文&#xff0c;今天我們來看看平時在項目業務開發中使用聲明式事務Transactional的失效場景&#xff0c;并分析其失效原因&#xff0c;從而幫助開發人員盡量避免踩坑。 我們知道 Spring 聲明式事務功能提供了極其…

uniapp條件編譯

uniapp條件編譯 uni-app 將已經將可以跨平臺兼容處理的組件及 API 等進行了封裝&#xff0c;但是部分平臺的特性無法跨平臺。 由此&#xff0c;uni-app 提供了條件編譯的方案&#xff0c;來處理不同平臺的特定或差異。 寫法 #ifdef&#xff1a; 僅在某平臺存在#ifndef&#xf…

Kafka 01——Kafka的安裝及簡單入門使用

Kafka 01——Kafka的安裝及簡單入門使用 1. 下載安裝1.1 JDK的安裝1.2 Zookeeper的安裝1.2.1 關于Zookeeper版本的選擇1.2.2 下載、安裝Zookeeper 1.3 kafka的安裝1.3.1 下載1.3.2 解壓1.3.3 修改配置文件 2. 啟動 kafka2.1 Kafka啟動2.2 啟動 kafka 遇到的問題2.2.1 問題12.2.…

Python愛心光波

文章目錄 前言Turtle入門簡單案例入門函數 愛心光波程序設計程序分析 尾聲 前言 七夕要來啦&#xff0c;博主在閑暇之余創作了一個愛心光波&#xff0c;感興趣的小伙伴們快來看看吧&#xff01; Turtle入門 Turtle 是一個簡單而直觀的繪圖工具&#xff0c;它可以幫助你通過簡…