<sql>、<resultMap>、<where>、<foreach>、<trim>、<set>等標簽的作用和用法

目錄

一. sql?代碼片段標簽

二.?resultMap 映射結果集標簽

三. where?條件標簽

四.?set?修改標簽

五.?trim?標簽

六. foreach 循環標簽


一. sql?代碼片段標簽

sql 標簽是 mybatis 框架中一個非常常用的標簽頁,特別是當一張表很有多個字段多,或者要多表查詢很多字段時,都會用到。拓本之際是用來定義一個SQL代碼片段,然后可以在其它SQL語句中引入此片段。

舉例:如下圖,m_user 表中有多個字段。

定義方法:將SQL代碼片段寫在標簽內,并定義唯一id,如下

	<sql id="User_Column">id,username,salt,phone,avatar,email,`status`,created,last_login</sql>

引用方式:<include refid="被引用的代碼片段ID">

	select<include refid="User_Column" />from m_user

好處:在 mapper.xml 文件中,通常會定義大量的增刪改查語句,當我們定義一個SQL片段時,就可以在整個 mapper.xml 文件中進行引用,簡化了后續的開發,省去了很多不必要的寫字段的時間和精力。

此外,當我們后續要對表添加修改字段時,基本上只需要對SQL片段內部的字段做增減,然后所有引用此SQL片段的SQL語句都會跟著改變,非常方便。

二.?resultMap 映射結果集標簽

數據庫字段與Java代碼之前的映射關系是我們經常需要注意的一個問題,例如數據庫字段名稱為 create_time,但是在Java代碼中,通常采用駝峰的方式定義為 createTime,這就會導致字段映射失敗,而?resultMap 就是來解決這個問題的。

使用方法:以上述 m_user 表為例

last_login 字段在Java代碼中通常定義為 lastLogin;

定義方式:?mapper.xml?文件中,在?resultMap 標簽中這樣寫,定義為一 id ,type 就是映射的 Java 實體類,即 User 類。

    <!-- 通用查詢映射結果 --><resultMap id="UserResultMap" type="com.markerhub.entity.User"><id column="id" property="id" /><result column="username" property="username" /><result column="avatar" property="avatar" /><result column="email" property="email" /><result column="password" property="password" /><result column="status" property="status" /><result column="created" property="created" /><result column="last_login" property="lastLogin" /></resultMap>

使用方式:以 select 查詢語句為例,當查詢返回值 resultMap 中全部都有時,就可以通過 resultMap="id值" 來進行引用,當查詢數據庫時,mybatis 會自動把數據庫字段的值映射到我們定義的Java屬性值上。

    <select id="selectByUserName" resultMap="UserResultMap">select <include refid="User_Column"/>from m_user where username = #{username}</select>

三. where?條件標簽

條件 where 語句,用于動態 SQL 時使用,在查詢數據庫時,我們不確定用戶是否傳入值,如果有值,就將條件加入到 where ,如果沒有傳值,則不加。

使用方法:將 where條件SQL定義在<where>標簽內部,當 <where> 標簽內部不為空時,where 標簽就會生效。如果<where> 標簽內部為空,則不會將where條件語句拼接到SQL語句內。

<if>標簽也是同樣的道理,test ="id != null" 表示如果 id 值不為空,則將 "and id = #{id}"SQL片段拼接到SQL語句中。

    <select id="selectByIdAndUserName" resultMap="UserResultMap">select <include refid="User_Column"/>from m_user w<where><if test="id != null" >and id = #{id}</if><if test="username != null">and username = #{username}</if></where></select>

四.?set?修改標簽

條件 set 語句,和 where 標簽是一個道理。

示例代碼如下,<set> 標簽 搭配 <if> 標簽,就可以達到當傳入的值不為空時,就更新值的效果。

    <update id="updateUserById" parameterType="com.markerhub.entity.User">update m_user<set><if test="username != null">username = #{username},</if><if test="avatar != null">avatar = #{avatar},</if><if test="email != null">email = #{email},</if><if test="password != null">password = #{password},</if><if test="status != null">status = #{status},</if><if test="created != null">created = #{created},</if><if test="lastLogin != null">last_login = #{lastLogin},</if></set>where id = #{id}</update>

五.?trim?標簽

trim 標簽是一個單獨的標簽,一共提供了四個屬性,如下圖所示。

prtefix/suffix:在trim標簽中內容前面/后面添加指定內容;

