開發使用mybatis是用混合模式還是全注解模式

在使用 MyBatis 開發項目時,Mapper 接口是為數據庫操作提供最直觀的方法,但在實現方式上,我們有兩種選擇:全注解模式和混合模式。那么,他們有什么區別,應該如何選擇?我們一起來討論一下。

一、全注解模式

全注解模式,兩個字:直接。不過在 Mapper 接口中加上注解,將數據庫操作直接通過 SQL 語句控制,想查詢就用?@Select,想插入就用?@Insert,完全是一樣的操作體驗。

實現樣例

這里有一個基礎的用戶操作 Mapper:

@Mapper
publicinterfaceUserMapper?{@Insert("INSERT INTO user (username, password, role) VALUES (#{username}, #{password}, #{role})")@Options(useGeneratedKeys = true, keyProperty = "id")voidinsertUser(User user);@Select("SELECT * FROM user WHERE username = #{username}")User?findByUsername(String username);@Update("UPDATE user SET password = #{password} WHERE id = #{id}")voidupdatePassword(@Param("id")?Integer id,?@Param("password")?String password);
}
優勢
  • ? 文件構成簡單,文件自帶直觀性。

  • ? SQL 語句在全注解模式下直觀且清晰,這種方式能夠減少錯誤的發生,尤其是在接口簡單、邏輯清晰的情況下。

  • ? 適合小應用或數據庫表規模較簡單的場景。

不足
  • ? SQL 語句直接嵌入代碼中,容易導致代碼臃腫:當查詢邏輯變復雜時,大量 SQL 會堆積在接口文件中,導致文件過長且難以維護。

  • ? 擴展性差:復雜的查詢條件需要硬編碼在注解中,無法靈活調整,尤其對于需要動態拼接 SQL 的場景顯得力不從心。

  • ? 團隊協作時難以分工:開發人員需要同時熟悉 SQL 和 Java,且 SQL 的變更可能需要修改接口文件,增加溝通成本。

二、混合模式

混合模式,是使用“接口聲明 + XML 配置文件”的方式實現。Mapper 接口直接定義操作類型,而 SQL 語句則存在于配置文件中

實現樣例

一個復雜旅游線路查詢 Mapper:

@Mapper
publicinterfaceTourLineMapper?{List<TourLine>?filterTourLines(@Param("destination")?String destination,@Param("minPrice")?Double minPrice,@Param("maxPrice")?Double maxPrice,@Param("minDuration")?Integer minDuration,@Param("maxDuration")?Integer maxDuration);
}

優勢體現在 XML 配置文件中:

<selectid="filterTourLines"parameterType="map"resultType="TourLine">SELECT * FROM tour_lineWHERE 1 = 1<iftest="destination != null">AND destination = #{destination}</if><iftest="minPrice != null">AND price >= #{minPrice}</if><iftest="maxPrice != null">AND price <= #{maxPrice}</if><iftest="minDuration != null">AND duration >= #{minDuration}</if><iftest="maxDuration != null">AND duration <= #{maxDuration}</if>
</select>

結構解讀

<select>?標簽
  • ? 定義了一個?filterTourLines?查詢方法,與 Java 中的接口方法對應。

  • ??parameterType="map"?指定了傳入的參數類型是一個 Map(常見場景中,通過?@Param?傳遞多個參數時,MyBatis 會將其轉換為 Map)。

  • ??resultType="TourLine"?定義了查詢結果的返回類型為?TourLine?對象。

WHERE 1 = 1

這是一種防止 SQL 拼接錯誤的技巧,為后續條件拼接提供基礎,即使沒有后續條件,SQL 也不會因為沒有 WHERE 子句而報錯。

動態條件(<if>?標簽)

<if>?是 MyBatis 動態 SQL 的重要組成部分,用于判斷條件是否為 true,從而決定是否拼接該部分 SQL。

例如:

<iftest="destination != null">AND destination = #{destination}</if>

如果?destination?參數不為空,就會將?AND destination = #{destination}?拼接到最終的 SQL 語句中。

參數替換

每個條件中的?#{}?會被傳入的參數動態替換為具體值,保證查詢的安全性,防止 SQL 注入。

編寫技巧

SQL 拼接優雅性

使用?<if>?標簽時,可以避免在 Java 代碼中手動拼接 SQL,提高代碼的可讀性和維護性。

參數命名一致性

確保 XML 文件中的參數名稱與 Java 接口方法中?@Param?注解指定的名稱一致,否則會導致參數映射失敗。

靈活性

如果需要更多動態條件,比如基于某個字段的排序,可以在<if>標簽外部增加?<choose>?<when>標簽實現更復雜的邏輯。

例如:

<choose><whentest="sortField != null and sortDirection != null">ORDER BY ${sortField} ${sortDirection}</when><otherwise>ORDER BY id ASC</otherwise>
</choose>
適用場景

這段動態 SQL 非常適合以下場景:

  • ? 參數較多且查詢條件可能動態變化,比如多字段過濾、范圍查詢等。

  • ? 查詢的復雜度較高,不適合直接寫在 Java 中,分離到 XML 更易維護。

