MyBatis詳解5.動態(tài)SQL

字節(jié)跳動飛書內(nèi)推!
北京薄扁、杭州剪返、武漢、廣州邓梅、深圳脱盲、上海,六大城市等你來投日缨。
感興趣的朋友可以私我咨詢&內(nèi)推宾毒,也可以通過鏈接直接投遞
海量HC殿遂,極速響應,快來和我成為同事吧乙各。
今日頭條墨礁、抖音、Tik Tok也可以內(nèi)推~

點擊進入我的博客

MyBatis詳解1.概述
MyBatis詳解2.MyBatis使用入門
MyBatis詳解3.MyBatis配置詳解
MyBatis詳解4.映射器Mapper
MyBatis詳解5.動態(tài)SQL
MyBatis詳解6.MyBatis技術內(nèi)幕
MyBatis詳解7.插件
MyBatis詳解8.集成Spring

1 概述

MyBatis提供了對SQL語句動態(tài)的組裝能力耳峦,大量的判斷都可以在 MyBatis的映射XML文件里面配置恩静,以達到許多我們需要大量代碼才能實現(xiàn)的功能,大大減少了我們編寫代碼的工作量蹲坷。

動態(tài)SQL的元素
元素 作用 備注
if 判斷語句 單條件分支判斷
choose驶乾、when、otherwise 相當于Java中的 case when語句 多條件分支判斷
trim循签、where级乐、set 輔助元素 用于處理一些SQL拼裝問題
foreach 循環(huán)語句 在in語句等列舉條件常用

2 if元素

if元素相當于Java中的if語句,它常常與test屬性聯(lián)合使用∠亟常現(xiàn)在我們要根據(jù)name去查找學生风科,但是name是可選的,如下所示:

    <select id="selectByName" resultType="com.ankeetc.spring.domain.StudentDomain">
        SELECT * FROM student
        WHERE 1=1
        <if test="name != null and name != ''">
            AND name LIKE concat('%', #{name}, '%')
        </if>
    </select>

3 choose乞旦、when贼穆、otherwise元素

有些時候我們還需要多種條件的選擇,在Java中我們可以使用switch兰粉、case故痊、default語句,而在映射器的動態(tài)語句中可以使用choose玖姑、when愕秫、otherwise元素慨菱。

<!-- 有name的時候使用name搜索,沒有的時候使用id搜索 -->
    <select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
        SELECT * FROM student
        WHERE 1=1
        <choose>
            <when test="name != null and name != ''">
                AND name LIKE concat('%', #{name}, '%')
            </when>
            <when test="id != null">
                AND id = #{id}
            </when>
        </choose>
    </select>

4 where元素

上面的select語句我們加了一個1=1的絕對true的語句豫领,目的是為了防止語句錯誤抡柿,變成SELECT * FROM student WHERE這樣where后沒有內(nèi)容的錯誤語句。這樣會有點奇怪等恐,此時可以使用<where>元素洲劣。

    <select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
        SELECT * FROM student
        <where>
            <if test="name != null and name != ''">
                name LIKE concat('%', #{name}, '%')
            </if>
        </where>
    </select>

5 trim元素

有時候我們要去掉一些特殊的SQL語法,比如常見的and课蔬、or囱稽,此時可以使用trim元素。trim元素意味著我們需要去掉一些特殊的字符串二跋,prefix代表的是語句的前綴战惊,而prefixOverrides代表的是你需要去掉的那種字符串,suffix表示語句的后綴扎即,suffixOverrides代表去掉的后綴字符串吞获。

    <select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
        SELECT * FROM student
        <trim prefix="WHERE" prefixOverrides="AND">
            <if test="name != null and name != ''">
                AND name LIKE concat('%', #{name}, '%')
            </if>
            <if test="id != null">
                AND id = #{id}
            </if>
        </trim>
    </select>

6 set元素

在update語句中,如果我們只想更新某幾個字段的值谚鄙,這個時候可以使用set元素配合if元素來完成各拷。注意:set元素遇到,會自動把,去掉

    <update id="update">
        UPDATE student
        <set>
            <if test="name != null">
                name = #{name},
            </if>
            <if test="sex != null">
                sex = #{sex}
            </if>
        </set>
        WHERE id = #{id}
    </update>

7 foreach元素

foreach元素是一個循環(huán)語句闷营,它的作用是遍歷集合烤黍,可以支持數(shù)組、List傻盟、Set接口速蕊。

    <select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
        SELECT * FROM student
        WHERE name IN
        <foreach collection="names" open="(" close=")" separator="," item="item">
            #{item}
        </foreach>
    </select>
  • collection配置的是傳遞進來的參數(shù)名稱
  • item配置的是循環(huán)中當前的元素。
  • index配置的是當前元素在集合的位置下標娘赴。
  • open和 close配置的是以什么符號將這些集合元素包裝起來规哲。
  • separator是各個元素的間隔符。

8 bind元素

bind元素的作用是通過OGNL表達式去自定義一個上下文變量筝闹,這樣更方便我們使用媳叨。在我們進行模糊查詢的時候,如果是MySQL數(shù)據(jù)庫关顷,我們常常用到的是一個concat用“%”和參數(shù)相連接糊秆;然而在Oracle數(shù)據(jù)庫則是用連接符號“||”,這樣SQL就需要提供兩種形式去實現(xiàn)议双。但是有了bind元素痘番,我們就完全不必使用數(shù)據(jù)庫的語言,只要使用MyBatis的語言即可與所需參數(shù)相連。

    <select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
        <bind name="pattern" value="'%' + name + '%'"/>
        SELECT * FROM student WHERE name LIKE #{pattern}
    </select>
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汞舱,一起剝皮案震驚了整個濱河市伍纫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昂芜,老刑警劉巖莹规,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泌神,居然都是意外死亡良漱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門欢际,熙熙樓的掌柜王于貴愁眉苦臉地迎上來母市,“玉大人,你說我怎么就攤上這事损趋』季茫” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵浑槽,是天一觀的道長蒋失。 經(jīng)常有香客問我,道長桐玻,這世上最難降的妖魔是什么高镐? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮畸冲,結果婚禮上,老公的妹妹穿的比我還像新娘观腊。我一直安慰自己邑闲,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布梧油。 她就那樣靜靜地躺著苫耸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儡陨。 梳的紋絲不亂的頭發(fā)上褪子,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音骗村,去河邊找鬼嫌褪。 笑死,一個胖子當著我的面吹牛胚股,可吹牛的內(nèi)容都是我干的笼痛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缨伊!你這毒婦竟也來了摘刑?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刻坊,失蹤者是張志新(化名)和其女友劉穎枷恕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谭胚,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡徐块,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了漏益。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛹锰。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绰疤,靈堂內(nèi)的尸體忽然破棺而出铜犬,到底是詐尸還是另有隱情,我是刑警寧澤轻庆,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布癣猾,位于F島的核電站,受9級特大地震影響余爆,放射性物質(zhì)發(fā)生泄漏纷宇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一蛾方、第九天 我趴在偏房一處隱蔽的房頂上張望像捶。 院中可真熱鬧,春花似錦桩砰、人聲如沸拓春。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硼莽。三九已至,卻和暖如春煮纵,著一層夾襖步出監(jiān)牢的瞬間懂鸵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工行疏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匆光,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓酿联,卻偏偏與公主長得像殴穴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355