1.情景展示
有時候,我們需添加動態where條件,也就是多個if條件判斷,如何實現?
動態SQL還是很常見的,這里分情況說明
2.mybatis
mybatis的用法相對簡單,是我們經常會用到的
直接使用<if test=""></if>標簽搞定即可
2.mysql
動態where條件,通常會在存儲過程中使用
通過if()函數實現,使用的關鍵點在於:1=1,當條件不成立時,執行的是:and 1=1,1=1永遠成立,所以不影響其他限制條件的執行
3.oracle
上面同樣可以也能在oracle中通過decode()函數實現
關鍵點在於:變量為空的時候,自己=自己,否則的話變量和它作對比。
mysql和oracle的難點在於:想不到原來還可以這樣使用。
updateTime--2021年10月28日11:25:29
4.關於mybatis的補充
評論區的園友提出的意見很好,這里對mybatis標簽的運用,進行一下補充說明。
第一,where條件后面的動態SQL語句,有兩種使用方式。
情形1:where后面的第一個條件是必須存在的,后面的限制條件可有可無
實現方式一:
使用<if></if>標簽
where NAME = #{name} <if test="age != null and age != ''"> and AGE = #{age} </if>
實現方式二:
使用<where><if></if></where>標簽
<where> <if test="name != null and name != ''"> and NAME = #{name} </if> <if test="age != null and age != ''"> and AGE = #{age} </if> </where>
反正name是非空的,就算加上非空判斷也是可行。
情形2:where條件后面的條件,都是可有可無的
實現方式一:
使用<if></if>標簽
where 1=1 <if test="name != null and name != ''"> and NAME = #{name} </if> <if test="age != null and age != ''"> and AGE = #{age} </if>
實現方式二:
使用<where><if></if></where>標簽
<where> <if test="name != null and name != ''"> NAME = #{name} </if> <if test="age != null and age != ''"> and AGE = #{age} </if> </where>
<where>和<if>組合語法說明:
where 元素只有在1個以上的IF條件成立的情況下才會插入“WHERE”子句(當IF條件都不成立時,SQL語句末尾不會有where);
若where后面第一個IF條件成立,且前面帶有AND關鍵詞時,會自動將其過濾掉。
其它語法說明:
IF條件的test表達式中的and、or不能用&&、 ||代替,如果非要使用,需要轉義;
如果等式(=)左側是動態字段(變量)的話,正確使用方式為:${變量名},例如:${name}。