從 MyBatis 到 MyBatis - Plus:@Options 注解的那些事兒

在 MyBatis 以及 MyBatis - Plus 的開發過程中,注解的使用是提升開發效率和實現特定功能的關鍵。今天我們就來聊聊 @Options 注解,以及在 MyBatis - Plus 中它的使用場景和替代方案。

一、MyBatis 中的 @Options 注解

在 MyBatis 框架中,@Options 注解是一個非常實用的注解,它主要用于配置 mapper 接口方法的一些執行選項,像緩存、結果集處理、主鍵生成等方面都能用到它。

1. 新增數據時獲取自增主鍵

在實際開發中,當我們向數據庫中插入一條新數據時,常常需要立即獲取這條數據的自增主鍵,以便進行后續的關聯操作。在 MyBatis 中,借助 @Options 注解就能輕松實現這一功能。

例如,有一個用戶表 user,其 id 是自增主鍵,對應的實體類 User 和 mapper 接口 UserMapper 如下:

// User實體類public class User {private Long id; // 自增主鍵private String username;private String email;// 省略getter和setter方法}// UserMapper接口public interface UserMapper {/*** 新增用戶并獲取自增主鍵*/@Insert("INSERT INTO user(username, email) VALUES(#{username}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")void insertUser(User user);}

在業務層調用時,插入數據后可以直接通過 user.getId () 獲取自增的主鍵:

