MyBatis 動態 SQL:讓 SQL 語句隨條件靈活變化

目錄

1.?動態SQL

1.1. if

1.1.1. 持久層接口添加方法

1.1.2.?映射文件添加標簽

1.1.3.?編寫測試方法

1.2.?where

1.3.?set

1.4.?choose、when、otherwise

1.5.?foreach

1.5.1.?遍歷數組

1.5.2.?遍歷Collection

1.5.3.?遍歷Map

2. 總結


前言

本文來講解MyBatis的動態SQL

集合代碼和圖片演示,旨在讓大家更好的理解(??????)??

個人主頁:藝杯羹🌿

系列專欄:本文ben'weben'wbenbeMyBbatis🚀

1.?動態SQL

一個查詢的方法的Sql語句不一定是固定的
比如電影選片,根據不同要求,Sql語句就會添加不同的查詢條件
如圖:


此時就需要在方法中使用動態Sql語句

1.1. if

?<if>?標簽內的Sql片段在滿足條件后才會添加,用法為:<if test="條件">?。例如:根據不同條件查詢用戶:

1.1.1. 持久層接口添加方法

// 用戶通用查詢
List<User> findByCondition(User user);

1.1.2.?映射文件添加標簽

<select id="findByCondition" parameterType="com.yibeigen.pojo.User" resultType="com.itbaizhan.pojo.User">select * from user where 1 = 1<if test = "username != null and username.length() != 0">and username like #{username}</if><if test = "sex != null and sex.length() != 0">and sex = #{sex}</if><if test="address != null and address.length() != 0">and address = #{address}</if>
</select>

1.1.3.?編寫測試方法

@Test
public void testFindByCondition(){User user = new User();List<User> users1 = userMapper2.findByCondition(user);//users1.forEach(System.out::println);user.setUsername("%金%");List<User> users2 = userMapper2.findByCondition(user);users2.forEach(System.out::println);user.setAddress("北京");List<User> users3 = userMapper2.findByCondition(user);users3.forEach(System.out::println);
}
  1. if中的條件不能使用 && / ||,而應該使用 and / or
  2. if中的條件可以直接通過屬性名獲取參數POJO的屬性值,并且該值可以調用方法。
  3. where后為什么要加1=1?
    任意條件都可能拼接到Sql中。如果有多個條件,從第二個條件開始前都需要加And關鍵字。加上1=1這個永久成立的條件,就不需要考慮后面的條件哪個是第一個條件,后面的條件前都加And關鍵字即可

1.2.?where

?<where>?可以代替sql中的 where 1=1 和 第一個and
更符合程序員的開發習慣,使用<where>?后的映射文件如下:

if 標簽放在 where 里

<select id="findByCondition" resultType="com.itbaizhan.user.User" parameterType="com.itbaizhan.user.User">select * from user<where><if test="username != null and username.length() != 0">username like #{username}</if><if test="sex != null and sex.length() != 0">and sex = #{sex}</if></where>
</select>

1.3.?set

<set>?標簽用在update語句中
借助<if>?,可以只對有具體值的字段進行更新
<set>?會自動添加set關鍵字,并去掉最后一個if語句中多余的逗號

<update id="update" parameterType="com.yibeigen.user.User">update user<set><if test="username != null and username.length() > 0">username = #{username},</if><if test="sex != null and sex.length() > 0">sex = #{sex},</if></set><where>id = #{id}</where>
</update>

1.4.?choose、when、otherwise

這些標簽表示多條件分支,類似JAVA中的switch...case
<choose>類似switch
<when>類似case
<otherwise>類似default
用法如下:

<select id="findByCondition" resultType="com.yibeigen.user.User" parameterType="com.yibeigen.user.User">select * from user<where><choose><when test="username.length() &lt; 5">username like #{username}</when><when test="username.length() &lt; 10">username = #{username}</when><otherwise>id = 1</otherwise></choose></where>
</select>

這段代碼的含義為:
用戶名 < 5 時使用 模糊查詢
用戶名 >= 5 并且 < 10 時使用 精確查詢
否則查詢id為1的用戶

1.5.?foreach

?<foreach>?類似 JAVA 中的for循環,可以遍歷集合數組。<foreach>?有如下屬性:

  • collection:遍歷的對象類型
  • open:開始的sql語句
  • close:結束的sql語句
  • separator:遍歷每項間的分隔符
  • item:表示本次遍歷獲取的元素,遍歷List、Set、數組時表示每項元素,遍歷map時表示鍵值對的值
  • index:遍歷List、數組時表示遍歷的索引,遍歷map時表示鍵值對的鍵

1.5.1.?遍歷數組

我們使用<foreach>?遍歷數組進行批量刪除

1. 持久層接口添加方法

void deleteBatch(int[] ids);

2.?映射文件添加標簽

<delete id="deleteBatch" parameterType="int">delete from user<where><foreach open="id in(" close=")" separator="," collection="array" item="id" >#{id}</foreach></where>
</delete>

3.?編寫測試方法

@Test
public void testDeleteBatch(){int[] ids = {5,8};userMapper.deleteBatch(ids);session.commit();
}