優勢
  • ??加強了 SQL 實現的優雅性:?復雜的查詢可以在 XML 文件中通過加入條件轉換,條件拼接更加靈活,避免硬編碼。

  • ??分離關注點,降低耦合:?Java 和 SQL 各司其職,Java 專注業務邏輯,SQL 專注數據操作,改動時互不干擾。

  • ??適合復雜查詢與大項目:?對于動態查詢需求較高的大型項目,混合模式顯得尤為重要,XML 配置文件支持強大的動態 SQL 功能(如?<if><choose>?等)。

不足
  • ??學習成本較高:?需要同時掌握接口聲明和 XML 文件配置的語法,對初學者來說可能較難上手。

  • ??文件分散,調試不便:?SQL 語句分散在 XML 文件中,可能導致維護時需要在多個文件間切換。

  • ??開發速度稍慢:?相比全注解模式,混合模式的開發速度會稍有降低,尤其是在小型項目中。

三、如何選擇?

  • ??如果你的項目規模較小,數據表結構簡單,查詢邏輯以基礎的增刪改查為主,可以選擇全注解模式。它能夠快速上手,開發效率高,適合對時間要求較高的場景。

  • ??如果你的項目規模較大,查詢邏輯復雜且動態變化較多,建議選擇混合模式。它的靈活性和可維護性更強,能夠為復雜需求提供更好的支持。

  • ??團隊協作時,混合模式的分離設計可以降低溝通成本,尤其對于 SQL 改動頻繁的項目。

無論選擇哪種模式,最重要的是根據項目需求靈活運用,選擇最適合自己團隊和業務的方式。

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

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

相關文章

WS2812燈帶效果設計器上位機

軟件使用方法介紹&#xff1a;bilibili地址 【免寫單片機代碼WS2812燈帶效果設計軟件-嗶哩嗶哩】 https://b23.tv/xFhxMGm

Docker 容器(二)

Docker四、Docker容器數據卷1.數據卷的主要特點2.卷的共享與繼承&#xff08;1&#xff09;卷的共享&#xff08;Sharing&#xff09;(2) 卷的繼承&#xff08;Inheritance&#xff09;3.數據卷運行實例五、Dockerfile1.Dockerfile2. 創建一個名為 myubuntu的自定義鏡像第 1 步…

PCB基礎細節--工藝篇

pcb基礎細節&#xff08;工藝篇&#xff09; 1. 孔與焊盤2. PCB各層之間的作用3. 阻抗匹配 3.1. 什么是傳輸線&#xff1f;我們只看特性阻抗&#xff0c;時延以后再說。 在畫原理圖時&#xff0c;我們把電阻&#xff0c;電容&#xff0c;電感是抽象成一個點了。兩邊加一個電壓&…

信創服務器總死機原因及解決辦法

哈嘍&#xff0c;你好啊&#xff0c;我是雷工&#xff01;最近有個項目使用信創的服務器&#xff0c;總是出現死機的情況&#xff0c;聯系廠家檢查了一下&#xff0c;說是沐創網卡固件較低造成的&#xff0c;讓移除網卡或升級固件嘗試一下。記得5月份按廠家的說法處理過一臺&am…

03_網關ip和端口映射(路由器轉發)操作和原理

網關ip和端口映射&#xff08;路由器轉發&#xff09;操作和原理IP 與端口映射配置全指南&#xff1a;2 種方案搞定外網訪問內網一、先搞懂&#xff1a;為什么需要 IP 與端口映射&#xff1f;二、方案一&#xff1a;路由器端口映射&#xff08;適合有公網 IP&#xff0c;長期穩…

「數據獲取」《安徽建設統計年鑒》(2002-2007)(2004、2006缺失)(獲取方式看綁定的資源)

01、數據簡介《安徽建設統計年鑒》是一部全方位反映安徽省建設事業發展變遷的重要統計資料著作。該書系統收集并精心整理了 2006 年度安徽省城鄉建設領域的核心統計數據&#xff0c;涵蓋城鄉建設固定資產投資、建筑業發展態勢、城鎮建設推進情況等多個關鍵方面&#xff0c;為政…

Python/JS/Go/Java同步學習(第一篇)格式化/隱藏參數一鍋端 四語言輸出流參數宇宙(附源碼/截圖/參數表/避坑指南/老板沉默術)

&#x1f91d; 免罵聲明&#xff1a; 本文四語言輸出流參數經本蜀黎實戰整理&#xff0c;旨在提供快速參考指南&#x1f4dd;因各語言版本迭代及不同系統環境差異&#xff0c;偶爾可能出現整理不全面之處&#xff0c;實屬正常?歡迎理性交流補充&#xff0c;噴子勿噴——畢竟你…

人工智能助力流感疫苗選擇:MIT 團隊推出 VaxSeer 系統

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

使用 qmake 生成 Makefile,Makefile 轉換為 Qt 的 .pro 文件

