Mybatis中where標(biāo)簽與if標(biāo)簽結(jié)合使用詳細(xì)說明
前言
由于不小心將and或者or寫在了語句后面,導(dǎo)致mybatis無法自主判別,這種問題在新上手的同學(xué)中很是常見。下面我們探討一下,在哪些情況下Mybatis無法判斷動(dòng)態(tài)SQL語句中的and或者or。
使用<where>標(biāo)簽
select篩選出視圖對象的參數(shù),用于給前端返回頁面參數(shù)使用。
<sql id="selectFileVo">
select file_id,
uuid,
file_name,
file_url,
status,
create_time,
update_time
from file
</sql>
以下代碼格式是正確,我們先觀察下and或者or的位置。
<select id="selectFileList" parameterType="File" resultMap="FileResult">
<include refid="selectFileVo"/>
<where>
<if test="fileName != null and fileName != ''">
and file_name like concat('%', #{fileName}, '%')
</if>
<if test="status != null and status != ''">
and status = #{status}
</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
and create_time between #{params.beginCreateTime} and #{params.endCreateTime}
</if>
</where>
</select>
再看一下錯(cuò)誤的寫法;
<select id="selectFileList" parameterType="File" resultMap="FileResult">
<include refid="selectFileVo"/>
<where>
<if test="fileName != null and fileName != ''">
file_name like concat('%', #{fileName}, '%') and
</if>
<if test="status != null and status != ''">
status = #{status} and
</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
create_time between #{params.beginCreateTime} and #{params.endCreateTime}
</if>
</where>
</select>
這時(shí)候運(yùn)行該代碼,當(dāng)beginCreateTime或endCreateTime為空時(shí),我們會(huì)發(fā)現(xiàn)報(bào)錯(cuò)SQL執(zhí)行異常,原因是where多了一個(gè)and。
總結(jié)
當(dāng)<if>標(biāo)簽判斷失敗后, <where> 標(biāo)簽關(guān)鍵字可以自動(dòng)去除掉庫表字段賦值前面的and,不會(huì)去掉語句后面的and關(guān)鍵字,即<where> 標(biāo)簽只會(huì)去掉<if> 標(biāo)簽語句中的最開始的and關(guān)鍵字。所以上面的寫法(and寫在后面)是不符合mybatis規(guī)范的。
不使用<where>標(biāo)簽
當(dāng)不使用<where>標(biāo)簽時(shí),正確的寫法可以參考以下代碼:
<select id="selectFileList" parameterType="File" resultMap="FileResult">
<include refid="selectFileVo"/>
where 1=1
<if test="fileName != null and fileName != ''">
and file_name like concat('%', #{fileName}, '%')
</if>
<if test="status != null and status != ''">
and status = #{status}
</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
and create_time between #{params.beginCreateTime} and #{params.endCreateTime}
</if>
</select>
此時(shí)我們發(fā)現(xiàn)and是寫在前面的,同時(shí)增加了1=1條件。
如果我們?nèi)サ?code>1=1條件,同時(shí)去掉第一個(gè)<if>標(biāo)簽的and。
<select id="selectFileList" parameterType="File" resultMap="FileResult">
<include refid="selectFileVo"/>
where
<if test="fileName != null and fileName != ''">
file_name like concat('%', #{fileName}, '%')
</if>
<if test="status != null and status != ''">
and status = #{status}
</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
and create_time between #{params.beginCreateTime} and #{params.endCreateTime}
</if>
</select>
這種情況下,當(dāng)fileName為空時(shí),sql語句中會(huì)出現(xiàn)where and這種錯(cuò)誤的語法,最終導(dǎo)致sql執(zhí)行異常。所以正確的代碼中,使用1=1條件,當(dāng)fileName為空時(shí),sql語句就會(huì)變成where 1=1 ,后面接不接and都能正確執(zhí)行。
在不使用<where>標(biāo)簽的情況下,and寫在后面,在where條件最后增加1=1判斷,原理和上面一樣,這里就不再贅述了。
總結(jié)
到此這篇關(guān)于Mybatis中where標(biāo)簽與if標(biāo)簽結(jié)合使用的文章就介紹到這了,更多相關(guān)Mybatis使用where標(biāo)簽與if標(biāo)簽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一次Jvm old過高的排查過程實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了一次Jvm old過高的排查過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
詳細(xì)介紹Java阿里云的短信驗(yàn)證碼實(shí)現(xiàn)
這篇文章主要介紹了詳細(xì)介紹Java阿里云的短信驗(yàn)證碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Java實(shí)戰(zhàn)之醫(yī)院管理系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了如何利用Java實(shí)現(xiàn)醫(yī)院管理系統(tǒng),文中用到的技術(shù)有:SpringBoot、Layui、Freemaker等,感興趣的同學(xué)可以了解一下2022-04-04
SpringBoot3各種配置的優(yōu)先級對比小結(jié)
SpringBoot3提供了多種配置來源以滿足不同場景下的需求,本文詳細(xì)介紹了SpringBoot3中的配置優(yōu)先級對比小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12
Java自定義注解對枚舉類型參數(shù)的校驗(yàn)方法
文章介紹了如何使用Java注解對枚舉類型參數(shù)進(jìn)行校驗(yàn),通過自定義注解和注解校驗(yàn)類實(shí)現(xiàn)參數(shù)的靈活性校驗(yàn),感興趣的朋友一起看看吧2025-01-01

