MyBatis:動態SQL

文章目錄

  • 動態SQL
    • if標簽
    • trim標簽
    • where標簽
    • set標簽
    • foreach標簽
    • include標簽和sql標簽

Mybatis動態SQL的官方文檔: https://mybatis.net.cn/dynamic-sql.html

動態SQL

動態SQL是 MyBatis的強大特性之一,如果是使用JDBC根據不同條件拼接sql很麻煩,例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一個列名的逗號。利用動態 SQL,可以徹底擺脫這種痛苦。

if標簽

使用場景:在我們數據庫表中字段分為必填字段和非必填字段,對與非必填字段數據庫會自動幫我們賦值,那如果在添加用戶的時候有不確定的字段傳入,程序應該如何實現呢?
這個時候就需要使用動態標簽來判斷了,比如添加的時候性別gender為非必填字段

 <insert id="insertUserByCondition">INSERT INTO user_info (username,age,<if test="gender != null">gender,</if>password)VALUES (#{username},#{age},<if test="gender != null">#{gender},</if>#{password})
</insert>

可不可以不進行判斷,直接把字段設置為null呢?
不可以,這種情況下,如果gender字段有默認值,就會設置為默認值
在這里插入圖片描述
在這里插入圖片描述
測試代碼

    @Testvoid insertUserByCondition() {UserInfo userInfo=new UserInfo();userInfo.setUsername("username5");userInfo.setPassword("password5");userInfo.setGender(5);userInfo.setAge(5);userInfoMapperXML.insertUserByCondition(userInfo);}

在這里插入圖片描述
不設置gender的參數,也可以進行插入

在這里插入圖片描述

在這里插入圖片描述
注意:

  1. if標簽test中的屬性是傳入對象中的屬性,不是數據庫字段
  2. 插入語句中,values中賦值也要有if標簽,要一一對應,gender字段中有if標簽,values中也要的gender屬性也要有if標簽

trim標簽

標簽中有如下屬性:
? prefix:表示整個語句塊,以prefix的值作為前綴
? suffix:表示整個語句塊,以suffix的值作為后綴
? prefixOverrides:表示整個語句塊要去除掉的前綴
? suffixOverrides:表示整個語句塊要去除掉的后綴

trim標簽的使用
sql語句

insert into user_info ( username, password, age, gender ) values("username5","password5",5,5)
     insert into user_info<trim suffixOverrides="," prefix="(" suffix=")"><if test="username!=null">username,</if><if test="password!=null">password,</if><if test="age!=null">age,</if><if test="gender!=null">gender</if></trim>values (<trim  suffixOverrides="," prefix="(" suffix=")"><if test="username!=null">#{username},</if><if test="password!=null">#{password},</if><if test="age!=null">#{age},</if><if test="gender!=null">#{gender}</if></trim>)</insert>

測試代碼

  @Testvoid insertUserByCondition() {UserInfo userInfo=new UserInfo();userInfo.setUsername("username5");userInfo.setPassword("password5");userInfo.setGender(5);userInfo.setAge(5);userInfoMapperXML.insertUserByCondition(userInfo);}

在這里插入圖片描述

where標簽

看下?這個場景,系統會根據我們的篩選條件,動態組裝where條件

在這里插入圖片描述
這個是怎么實現的呢?通過where標簽

舉個例子
sql語句:

select* from user_info where age=1 and gender =2
  <select id="selectByCondition" resultType="com.example.demo.model.UserInfo">select id, username, age, gender, phone, delete_flag, create_time,update_timefrom user_info where<if test="age != null">age = #{age}</if><if test="gender != null">and gender = #{gender}</if></select>

當if標簽有一個或兩個不符合條件的時候,會報錯,這時候where標簽就派上用場了

<select id="selectByCondition" resultType="com.example.demo.model.UserInfo">select id, username, age, gender, phone, delete_flag, create_time,update_timefrom user_info where<where><if test="age != null">age = #{age}</if><if test="gender != null">and gender = #{gender}</if></where></select>

測試代碼

    @Testvoid selectByCondition() {UserInfo userInfo=new UserInfo();userInfo.setAge(16);userInfoMapperXML.selectByCondition(userInfo);}

在這里插入圖片描述
where標簽只會在子元素有內容的情況下才插入where子句,而且會自動去除子句的開頭的AND或OR

set標簽

sql

update user_info set password="123" ,gender= 4 where id=34
<update id="updateUser2">update user_info set<if test="username!=null">username=#{username}</if><if test="password!=null">,password=#{password}</if><if test="gender!=null">,gender=#{gender}</if>where  id=#{id}</update>

如果我們寫出這樣的xml文件,當我們的username為null時,sql語法錯誤,多了一個逗號

下面是報錯信息
在這里插入圖片描述
set標簽會刪除額外的逗號,并把set插入sql語句中

 <update id="updateUser2">update user_info<set><if test="username!=null">username=#{username}</if><if test="password!=null">,password=#{password}</if><if test="gender!=null">,gender=#{gender}</if></set>where  id=#{id}</update>

測試代碼

@Testvoid updateUser2() {UserInfo userInfo=new UserInfo();userInfo.setPassword("123");userInfo.setGender(4);```javauserInfo.setId(34);userInfoMapperXML.updateUser2(userInfo);}

在這里插入圖片描述

foreach標簽

foreach 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內使用的集合項(item)和索引(index)變量。它也允許你指定開頭與結尾的字符串以及集在這里插入代碼片合項迭代之間的分隔符。這個元素也不會錯誤地添加多余的分隔符!

foreach 標簽有如下屬性:

collection:綁定方法參數中的集合,如 List,Set,Map或數組對象
item:遍歷時的每?個對象
open:語句塊開頭的字符串
close:語句塊結束的字符串
separator:每次遍歷之間間隔的字符串
舉個例子:批量查詢id為12,13,14的數據

sql:

 select * from user_info where id in ( 12 , 13 ,14)
<select id="selectUserByIds" resultType="com.example.demo.model.UserInfo">select * from user_info where id in<foreach collection="ids" item="id"  separator="," open="(" close=")">#{id}</foreach></select>

測試代碼

    @Testvoid selectUserByIds() {List<Integer> ids=new ArrayList<>();ids.add(12);ids.add(13);ids.add(14);userInfoMapperXML.selectUserByIds(ids);}

在這里插入圖片描述
需求:批量刪除id為12,13,14的數據

<delete id="deleteByIds">delete from user_info where id in<foreach collection="ids" item="id" separator="," open="(" close=")" >#{id}</foreach></delete>

測試代碼

 @Testvoid deleteByIds() {List<Integer> ids=List.of(12,13,14);userInfoMapperXML.deleteByIds(ids);}

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

include標簽和sql標簽

在xml映射文件中配置的SQL,有時可能會存在很多重復的片段,此時就會存在很多冗余的代碼
在這里插入圖片描述

sql 標簽: 定義可重用的SQL片段
include 標簽:通過屬性refid,指定包含的SQL片段

   <sql id="allColumn">id, username, age, gender, phone, delete_flag, create_time, update_time</sql><select id="selectAll" resultType="com.example.demo.model.UserInfo">SELECT<include refid="allColumn"></include>FROM `user_info`</select>

測試代碼

  @Testvoid selectAll() {userInfoMapperXML.selectAll().stream().forEach(x-> System.out.println(x));}

在這里插入圖片描述

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

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

相關文章

Java - Junit框架

單元測試&#xff1a;針對最小的功能單元(方法)&#xff0c;編寫測試代碼對該功能進行正確性測試。 Junit&#xff1a;Java語言實現的單元測試框架&#xff0c;很多開發工具已經集成了Junit框架&#xff0c;如IDEA。 優點 編寫的測試代碼很靈活&#xff0c;可以指某個測試方法…

學生成績管理系統Java實戰(Spring Boot+MyBatis Plus)

文章目錄 一、系統需求分析&#xff08;避坑指南&#xff09;二、技術選型&#xff08;2024新版&#xff09;三、數據庫設計&#xff08;三大核心表&#xff09;1. 學生表&#xff08;student&#xff09;2. 課程表&#xff08;course&#xff09;3. 成績表&#xff08;score&a…

MySQL安裝實戰指南:Mac、Windows與Docker全平臺詳解

MySQL作為世界上最流行的開源關系型數據庫&#xff0c;是每位開發者必須掌握的基礎技能。本指南將手把手帶你完成三大平臺的MySQL安裝&#xff0c;從下載到配置&#xff0c;每個步驟都配有詳細說明和截圖&#xff0c;特別適合新手學習。 一、Mac系統安裝MySQL 1.1 通過Homebre…

多模態大語言模型arxiv論文略讀(七十九)

AIM: Let Any Multi-modal Large Language Models Embrace Efficient In-Context Learning ?? 論文標題&#xff1a;AIM: Let Any Multi-modal Large Language Models Embrace Efficient In-Context Learning ?? 論文作者&#xff1a;Jun Gao, Qian Qiao, Ziqiang Cao, Zi…

[Harmony]封裝一個可視化的數據持久化工具

1.添加權限 在module.json5文件中添加權限 // 聲明應用需要請求的權限列表 "requestPermissions": [{"name": "ohos.permission.DISTRIBUTED_DATASYNC", // 權限名稱&#xff1a;分布式數據同步權限"reason": "$string:distrib…

利用html制作簡歷網頁和求職信息網頁

前言 大家好&#xff0c;我是maybe。今天下午初步學習了html的基礎知識。做了兩個小網頁&#xff0c;一個網頁是簡歷網頁&#xff0c;一個網頁是求職信息填寫網頁。跟大家分享一波~ 說明:我不打算上傳圖片。所以如果有朋友按照我的代碼運行網頁&#xff0c;會出現一個沒有圖片…

Vue 3 實現后端 Excel 文件流導出功能(Blob 下載詳解)

&#x1f4a1; 本文以告警信息導出為例&#xff0c;介紹 Vue 3 中如何通過 Axios 調用后端接口并處理文件流&#xff0c;實現 Excel 自動下載功能。 &#x1f4d1; 目錄 一、前言 二、后端接口說明 三、前端實現思路 四、導出功能完整代碼 五、常見問題處理 六、效果展示 …

HarmonyOS AVPlayer 音頻播放器

鴻蒙文檔中心&#xff1a;使用AVPlayer播放視頻(ArkTS)文檔中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-playback 這張圖描述的是 HarmonyOS AVPlayer 音頻播放器的狀態流轉過程&#xff0c;展示了 AVPlayer 在不同狀態之間的切換條件和關鍵操作…

Java面試場景:從音視頻到AI應用的技術探討

面試場景&#xff1a;音視頻與AI應用技術的碰撞 在某互聯網大廠的面試中&#xff0c;面試官王先生與求職者明哥展開了一場關于音視頻技術與AI應用的對話。 第一輪提問&#xff1a;音視頻場景 面試官&#xff1a;明哥&#xff0c;你能談談在音視頻場景中&#xff0c;Spring B…

【深度學習】殘差網絡(ResNet)

如果按照李沐老師書上來&#xff0c;學完 VGG 后還有 NiN 和 GoogLeNet 要學&#xff0c;但是這兩個我之前聽都沒聽過&#xff0c;而且我看到我導師有發過 ResNet 相關的論文&#xff0c;就想跳過它們直接看后面的內容。 現在看來這不算是不踏實&#xff0c;因為李沐老師說如果…

Vue3學習(組合式API——父、子組件間通信詳解)

目錄 一、組合式API下的父組件傳子組件。(自定義屬性) &#xff08;1&#xff09;基本思想。 &#xff08;2&#xff09;核心注意點。(defineProps) &#xff08;3&#xff09;傳遞簡單類型數據。 &#xff08;4&#xff09;傳遞對象類型數據。(v-bind"對象類型數據"…

W5500使用ioLibrary庫創建TCP客戶端

1、WIZnet全硬件TCP/IP協議棧 WIZnet全硬件TCP/IP協議棧,支持TCP,UDP,IPv4,ICMP,ARP,IGMP以及PPPoE協議。 以太網&#xff1a;支持BSD和WIZCHIP&#xff08;W5500/W5300/W5200/W5100/W5100S&#xff09;的SOCKET APIs驅動程序。 互聯網&#xff1a; DHCP客戶端 DNS客戶端 FTP客…

管理Oracle Data Guard的最佳實踐

Oracle Data Guard的中文名字叫數據衛士&#xff0c;顧名思義&#xff0c;它是生產庫的一道保障。所以管理Data Guard是DBA的一項重要工作之一&#xff0c;管理Data Guard時主要有以下幾個注意點需要引起重視。 備份庫的歸檔日志積壓 一般情況下&#xff0c;生產庫的歸檔日志是…

BootCDN介紹(Bootstrap主導的前端開源項目免費CDN加速服務)

文章目錄 BootCDN前端開源項目CDN加速服務全解析什么是BootCDN技術原理與架構CDN技術基礎BootCDN架構特點1. 全球分布式節點網絡2. 智能DNS解析系統3. 高效緩存管理機制4. 自動同步更新機制5. HTTPS和HTTP/2協議支持 BootCDN的核心優勢速度與穩定性開源免費資源豐富度技術規范遵…

2025 Java 微信小程序根據code獲取openid,二次code獲取手機號【工具類】拿來就用

一、controller調用 /*** 登錄** author jiaketao* since 2024-04-10*/ RestController RequestMapping("/login") public class LoginController {/*** 【小程序】登錄獲取session_key和openid** param code 前端傳code* return*/GetMapping("/getWXSessionKe…

軟件架構風格系列(3):管道 - 過濾器架構

文章目錄 前言一、從生活場景到架構原理&#xff0c;看懂管道 - 過濾器的核心邏輯&#xff08;一&#xff09;什么是管道 - 過濾器架構&#xff1f;&#xff08;二&#xff09;核心組件拆解 二、架構設計圖&#xff1a;一圖看懂管道 - 過濾器架構全貌三、Java 示例代碼&#xf…

【VIM】vim 常用命令

文章目錄 插入模式光標移動拷貝/粘貼/刪除/撤銷塊操作分屏代碼縮進命令組合使用其他PowerVim 前言&#xff1a;本文內容大部分摘抄自酷殼和博客園 ? – ? CoolShell – 陳皓 ? 博客園 – 易先訊 插入模式 a → 在光標后插入o → 在當前行后插入一個新行O → 在當前行前插…

polarctf-web-[簡單rce]

考點&#xff1a; (1)RCE(eval函數) (2)執行函數(passthru函數) (3)/頂級(根)目錄查看 (4)sort排序查看函數 題目來源&#xff1a;Polarctf-web-[簡單rce] 解題&#xff1a; 代碼審計 <?php/*?PolarD&N CTF?*/highlight_file(__FILE__);function no($txt){ # …

HarmonyOs開發之———使用HTTP訪問網絡資源

謝謝關注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介紹HarmonyOs開發之———Video組件的使用:HarmonyOs開發之———Video組件的使用_華為 video標簽查看-CSDN博客 HarmonyOS 網絡開發入門&#xff1a;使用 HTTP 訪問網絡資源 HarmonyOS 作為新一代智能終端…

Vue 圖片預覽功能(含縮略圖)

眾所周知&#xff0c;常見的組件庫如Element、Ant Design&#xff0c;自帶的圖片預覽功能都沒有縮略圖&#xff0c;所以 需要單獨封裝一個圖片預覽的服務。 第三方庫&#xff1a;v-viewer 安裝&#xff1a; npm install v-viewer viewerjs 若使用報錯&#xff0c;可安裝指定…