prefixOverrides/suffixOverrides:在trim標簽中內容前面/后面去掉指定內容;

完整的SQL語句

這樣寫表示當 <if> 標簽內容不為空時,添加 where 過濾條件,并且將 <if> 標簽內不多余的后綴關鍵詞 and 去掉防止語法錯誤。

    <select id="selectUserByIdAndUserName" parameterType="com.markerhub.entity.User">select <include refid="User_Column"/>from m_user<trim prefix="where" suffixOverrides="and"><if test="id != null and id != ''">id = #{id} and</if><if test="username != null and username != ''">username = #{username} and</if></trim></select>

六. foreach 循環標簽

foreach 就是用來循環的語句,通常出現在按照列表數據批量添加或批量刪除數據時使用,它提供了五個屬性;

cllection:代表要遍歷的數組,Java接口在定義是最好使用@Parm進行標注;

item:表示數組中的每個元素;

open:表示該標簽體以什么開頭;

close :表示該標簽體以什么結尾;

separator:表示數據之間的分隔符是什么;

示例代碼:

這段代碼的意思就是參數傳遞一個ID集合,集合不為空時,where 過濾條件按照 id 值循環刪除所有符合條件的數據。

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

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

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

相關文章

《MySQL:MySQL數據庫的基本操作》

1.創建數據庫 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 大寫表示關鍵字[]&#xff1a;表示可選項CHARACTER SET ch…

深入簡出:KL散度、交叉熵、熵、信息量簡介、交叉熵損失

學習這些的最終目的 1、量化兩個概率分布的差異 2、推導交叉熵損失 一、KL散度 KL散度就是用來量化兩個概論分布的差異&#xff0c;如何量化&#xff1f; 計算真實概論分布P信息量 和 估計概論分布為Q&#xff0c;但實際概率分布為P時信息量的差值 那么設&#xff0c;概率分…

MySQL:Join連接的原理

連接查詢的執行過程&#xff1a; 確定第一個需要查詢的表【驅動表】 選取代價最小的訪問方法去執行單表查詢語句 從驅動表每獲取到一條記錄&#xff0c;都需要到t2表中查找匹配的記錄 兩表連接查詢需要查詢一次t1表&#xff0c;兩次t2表&#xff0c;在兩表的連接查詢中&…

【Drools+springboot3規則匹配】

文章目錄 一、 業務場景概述二、整體技術架構三、Drools概述1. Drools 簡介2. Drools Rete 算法與flink-cep的區別?2.1 Rete 算法概述2.2 Flink CEP 概述四、代碼實現4.1 導入依賴4.2 從kafka消費數據4.3 核心類,觸發匹配操作并將匹配數據寫入mysql4.4 Drools 管理4.5 相關的…

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的&#xff0c;幾乎維系著整個安卓程序運行的生命周期&#xff0c;但是這么重要的一個東西&#xff0c;我們真的了解它嗎&#xff1f;下面跟隨著我的腳步&#xff0c;慢慢揭開Hanler的神秘面紗吧&#xff01; 本文將介紹Handler 的運…

讀書筆記 -- MySQL架構

1、MySQL邏輯架構 最上層的服務并不是 MySQL所獨有的&#xff0c;大多數基于網絡的客戶端/服務器的工具或者服務都有類似的架構。比如連接處理、授權認證、安全等等。 第二層架構是 MySQL 比較有意思的部分。大多數 MySQL 的核心服務功能都在這一層包括查詢解析、分析、…

linux 4.14內核jffs2文件系統不自動釋放空間的bug

前段時間在做spi-nor flash項目的時候&#xff0c;使用jffs2文件系統&#xff0c;發現在4.14內核下存在無法釋放空間的bug&#xff0c;后來進行了修復&#xff0c;修復后功能正常&#xff0c;現將修復patch公開&#xff0c;供后來者學習&#xff1a; diff --git a/fs/jffs2/ac…

vue3+vite 實現.env全局配置

首先創建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依賴&#xff1a; pnpm install dotenv --save-dev 引入完成后&#xff0c;在vite.config.js配置文件內加入以下內容&#xff1a; const env dotenv.config({ path: ./.env }).parsed define: { // 將…

Oracle 19c部署之手工建庫(四)

