初識 Mybatis(二) 動態 SQL

2021-09-11 10:11:05 字數 3180 閱讀 5225

主要內容:

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...