@Servicepublic class UserService {@Autowiredprivate UserMapper userMapper;public Long addUser(User user) {userMapper.insertUser(user);return user.getId(); // 插入后直接獲取自增主鍵}}

這里,@Options 注解的 useGeneratedKeys 屬性設置為 true,表示開啟自動生成主鍵功能;keyProperty 屬性指定了主鍵值要注入到 User 對象的 id 屬性中;keyColumn 屬性則指定了數據庫表中的主鍵列名,當與實體類的屬性名一致時可以省略。通過這樣的配置,避免了插入數據后再查詢一次主鍵的額外操作,大大提升了性能。

2. 高頻查詢配置緩存

對于一些高頻訪問但不常變更的數據,比如網站首頁的熱門商品列表,我們可以通過 @Options 注解配置 MyBatis 二級緩存,從而減少數據庫的訪問壓力。

// Product實體類(需要實現Serializable接口,因為緩存要求序列化)public class Product implements Serializable {private Long id;private String name;private BigDecimal price;// 省略getter和setter方法}// ProductMapper接口public interface ProductMapper {/*** 查詢熱門商品列表,啟用緩存*/@Select("SELECT id, name, price FROM product WHERE is_hot = 1 ORDER BY sort DESC LIMIT 10")@Options(useCache = true, flushCache = Options.FlushCachePolicy.FALSE, timeout = 5000)List<Product> getHotProducts();/*** 更新商品信息后刷新緩存,避免緩存臟數據*/@Update("UPDATE product SET name = #{name}, price = #{price} WHERE id = #{id}")@Options(flushCache = Options.FlushCachePolicy.TRUE)void updateProduct(Product product);}

在上面的代碼中,getHotProducts 方法通過 @Options 注解配置了 useCache = true,啟用了二級緩存,這樣后續的請求就可以直接從緩存中獲取數據,而不用每次都訪問數據庫。同時,設置 flushCache = Options.FlushCachePolicy.FALSE,表示查詢后不刷新緩存。而 updateProduct 方法設置 flushCache = Options.FlushCachePolicy.TRUE,意味著更新操作后會刷新緩存,避免了緩存中出現臟數據。

3. 大數據量查詢優化

當處理大數據量查詢,比如導出訂單報表時,一次性加載過多數據可能會導致內存溢出。這時,我們可以使用 @Options 注解的 fetchSize 屬性來控制 JDBC 每次從數據庫讀取的行數,進行分批讀取,降低內存占用。

// OrderMapper接口public interface OrderMapper {/*** 批量查詢訂單,用于報表導出*/@Select("SELECT id, order_no, amount, create_time FROM `order` WHERE create_time BETWEEN #{startTime} AND #{endTime}")@Options(fetchSize = 1000, resultSetType = ResultSetType.FORWARD_ONLY)List<Order> queryOrdersByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);}

這里,fetchSize = 1000 表示每次從數據庫讀取 1000 行數據,resultSetType = ResultSetType.FORWARD_ONLY 設置結果集為只向前滾動,配合 fetchSize 可以達到分批讀取數據的效果,有效優化了大數據量查詢時的內存占用。

二、MyBatis - Plus 中的情況

MyBatis - Plus 是在 MyBatis 基礎上的增強工具,它對很多常見功能進行了更簡潔的封裝,在很多場景下不需要顯式使用 @Options 注解。

1. 主鍵生成

MyBatis - Plus 提供了 @TableId 注解專門用于主鍵配置,支持多種主鍵策略,完全可以替代 @Options 注解在主鍵生成方面的功能。

例如,對于自增主鍵,我們可以這樣配置:

// 實體類public class User {// 配置主鍵自增,等價于MyBatis中@Options(useGeneratedKeys = true, keyProperty = "id")@TableId(type = IdType.AUTO)private Long id;private String username;// 省略其他字段和getter、setter方法}// Mapper接口(直接繼承BaseMapper,無需編寫SQL語句)public interface UserMapper extends BaseMapper<User> {// 插入后可以直接通過user.getId()獲取自增主鍵}// 調用方式User user = new User();user.setUsername("testUser");userMapper.insert(user);Long id = user.getId(); // 直接獲取自增主鍵

MyBatis - Plus 的 IdType.AUTO 會自動處理插入后返回主鍵的邏輯,非常方便。而且,它還支持其他主鍵策略,如 UUID、雪花算法等,當使用這些策略時,甚至不需要數據庫設置自增,更加靈活。

2. 緩存控制

MyBatis - Plus 并沒有改變 MyBatis 的緩存機制,所以如果我們使用 MyBatis 原生的二級緩存,@Options 注解仍然有效。不過,MyBatis - Plus 推薦使用 @CacheNamespace 注解在 Mapper 接口上統一配置緩存,這種方式比在每個方法上分散使用 @Options 注解更簡潔。

// 使用@CacheNamespace統一配置緩存(推薦)@CacheNamespace(implementation = MybatisRedisCache.class, eviction = LruCache.class, flushInterval = 60000)public interface ProductMapper extends BaseMapper<Product> {// 所有方法默認使用緩存,無需在每個方法上添加@Options注解}// 個別方法需要特殊配置時,仍可以使用@Options注解覆蓋默認配置@Select("SELECT * FROM product WHERE id = #{id}")@Options(useCache = false) // 該方法不使用緩存Product getProductById(Long id);

3. 其他參數配置

對于 fetchSize、timeout 等參數,MyBatis - Plus 沒有進行額外的封裝,所以在需要這些配置時,仍然需要使用 @Options 注解。

public interface OrderMapper extends BaseMapper<Order> {// 自定義批量查詢SQL,設置fetchSize和timeout優化性能@Select("SELECT * FROM `order` WHERE status = #{status}")@Options(fetchSize = 1000, timeout = 10000)List<Order> selectByStatus(@Param("status") Integer status);}

三、總結

@Options 注解在 MyBatis 中有著重要的作用,能幫助我們實現主鍵獲取、緩存控制、大數據量查詢優化等功能。而在 MyBatis - Plus 中,由于其對常見功能進行了封裝,在主鍵生成方面,我們可以使用 @TableId 注解替代 @Options;在緩存控制方面,推薦使用 @CacheNamespace 注解進行統一配置;但對于 fetchSize、timeout 等參數,仍然需要使用 @Options 注解來配置。

了解這些知識點,能讓我們在使用 MyBatis 和 MyBatis - Plus 進行開發時,更加靈活地處理各種業務場景,提高開發效率和系統性能。

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

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

相關文章

轉換圖(State Transition Diagram)和時序圖(Sequence Diagram)畫圖流程圖工具

針對程序員繪制狀態轉換圖&#xff08;State Transition Diagram&#xff09;和時序圖&#xff08;Sequence Diagram&#xff09;的需求&#xff0c;以下是一些好用的工具推薦&#xff0c;涵蓋在線工具、桌面軟件和基于文本的工具&#xff0c;適合不同場景和偏好。這些工具在易…

基于php的在線酒店管理系統(源代碼+文檔+PPT+調試+講解)

課題摘要在旅游住宿行業數字化轉型的背景下&#xff0c;傳統酒店管理存在房態更新滯后、預訂渠道分散等問題。基于 PHP 的在線酒店管理系統&#xff0c;憑借其開發高效、兼容性強的特點&#xff0c;構建集客房管理、預訂處理、客戶服務于一體的綜合性管理平臺。 系統核心功能包…

視頻質量檢測中卡頓識別準確率↑32%:陌訊多模態評估框架實戰解析

原創聲明本文為原創技術解析&#xff0c;核心技術參數與架構設計引用自《陌訊技術白皮書》&#xff0c;禁止未經授權的轉載與改編。一、行業痛點&#xff1a;視頻質量檢測的現實挑戰在實時流媒體、在線教育、安防監控等領域&#xff0c;視頻質量直接影響用戶體驗與業務可信度。…

流式輸出阻塞原因及解決辦法

流式輸出不懂可看這篇文章&#xff1a;流式輸出&#xff1a;概念、技巧與常見問題 正常情況&#xff0c;如下代碼所示&#xff1a; async def event_generator():# 先輸出數字1yield "data: 1\n\n"# 然后每隔2秒輸出數字2&#xff0c;共輸出10次for i in range(10):…

linux系統----Ansible中的playbook簡單應用

目錄 Playbooks中tasks語法使用 1、file 創建文件&#xff1a;touch 創建目錄&#xff1a;directory 2、lineinfile 修改文件某一行文本 3、replace 根據正則表達式替換文件內容&#xff08;指定換字符串&#xff09; 5、template/copy 模板作用類似于copy&#xff0…

bmcweb工作流程

在openbmc中,bmcweb是一個web服務程序,類似于lighttpd,提供web服務。本文將簡單介紹這個服務進程的執行流程。 bmcweb的入口函數main(). main() -> run() run()先注冊routes,最后調用app.run(). 第一個注冊的route為crow::webassets:requestRoutes(). crow::webasse…

傘狀Meta分析重構癌癥幸存者照護指南:從矛盾證據到精準決策

還記得你第一次做出Meta分析時的成就感嗎&#xff1f;那種從海量文獻中抽絲剝繭&#xff0c;最終得出可靠結論的感覺&#xff0c;簡直不要太爽&#xff01;但是&#xff0c;時代在進步&#xff0c;科研在卷動&#xff0c;Meta分析也有它的"升級版"——傘狀Meta分析&a…

IOMMU Client設備DMA配置過程分析(九)

1.設備樹 cp0_pcie0是一個PCIe RC控制器&#xff0c;使用SMMU將PCIe設備的IOVA轉換成物理地址&#xff0c;使用iommu-map-mask和iommu-map定義PCIe設備使用的Stream ID。設備樹定義如下所示。 [arch/arm64/boot/dts/marvell/armada-ap80x.dtsi] smmu: iommu100000 {compatibl…

使用node-cron實現Node.js定時任務

1. 簡介 node-cron 是一個輕量級的Node.js庫&#xff0c;用于在指定時間或間隔執行任務。它是Unix系統cron工具的JavaScript實現&#xff0c;適用于需要定時執行腳本的場景&#xff08;如數據備份、定期爬蟲等&#xff09;。 2. 安裝 npm install node-cron # 或 yarn add node…

前綴和-525.連續數組-力扣(LeetCode)

一、題目解析1、只包含0、1的二進制數組2、找到含有相同數量的0和1&#xff0c;并返回其子數組長度二、算法原理解法1&#xff1a;暴力枚舉 時間復雜度O(N^2)解法2&#xff1a;前綴和哈希表對于統計子數組中的0和1的數量有點困難&#xff0c;我們可以將其轉化一下轉化&#xff…

汽車電子控制系統開發的整體安全理念

1. 摘要在汽車制造商和一級供應商避免責任的背景下&#xff0c;公認的技術規則作為法律要求的標準具有重要的實際意義。道路車輛電子控制單元的安全性目前主要通過 ISO 26262 的要求和流程來保障。特別是隨著道路交通自動化程度的不斷提高以及現代車輛隨之而來的復雜性&#xf…

IDEA重新安裝常用設置

IDEA重新安裝常用設置 展示固定導航欄 項目構建和運行操作委托給maven 參考&#xff1a;IDEA build委托到Maven build

微服務的編程測評系統9-競賽新增-競賽編輯

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言1. 競賽新增1.1 競賽基本信息增加-后端開發1.2 競賽新增題目-后端1.3 競賽基本信息-前端1.4 競賽新增題目-前端2. 競賽編輯2.1 競賽詳情-后端2.2 競賽詳情-前端2…

《零基礎入門AI:線性回歸進階(梯度下降算法詳解)》

在上一篇博客中&#xff0c;我們學習了線性回歸的基本概念、損失函數&#xff08;如MSE&#xff09;以及最小二乘法。最小二乘法通過求解解析解&#xff08;直接計算出最優參數&#xff09;的方式得到線性回歸模型&#xff0c;但它有一個明顯的局限&#xff1a;當特征數量很多時…

基于C語言實現的KV存儲引擎(一)

基于C語言實現的KV存儲引擎項目簡介整體架構網絡模塊的實現recatorproactorNtyco項目簡介 本文主要是基于 C 語言來實現一個簡單的 KV 存儲架構&#xff0c;目的就是將網絡模塊跟實際開發結合起來。 首先我們知道對于數據的存儲可以分為兩種方式&#xff0c;一種是在內存中進…

c++和python聯合編程示例

安裝 C與 Python 綁定工具 pip install pybind11這其實相當于使用 python 安裝了一個 c的庫 pybind11,這個庫只由頭文件構成&#xff0c; 支持基礎數據類型傳遞以及 python 的 numpy 和 c的 eigen 庫之間的自動轉換。 編寫 CMakeList.txt cmake_minimum_required(VERSION 3.14)…

【OD機試題解法筆記】貪心歌手

題目描述 一個歌手準備從A城去B城參加演出。 按照合同&#xff0c;他必須在 T 天內趕到歌手途經 N 座城市歌手不能往回走每兩座城市之間需要的天數都可以提前獲知。歌手在每座城市都可以在路邊賣唱賺錢。 經過調研&#xff0c;歌手提前獲知了每座城市賣唱的收入預期&#xff1a…

AI: 告別過時信息, 用RAG和一份PDF 為LLM打造一個隨需更新的“外腦”

嘿&#xff0c;各位技術同學&#xff01;今天&#xff0c;我們來聊一個大家在使用大語言模型&#xff08;LLM&#xff09;時都會遇到的痛點&#xff1a;知識過時。 無論是像我一樣&#xff0c;用 Gemini Pro 學習日新月異的以太坊&#xff0c;還是希望它能精確掌握某個特定工具…

深度學習(魚書)day08--誤差反向傳播(后三節)

深度學習&#xff08;魚書&#xff09;day08–誤差反向傳播&#xff08;后三節&#xff09;一、激活函數層的實現 這里&#xff0c;我們把構成神經網絡的層實現為一個類。先來實現激活函數的ReLU層和Sigmoid層。ReLU層 激活函數ReLU&#xff08;Rectified Linear Unit&#xff…

C# 中生成隨機數的常用方法

1. 使用 Random 類&#xff08;簡單場景&#xff09; 2. 使用 RandomNumberGenerator 類&#xff08;安全場景&#xff09; 3. 生成指定精度的隨機小數 C# 中生成隨機數的常用方法&#xff1a; 隨機數類型實現方式示例代碼特點與適用場景隨機整數&#xff08;無范圍&#xf…