#Oracle #19c #手工建庫 手工創建Oracle數據庫&#xff08;也稱為手工建庫&#xff09;是指在已經安裝了Oracle數據庫軟件的基礎上&#xff0c;通過手動執行一系列命令和步驟來創建一個新的數據庫實例。這種方法與使用Database Configuration Assistant (DBCA)等工具自動創建數…

【Reading Notes】(8.3)Favorite Articles from 2025 March

【March】 雷軍一度登頂中國首富&#xff0c;太厲害了&#xff08;2025年03月02日&#xff09; 早盤&#xff0c;小米港股一路高歌猛進&#xff0c;暴漲4%&#xff0c;股價直接飆到52港元的歷史新高。這一波猛如虎的操作&#xff0c;直接把雷軍的身家拉到了2980億元&#xff0c…

【Python爬蟲基礎篇】--1.基礎概念

目錄 1.爬蟲--定義 2.爬蟲--組成 3.爬蟲--URL 1.爬蟲--定義 網絡爬蟲&#xff0c;是一種按照一定規則&#xff0c;自動抓取互聯網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。隨著網絡的迅速發展&#xff0c;萬維網成為大量信息的載體…

C語言超詳細結構體知識

1.自定義類型&#xff1a;結構體的介紹 在之前的博客中&#xff0c;我們簡單介紹過了關于結構體的基本知識&#xff0c;這里我們稍微復習一下。 結構體(struct)是C語言中一種重要的復合數據類型&#xff0c;它允許將不同類型的數據組合成一個整體。 1.1結構體的定義 結構體使…

C++學習:六個月從基礎到就業——內存管理:new/delete操作符

C學習&#xff1a;六個月從基礎到就業——內存管理&#xff1a;new/delete操作符 本文是我C學習之旅系列的第十七篇技術文章&#xff0c;也是第二階段"C進階特性"的第二篇&#xff0c;主要介紹C中動態內存管理的核心操作符——new和delete。查看完整系列目錄了解更多…

15~30K,3年以上golang開發經驗

繼續分享最新的面經&#xff0c;前面發的兩篇大家也可以看看&#xff1a; 「坐標上海&#xff0c;20K的面試強度」「北京七貓&#xff0c;薪資25~35K&#xff0c;瞧瞧面試強度」 今天分享的是golang開發崗面經&#xff0c;要求是3年以上golang開發經驗&#xff0c;薪資為15~3…

Python爬蟲實戰:獲取優志愿專業數據

一、引言 在信息爆炸的當下,數據成為推動各領域發展的關鍵因素。優志愿網站匯聚了豐富的專業數據,對于教育研究、職業規劃等領域具有重要價值。然而,為保護自身數據和資源,許多網站設置了各類反爬機制。因此,如何高效、穩定地從優志愿網站獲取計算機專業數據成為一個具有…

ArcPy工具箱制作(下)

在上一篇博客中&#xff0c;我們已經初步了解了如何制作ArcPy工具箱&#xff0c;包括工具箱的基本概念、準備工作、腳本編寫以及將腳本轉換為工具箱的步驟。今天&#xff0c;我們將繼續深入探討ArcPy工具箱的制作&#xff0c;重點介紹一些進階技巧和優化方法. 一、優化工具箱的…

不一樣的flag 1(迷宮題)

題目 做法 下載壓縮包&#xff0c;解壓&#xff0c;把解壓后的文件拖進Exeinfo PE進行分析 32位&#xff0c;無殼 扔進IDA&#xff08;32位&#xff09;&#xff0c;找到main&#xff0c;F5反編譯 沒啥關鍵詞&#xff0c;ShiftF12也找不到什么有用的點 從上往下分析吧 puts(…

工程化實踐:Flutter項目結構與規范

工程化實踐&#xff1a;Flutter項目結構與規范 在Flutter項目開發中&#xff0c;良好的工程化實踐對于提高開發效率、保證代碼質量和團隊協作至關重要。本文將從項目結構、代碼規范、CI/CD流程搭建以及包管理等方面&#xff0c;詳細介紹Flutter項目的工程化最佳實踐。 項目結…

[Java · 初窺門徑] Java 語言初識

&#x1f31f; 想系統化學習 Java 編程&#xff1f;看看這個&#xff1a;[編程基礎] Java 學習手冊 0x01&#xff1a;Java 編程語言簡介 Java 是一種高級計算機編程語言&#xff0c;它是由 Sun Microsystems 公司&#xff08;已被 Oracle 公司收購&#xff09;于 1995 年 5 …