您好,登錄后才能下訂單哦!
這篇文章主要介紹“Mybatis中where標簽與if標簽怎么結合使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Mybatis中where標簽與if標簽怎么結合使用”文章能幫助大家解決問題。
select篩選出視圖對象的參數,用于給前端返回頁面參數使用。
<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>
再看一下錯誤的寫法;
<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>
這時候運行該代碼,當beginCreateTime
或endCreateTime
為空時,我們會發現報錯SQL執行異常,原因是where多了一個and
。
當<if>
標簽判斷失敗后, <where>
標簽關鍵字可以自動去除掉庫表字段賦值前面的and
,不會去掉語句后面的and
關鍵字,即<where>
標簽只會去掉<if>
標簽語句中的最開始的and
關鍵字。所以上面的寫法(and
寫在后面)是不符合mybatis規范的。
當不使用<where>
標簽時,正確的寫法可以參考以下代碼:
<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>
此時我們發現and
是寫在前面的,同時增加了1=1
條件。
如果我們去掉1=1
條件,同時去掉第一個<if>
標簽的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>
這種情況下,當fileName
為空時,sql語句中會出現where and
這種錯誤的語法,最終導致sql執行異常。所以正確的代碼中,使用1=1
條件,當fileName
為空時,sql語句就會變成where 1=1
,后面接不接and
都能正確執行。
在不使用<where>
標簽的情況下,and
寫在后面,在where
條件最后增加1=1
判斷,原理和上面一樣,這里就不再贅述了。
關于“Mybatis中where標簽與if標簽怎么結合使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。