Mybatis中的動態(tài)SQL語句解析
這篇文章主要介紹了Mybatis中的動態(tài)SQL語句解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
Mybatis中配置SQL有兩種方式,一種是利用xml 方式進行配置,一種是利用注解進行配置。
Mybatis使用注解配置SQL,但是由于配置功能受限,而且對于復(fù)雜的SQL而言可讀性很差,所以很少使用。
Mybatis常用xml配置的方式,使用xml的幾個簡單的元素,便能完成動態(tài)SQL的功能,大量的判斷都可以在mybaties的映射xml里面配置,以達到許多需要大量代碼才能實現(xiàn)的功能,大大減少了代碼量,體現(xiàn)了Mybatis的靈活、高度可配置性和維護性。
| 元素 | 作用 | 備注 |
| if | 判斷語句 | 單條件分支判斷 |
| choose(when,otherwise) | 相當(dāng)于Java中的switch和case語句 | 多條件分支判斷 |
| trim | 輔助元素,用于處理特定的SQL拼裝問題 | 用于處理SQL拼裝的問題 |
| foreach | 循環(huán)語句 | 在in語句等列表條件常用 |
if元素
if元素是最常用的判斷語句,相當(dāng)于Java中國的 if 語句,它常常與test屬性聯(lián)合使用。
<select id="findRole1" parameterType="string" resultMap="roleResultMap">
select role_no, role_name, note from t_role where 1=1
<if test="roleName != null and roleName !=''">
and role_name like concat('%', #{roleName}, '%')
</if>
</select>
當(dāng)參數(shù)roleName傳遞進映射器時,如果參數(shù)不為空,則采取構(gòu)造對 roleName 的模糊查詢,否則就不要去構(gòu)造這個條件。通過Mybaties的 if 元素節(jié)省了許多拼接SQL的工作,集中在 xml 里面維護。
choose、when、otherwise元素
如果在判斷時有更多的選擇,不只是兩種選擇,也就是類似switch...case...default...功能的語句。在映射的SQL語句中,使用choose、when、otherwise元素承擔(dān)這個功能。
<select id="findRole2" parameterType="role" resultMap="roleResultMap">
select role_no, role_name, note from t_role
where 1=1
<choose>
<when test="roleNo != null and roleNo !=''">
AND role_no = #{roleNo}
</when>
<when test="roleName != null and roleName !=''">
AND role_name like concat('%', #{roleName}, '%')
</when>
<otherwise>
AND note is not null
</otherwise>
</choose>
</select>
上述的場景就是:
首先,如果角色編號不為空,則只用角色編號作為條件查詢。
當(dāng)角色編號為空,而角色名稱不為空,則使用角色名稱作為條件進行模糊查詢。
當(dāng)角色編號和角色編號都為空,則要求角色備注不為空。
trim、where、set元素
在前面的SQL語句中加入了“1=1”,這樣可以實現(xiàn)其功能,但是有一個更好的實現(xiàn),那就是使用where。當(dāng)where元素里面的條件成立時,才會加入where這個SQL關(guān)鍵字到組裝的SQL里面,否則不會加入。
<select id="findRole3" parameterType="role" resultMap="roleResultMap">
select role_no, role_name, note from t_role
<where>
<if test="roleName != null and roleName !=''">
and role_name like concat('%', #{roleName}, '%')
</if>
<if test="note != null and note !=''">
and note like concat('%', #{note}, '%')
</if>
</where>
</select>
有時需要去掉一些特殊的SQL語法,比如常見的and、or等。使用trim元素也可以達到預(yù)期效果。其中prefix代表的語句的前綴,prefixOverrides代表的是需要去掉哪種字符串。與前面的where語句是等效的。
<select id="findRole4" parameterType="string" resultMap="roleResultMap">
select role_no, role_name, note from t_role
<trim prefix="where" prefixOverrides="and">
<if test="roleName != null and roleName !=''">
and role_name like concat('%', #{roleName}, '%')
</if>
</trim>
</select>
在hibernate中如果因為更新某一個字段而不得已發(fā)送所有的字段給持久化對象,這樣影響了SQL語句的執(zhí)行效率。最佳的方法是把主鍵和更新字段的值傳遞給SQL去更新。set元素就可以實現(xiàn)此功能。set元素遇到逗號,它會自動將對應(yīng)的逗號去掉。
<update id="updateRole" parameterType="role">
update t_role
<set>
<if test="roleName != null and roleName !=''">
role_name = #{roleName},
</if>
<if test="note != null and note != ''">
note = #{note}
</if>
</set>
where role_no = #{roleNo}
</update>
foreach元素
foreach元素是一個循環(huán)語句,它的作用是遍歷集合,它能很好的支持?jǐn)?shù)組和List、Set接口的集合,對此提供遍歷的功能,它往往用于SQL中的in關(guān)鍵字。
<select id="findRoleByNums" resultMap="roleResultMap">
select role_no, role_name, note from t_role where role_no in
<foreach item="roleNo" index="index" collection="roleNoList"
open="(" separator="," close=")">
#{roleNo}
</foreach>
</select>
collection配置的roleNoList是傳遞進來的參數(shù)名稱,它可以是一個數(shù)組、List、Set等集合。
item配置的是循環(huán)中當(dāng)前的元素。
index配置的是當(dāng)前元素在集合的位置下標(biāo)。
open和close配置的是以什么符號將這些集合元素包裝起來。
separator是各個元素的分隔符。
用test的屬性判斷字符串
test用于條件判斷語句,其作用相當(dāng)于判斷真假,在大多數(shù)場景下,主要用于判斷空和非空的。
<select id="getRoleTest" parameterType="string" resultMap="roleResultMap">
select role_no, role_name, note from t_role
<if test="type == 'Y'.toString()">
where 1=1
</if>
</select>
如果把 type='Y'傳遞給SQL,就可以實現(xiàn)Mybatis加入了條件 where 1=1,所以對于字符串的判斷,可以加入 toString ()的方法進行比較。
bind元素
bind元素的作用是通過OGNL表達式去定義一個上下文變量,這樣更方便使用。
例如在模糊查詢時,如果是MySQL數(shù)據(jù)庫,常常用到一個concat,它用 % 和 參數(shù)相連。然而在Oracle數(shù)據(jù)庫中則沒有,Oracle數(shù)據(jù)庫用連接符號是 “||”,這樣SQL就需要兩種形式去實現(xiàn),用bind元素,就不用使用數(shù)據(jù)庫語言。
<select id="findRole5" parameterType="string" resultMap="roleResultMap">
<bind name="pattern" value="'%' + _parameter + '%'" />
SELECT role_no, role_name, note FROM t_role
where role_name like #{pattern}
</select>
以上就是我在學(xué)習(xí)過程中對于Mybatis中的動態(tài)SQL語句的常見知識點總結(jié),希望大家可以一起學(xué)習(xí)進步!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL對小數(shù)進行四舍五入的操作實現(xiàn)
數(shù)學(xué)函數(shù)是MySQL中常用的一類函數(shù),其主要用于處理數(shù)字,包括整型和浮點數(shù)等等,本文主要介紹了MySQL對小數(shù)進行四舍五入的操作實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-08-08
詳解MySQL like如何查詢包含''%''的字段(ESCAPE用法)
這篇文章主要介紹了詳解MySQL like如何查詢包含'%'的字段(ESCAPE用法),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
mysql數(shù)據(jù)庫中g(shù)etshell的方式總結(jié)
MySQL版本大于5.0,MySQL 5.0版本以上會創(chuàng)建日志文件,我們通過修改日志文件的全局變量,就可以GetSHELL,下面這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫中g(shù)etshell的方式,需要的朋友可以參考下2022-07-07
mysql數(shù)據(jù)庫操作_高手進階常用的sql命令語句大全
mysql數(shù)據(jù)庫操作sql命令語句大全:三表連表查詢、更新時批量替換字段部分字符、判斷某一張表是否存在、自動增長恢復(fù)從1開始、查詢重復(fù)記錄、更新時字段值等于原值加上一個字符串、更新某字段為隨機值、復(fù)制表數(shù)據(jù)到另一個表、創(chuàng)建表時拷貝其他表的數(shù)據(jù)和結(jié)構(gòu)...2022-11-11
dbeaver導(dǎo)入sql腳本的詳細(xì)步驟(附圖文)
這篇文章主要給大家介紹了關(guān)于dbeaver導(dǎo)入sql腳本的詳細(xì)步驟,DBeaver是一款數(shù)據(jù)庫管理工具,最重要的是他是一款比較好的開源工具,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09
MySQL 服務(wù)器參數(shù)說明及查看 設(shè)置方法
MySQL 服務(wù)器參數(shù)說明及查看,設(shè)置方法,對于mysql不是很熟悉的朋友,可以參考下。2009-03-03