1.5.2.?遍歷Collection

?<foreach>?遍歷List和Set的方法是一樣的,我們使用<foreach>?遍歷List進行批量添加。

1. 持久層接口添加方法

void insertBatch(List<User> users);

2.?映射文件添加標簽

<insert id="insertBatch" parameterType="com.yibeigen.user.User">insert into user values<foreach collection="list" item="user" separator=",">(null ,#{user.username},#{user.birthday},#{user.sex},#{user.address})</foreach>
</insert>

3.?編寫測試方法

@Test
public void testInsertBatch(){User user1 = new User("程序員1", "男", "北京");User user2 = new User("程序員2", "女", "上海");List<User> users = new ArrayList();users.add(user1);users.add(user2);userMapper2.insertBatch(users);session.commit();
}

1.5.3.?遍歷Map

我們使用<foreach>?遍歷Map進行多條件查詢

1.?持久層接口添加方法

/*** 多條件查詢* @param map 查詢的條件鍵值對 鍵:屬性名 值:屬性值* @return要給參數起一個參數名才能用!!!*/
List<User> findUser(@Param("queryMap") Map<String,Object> map);

2.?映射文件添加標簽

<select id="findUser" parameterType="map" resultType="com.yibeigen.pojo.User">select * from user<where><foreach collection="queryMap" separator="and" index="key" item="value">-- 鍵是拼進來的,這個key和value是到時候會傳進來的!!!-- ${} 是直接會加上的,#{},是會預編譯的${key} = #{value}</foreach></where>
</select>

3.?編寫測試方法

@Test
public void testFileUser(){Map<String, Object> queryMap = new HashMap<>();queryMap.put("sex", "男");queryMap.put("address", "北京");List<User> user = userMapper.findUser(queryMap);user.forEach(System.out::println);
}

2. 總結

現在就講解完了動態SQL,希望對你有所幫助(??????)??

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

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

相關文章

AI 驅動的儀表板:從愿景到 Kibana

作者&#xff1a;來自 Elastic Jeffrey Rengifo 及 Toms Mura 使用 LLM 處理圖像并將其轉換為 Kibana 儀表板。 想獲得 Elastic 認證&#xff1f;了解下一次 Elasticsearch Engineer 培訓的舉辦時間&#xff01; Elasticsearch 擁有眾多新功能&#xff0c;幫助你為你的使用場景…

AI產品經理面試寶典第17天:AI時代敏捷開發與MVP構建面試題與答法

機器學習MVP構建問題怎么答? 面試官:請舉例說明如何將業務問題轉化為機器學習可解的問題? 你的回答:以電商供應商評價為例,傳統方法用人工設定的低維度指標評分,而機器學習能利用大數據構建高維模型。比如通過供應商歷史交易數據、物流時效、售后投訴率等數百個特征,訓…

HBase2.5.4單機模式與偽分布式的安裝與配置(Ubuntu系統)

HBase的安裝也分為三種&#xff0c;單機模式、偽分布式模式、完全分布式模式&#xff1b;我們先來安裝單機版。 一、環境準備 1. 系統要求 Ubuntu 20.04/22.04 LTS Java 8&#xff08;必須&#xff0c;HBase不兼容更高版本&#xff09; Hadoop&#xff08;單機模式不需要&a…

Honeywell霍尼韋爾DV-10 變速器放大器 輸入 15-28 VDC,輸出 +/- 10VDC 060-6881-02

Honeywell霍尼韋爾DV-10 變速器放大器 輸入 15-28 VDC,輸出 /- 10VDC 060-6881-02

騰訊位置商業授權鴻蒙地圖SDK工程配置

工程配置 安裝 DevEco Studio 開發環境 手機HarmonyOS系統&#xff1a;OpenHarmony-5.0.0.71及以上DevEco Studio版本&#xff1a;DevEco Studio NEXT Release(Build Version: 5.0.3.900)及以上 獲取key與生成秘鑰 獲取key 登錄騰訊位置服務控制臺&#xff0c;未注冊過賬號可…

RocketMQ源碼級實現原理-Commitlog刷盤機制

刷盤機制 同步刷盤 代碼實現 寫入線程 寫入線程可能同時有多個&#xff0c;但是刷盤線程至始至終就是一個單線程 刷盤線程&#xff0c;始終是操作雙緩沖區域&#xff0c;一個用來刷盤&#xff0c;另一個用來接收多個寫入線程同時寫入刷盤請求 刷盤線程 通過這種方式&#xff0…

Java與Vue技術搭建的SRM招標采購管理系統,提供源碼,涵蓋招標、投標、評標全流程,助力企業高效規范采購管理

前言&#xff1a;在當今競爭激烈的商業環境中&#xff0c;高效、透明、規范的招標采購流程對于企業的成本控制、供應鏈穩定以及整體運營效率至關重要。SRM招標采購管理系統應運而生&#xff0c;它借助先進的信息技術&#xff0c;整合了招標采購的各個環節&#xff0c;實現了采購…

Kotlin集合分組

集合的分組&#xff08;Grouping&#xff09; 在之前的學習中&#xff0c;我們已經學會了如何對集合進行過濾、排序或執行聚合操作。 在本節中&#xff0c;我們將學習如何對集合元素進行分組&#xff0c;以便以最適合我們任務的方式呈現信息。分組&#xff08;Grouping&#xf…

阿里云ssh證書過期,如果更換并上傳到服務器

登錄阿里云平臺&#xff0c;在控制臺中找到“數字證書管理服務”進入頻道后&#xff0c;選擇“SSL證書管理”點擊“創建證書”&#xff0c;創建成功后&#xff0c;進入證書詳情頁選擇“下載”板塊&#xff0c;根據自身服務器類型&#xff0c;下載相應的證書即可服務器更新證書登…

【軟件系統架構】系列七:系統性能——計算機性能深入解析

目錄 一、什么是計算機性能&#xff1f; 二、計算機性能核心指標 1. CPU性能指標 2. 內存性能指標 3. 存儲子系統性能 4. 網絡性能指標 5. 系統資源使用與并發能力 三、性能瓶頸分析方法 四、計算機性能評測與對比 常見性能測試指標與工具&#xff1a; 五、計算機性…

基于現代R語言【Tidyverse、Tidymodel】的機器學習方法

機器學習已經成為繼理論、實驗和數值計算之后的科研“第四范式”&#xff0c;是發現新規律&#xff0c;總結和分析實驗結果的利器。機器學習涉及的理論和方法繁多&#xff0c;編程相當復雜&#xff0c;一直是阻礙機器學習大范圍應用的主要困難之一&#xff0c;由此誕生了Python…

Python暑期學習筆記5

時間&#xff1a;2025.7.18學習內容&#xff1a;【語法基礎】while循環與循環嵌套一、循環語句循環流程圖二、while循環基本格式&#xff1a;while條件&#xff1a;循環體&#xff08;條件滿足時段做的事情&#xff09;改變變量死循環while True:循環體&#xff08;要循環做的事…

world models and Human–Object Interaction (HOI)

Author: Chatgpt Here are several key research papers that explore the intersection of world models and Human–Object Interaction (HOI)—especially ones that build structured, object-centric representations from videos or use world-model-based learning to p…

無人值守共享自習室物聯系統安全防線:從設備到數據的全面防護策略!

在“全民學習”浪潮的推動下&#xff0c;無人值守共享自習室憑借24小時開放、靈活預約和沉浸式體驗&#xff0c;已成為城市學習空間的新形態。而當人力值守被物聯網設備替代后&#xff0c;安全風險卻從物理世界延伸到了數字世界。一套完整的自習室物聯網系統包含門禁、傳感器、…

【27】MFC入門到精通——MFC 修改用戶界面登錄IP IP Address Control

界面搭建 將【IP Address Control】控件&#xff0c;【Edit Control】控件和兩個【button】控件分別拖入主界面 將ID分別修改為&#xff1a;IDC_IP_ADDRESS IDC_IPADDRESS_EDIT IDC_GET_BUTTON IDC_CLEAN_BUTTON添加變量 為【IP Address Control】控件添加變量【m_IPaddress】&…

MacOS安裝linux虛擬機

在學習docker時用的云環境本身就是一個容器&#xff0c;啟動docker總是各種問題&#xff0c;所以直接在本機上裝一個虛擬機。 當前系統環境&#xff1a; 安裝虛擬機軟件 安裝UTM 下載官網&#xff1a;https://mac.getutm.app/ uname -m查看一下指令架構&#xff0c;下載…

TimSort:論Java Arrays.sort的穩定性

TimSort 是一種混合的、穩定的排序算法&#xff0c;結合了歸并排序&#xff08;Merge Sort&#xff09;和二分插入排序&#xff08;Binary Insertion Sort&#xff09;的優點&#xff0c;尤其適用于部分有序的數據。在 Java 中&#xff0c;Arrays.sort() 對對象數組排序時內部使…

企業數據生命周期安全架構設計

數據是企業的生命線&#xff0c;而安全則是這條生命線的保護神。今天我們就來聊聊如何為企業數據的一生一世構建一套堅不可摧的安全防護體系。 &#x1f4da; 文章目錄 為什么需要數據生命周期安全架構數據生命周期全景圖安全架構設計的核心原則各階段安全防護策略整體安全架構…

【Java】字符串常量池

文章目錄一.字符串常量池(StringTable)1.1 定義1.2 演示示例1.3 intern方法一.字符串常量池(StringTable) 1.1 定義 字符串常量詞本質是一個固定大小的HashTable。當用一個字符串構造String對象時&#xff0c;首先會去StringTable中查看是否存在在字符串&#xff0c;如果存在…

數據通信與計算機網絡——模擬傳輸

主要內容數字到模擬轉換幅移鍵控ASK頻移鍵控FSK相移鍵控PSK正交振幅調制QAM模擬信號調制調幅AM調頻FM調相PM一、數字到模擬轉換數字信號需要低通通道&#xff0c;如果現實應用中只有帶通通道&#xff0c;只能選擇模擬信號進行傳輸。將數字數據轉換為帶通模擬信號&#xff0c;傳…