主要內容:
if 標籤
where 標籤
trim 標籤
1. if 標籤
使用 if 標籤來判斷引數是否為空,來達到 sql 拼接的效果:
"selectproduct" resulttype="bean.product">
select * from product
where id = 1
test="name != null">
and name like #
if>
複製**
在 if 標籤中有乙個 test 屬性,它用來進行條件判斷,如果 test 屬性中的語句為 true,就將 if 標籤中的語句新增至上面的 sql 語句中,目前,我都是用在 web 專案中使用 if 標籤配合表單的輸入來進行模糊查詢
那麼如果所有的 if 標籤都不成立呢?馬上就會說到
2. where 標籤
這裡給出一條新的 sql 語句:
"selectproduct" resulttype="bean.product">
select * from product
where
test="id != null">
id = #
if>
test="name != null">
and name like #
if>
複製**
如果上述的所有 if 標籤都不成立呢,這 sql 語句就變為:
select * from product
where
複製**
這時候就不能執行了,因為發生了語法錯誤,所以我們改用 where 標籤:
select * from product
test="id != null">
id = #
if>
test="name != null">
and name like #
if>
where>
複製**
where 標籤存在的條件是至少有乙個子標籤存在,也就是至少有乙個 if 標籤成立,所以如果所有 if 標籤都不成立,sql 語句就變為:
select * from product
複製**
3. trim 標籤
我們假設,在上面的 sql 語句中還有乙個問題:如果 id 為空,而 name 不為空,那麼 sql 語句就變為:
select * from product
where and name like #
複製**
雖然這個假設不成立,在 where 標籤和接下來要說的 set 標籤中不會出現多餘的情況(是否可以認為是內建了 trim 標籤),但是我們還是要試一試,多出來乙個 and,看看 trim 標籤如何去除:
select * from product
"where" prefixoverrides="and ">
test="id != null">
id = #
if>
test="name != null">
and name like #
if>
複製**
將 where 標籤換成 trim 標籤,prefix 屬性表示我在這個標籤前面需要新增什麼,我這裡新增 where,因為我們已經把 where 標籤去掉了,為了語法正確性,新增 where
prefixoverrides 表示,如果指定的內容是多餘的(這裡指的是 and以及乙個空格),就會去掉
所以,如果 id 為空,name 不為空,sql 語句就變為:
select * from product
where name like #
複製**
這時候就能正常執行了
有的人會想,那如果有多個 and,豈不是就有多個 where?
稍微修改一下:
"where" prefixoverrides="and ">
test="barcode != null">
and barcode like #
if>
test="name != null">
and name like #
if>
test="units != null">
and units like #
if>
複製**
其實有多個 if 標籤,要去掉 and 的就只有第乙個成立的,比如說 barcode 不為空,就用 where 來替換 and,後面的不管成立不成立,都不會影響語法的正確性
注意,是語法的正確性,不管 name 或 units 是否為空,都不會導致 sql 語句無法執行,因為 where 後面已經有一條barcode like #
4. set 標籤
set 標籤用於動態更新,也就是更新那些需要更新的行,我們來看看用法:
update product
test="barcode != null">
barcode = #,
if>
test="name != null">
name = #,
if>
...set>
複製**
這裡由於篇幅關係,只給出更新兩項內容的語句,其餘的類似
在 if 標籤中的語句中最後又乙個逗號,這就和上面說的 and 是類似的,set 標籤會自動去除多餘的逗號,否則就會有語法錯誤,如果你想用 trim 來達到這種效果:
update product
"set" suffixoverrides=",">
test="barcode != null">
barcode = #,
if>
test="name != null">
name = #,
if>
複製**
這個標籤表示,去掉多餘的逗號,並在前面加上 set,使其成為語法正確的語句
總而言之,使用動態 sql 能夠避免 sql 拼接時可能會發生的種種錯誤
(十二)動態SQL之if trim
q mybatis動態sql有什麼用?執行原理?有哪些動態sql?mybatis動態sql可以在xml對映檔案內,以標籤的形式編寫動態sql,執行原理是根據表示式的值完成邏輯判斷並動態拼接sql的功能 mybatis提供了9種動態sql標籤 trim where set foreach if cho...
括號匹配(二)(動態規劃)
時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入 第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串...
mybatis 動態sql詳解
內容 轉到原網頁insert into t blog title,content,owner values select from t blog where id update t blog set title content owner where id select from t blog se...