使用 qmake 生成 Makefile 的完整指南 qmake 是 Qt 提供的構建工具&#xff0c;用于從 .pro 項目文件生成 Makefile。以下是詳細的使用方法&#xff1a; 基本使用方法 1. 從 .pro 文件生成 Makefile bash qmake -o Makefile your_project.pro2. 直接運行 qmake&#xff08;自動…

利用DeepSeek編寫驗證xlsx格式文件中是否啟用sharedStrings.xml對讀寫效率影響python程序

讓他分別用100*10000個單元格有100、1000、10000個不同的1-200字符長的大寫英文字母字符串測試. 一開始DeepSeek沒有找到啟用sharedStrings.xml的寫xlsx模塊&#xff0c;我自己找了pyxlsbwriter的例子告訴他才改好的。 import os import time import random import string impo…

【C++框架#2】gflags 和 gtest 安裝使用

spdlog 安裝和使用 1. 概述 介紹&#xff1a;spdlog 是一個高性能、超快速、零配置的 C 日志庫&#xff0c;它旨在提供簡潔的 API 和豐富的功能&#xff0c;同時保持高性能的日志記錄。它支持多種輸出目標、格式化選項、線程安全以及異步日志記錄。 github 鏈接&#xff1a;htt…

平衡掌控者-游戲數值戰斗設計

一、有效生命值1、計算公式有效生命生命值/&#xff08;1-傷害減免率&#xff09;/&#xff08;1-閃避率&#xff09;2、前搖和后搖對數值來說&#xff0c;戰斗由兩大模塊組成&#xff0c;一個是戰斗公式生效前的戰斗攻擊流程&#xff0c;一個是戰斗公式與自身流程。比如說&…

使用DataLoader加載本地數據 食物分類案例

目錄 一.食物分類案例 1..整合訓練集測試集文檔 2.導入相關的庫 3.設置圖片數據的格式轉換 3.數據處理 4.數據打包 5.定義卷積神經網絡 6.創建模型 7.訓練和測試方法定義 8.損失函數和優化器 9.訓練模型&#xff0c;測試準確率 10.測試模型 之前我們DataLoader加載…

從零開始的python學習——函數(2)

? ? ? ? ? づ?ど &#x1f389; 歡迎點贊支持&#x1f389; 個人主頁&#xff1a;勵志不掉頭發的內向程序員&#xff1b; 專欄主頁&#xff1a;python學習專欄&#xff1b; 文章目錄 前言 一、變量作用域 二、函數執行過程 三、鏈式調用 四、嵌套調用 五、函數遞歸 六、…

RAG 的完整流程是怎么樣的?

RAG&#xff08;檢索增強生成&#xff09;的完整流程可分為5個核心階段&#xff1a;數據準備&#xff1a;清洗文檔、分塊處理&#xff08;如PDF轉文本切片&#xff09;&#xff1b;向量化&#xff1a;使用嵌入模型&#xff08;如BERT、BGE&#xff09;將文本轉為向量&#xff1…

研發文檔版本混亂的根本原因是什么,怎么辦

研發文檔版本混亂的根本原因通常包括缺乏統一的版本控制制度、團隊協作不暢、文檔管理工具使用不當以及項目需求頻繁變化等因素。這些問題使得研發團隊在日常工作中容易出現文檔版本混亂的情況&#xff0c;導致信息的不一致性、溝通不暢以及開發進度的延誤。為了解決這一問題&a…

ChartView的基本使用

Qt ChartView&#xff08;準確類名 QChartView&#xff09;是 Qt Charts 模塊里最常用的圖表顯示控件。一句話概括&#xff1a;“它把 QChart 畫出來&#xff0c;并自帶縮放、平移、抗鋸齒等交互能力”。QML ChartView 簡介&#xff08;一句話先記住&#xff1a;ChartView 是 Q…

系統擴展策略

1、核心指導思想&#xff1a;擴展立方體 在討論具體策略前&#xff0c;先了解著名的擴展立方體&#xff08;Scale Cube&#xff09;&#xff0c;它定義了三種擴展維度&#xff1a; X軸&#xff1a;水平復制&#xff08;克隆&#xff09; 策略&#xff1a;通過負載均衡器&#…

HBuilder X 4.76 開發微信小程序集成 uview-plus

簡介 本文記錄了在HBuilder中創建并配置uni-app項目的完整流程。 首先創建項目并測試運行&#xff0c;確認無報錯后添加uView-Plus組件庫。 隨后修改了main.js、uni.scss、App.vue等核心文件&#xff0c;配置manifest.json并安裝dayjs、clipboard等依賴庫。 通過調整vite.c…

第4章:內存分析與堆轉儲

本章概述內存分析是 Java 應用性能調優的核心環節之一。本章將深入探討如何使用 VisualVM 進行內存分析&#xff0c;包括堆內存監控、堆轉儲生成與分析、內存泄漏檢測以及內存優化策略。通過本章的學習&#xff0c;你將掌握識別和解決內存相關問題的專業技能。學習目標理解 Jav…