HasorDB 提供基于XML 動態(tài) SQL 配置,并且采用了大家熟悉的 MyBatis 風(fēng)格。
?if
?是最常用的一個用法,用于判斷某個條件滿足之后拼接對應(yīng)的 SQL。
<select id="queryUser">
select * from `test_user`
where state = 'ACTIVE'
<if test="age != null">
and age = #{age}
</if>
</select>
?if
?標(biāo)簽含有以下屬性
屬性名 | 描述 |
---|---|
test
|
必選,一個 ognl 表達(dá)式,表達(dá)式值是 boolean 表示判斷是否成立,若判斷成立則執(zhí)行 SQL 生成。 |
同 Java 語言中的 switch 語句一樣,?choose
?可以設(shè)置一組標(biāo)簽。 當(dāng)有條件被滿足之后會生成對應(yīng) ?when
?中的 SQL,如果有多個條件同時匹配,只有第一個會生效。若沒有匹配任何 ?when
?那么 ?otherwise
?會生效。
<select id="queryUser">
select * from `test_user`
where state = 'ACTIVE'
<choose>
<when test="title != null">and title = #{title}</when>
<when test="content != null">and content = #{content}</when>
<otherwise>and owner = "owner1"</otherwise>
</choose>
</select>
?choose
?標(biāo)簽和 ?otherwise
?標(biāo)簽不含有任何屬性。?when
?標(biāo)簽與 ?if
? 標(biāo)簽相同
屬性名 | 描述 |
---|---|
test
|
必選,一個 ognl 表達(dá)式,表達(dá)式值是 boolean 表示判斷是否成立,若判斷成立則執(zhí)行 SQL 生成。 |
?trim
?、?where
?、?set
?三個標(biāo)簽可以幫助我們在生成特定 SQL 語句時不會造成紕漏。在介紹它們?nèi)齻€之前看一下這個例子:
<select id="queryUser">
select * from `test_user`
where
<if test="age != null">
and age = #{age}
</if>
</select>
當(dāng) ?age
?屬性為空時會生成如下 SQL:
select * from `test_user`
where
這是一個無效 SQL 若想避免此類問題可以選擇 ?where
?標(biāo)簽。當(dāng) ?if
?條件成立 ?where
?標(biāo)簽中會輸出有效內(nèi)容,一旦出現(xiàn)有效內(nèi)容 ?where
?標(biāo)簽會自動增加 where 語句。
<select id="queryUser">
select * from `test_user`
<where>
<if test="age != null">
age = #{age}
</if>
</where>
</select>
生成的語句將會是下列兩種:
select * from `test_user`;
select * from `test_user` where and age = ?
例如下面這個例子 ?where
?中多個條件,如果第一個條件匹配失敗有可能出現(xiàn) and 作為開頭的情況。 而 ?where
?標(biāo)簽將會自動檢測如果是 ?and
?或 ?or
?開頭的則自動去掉它們
<select id="queryUser">
select * from `test_user`
<where>
<if test="age != null">
age = #{age}
</if>
<if test="name != null">
and name = #{name}
</if>
</where>
</select>
如果 ?where
?并未按照與其的那樣生成 SQL 可以使用 ?trim
?標(biāo)簽來自定義它。下列 trim 標(biāo)簽用法與 where 是等價的
<trim prefix="where" prefixOverrides="and | or">
...
</trim>
對于動態(tài)更新列語句可以選擇 ?set
?標(biāo)簽,例如:
<update id="queryUser">
update `test_user`
<set>
<if test="age != null">age=#{age},</if>
<if test="name != null">name=#{name},</if>
</set>
where id=#{id}
</update>
以下是使用 ?trim
?標(biāo)簽和 ?set
?標(biāo)簽等價的方式
<trim prefix="set" suffixOverrides=",">
...
</trim>
?where
?標(biāo)簽和 ?set
?標(biāo)簽都不含有任何屬性。?trim
?標(biāo)簽的可選屬性如下:
屬性名 | 描述 |
---|---|
prefix
|
可選,trim 在生成 SQL 時候的前綴。 |
suffix
|
可選,trim 在生成 SQL 時候的尾綴。 |
prefixOverrides
|
可選,當(dāng)生成的 SQL 前幾個字符匹配這個屬性時會被自動裁剪掉,若要配置多個匹配項。需要用 豎線 來分割。 |
suffixOverrides
|
可選,當(dāng)生成的 SQL 后面幾個字符匹配這個屬性時會被自動裁剪掉,若要配置多個匹配項。需要用 豎線 來分割。 |
?foreach
?標(biāo)簽是常用的一個標(biāo)簽,通常是用來構(gòu)建 ?in
?語句或者 ?values
?的值列表。
<select id="queryByIds">
select * from `test_user`
where id in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
?foreach
?標(biāo)簽的可選屬性如下:
屬性名 | 描述 |
---|---|
collection
|
必選,要遍歷的數(shù)據(jù),可以是數(shù)組、集合。 |
item
|
必選,在遍歷數(shù)據(jù)過程中,用于標(biāo)識當(dāng)前元素的變量名。在標(biāo)簽中可以通過使用這個變量名訪問到元素。 |
open
|
可選,在開始遍歷時候的輸出到動態(tài) SQL 的前綴部分。 |
close
|
可選,在開始遍歷時候的輸出到動態(tài) SQL 的尾綴部分。 |
separator
|
可選,在遍歷的過程中,用于區(qū)分每個元素的間隔字符。 |
?bind
?標(biāo)簽允許通過 ?ognl
?表達(dá)式創(chuàng)建一個變量并將其綁定到上下文。例如:
<select id="queryByLike">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
select * from `test_user`
where title like #{pattern}
</select>
bind 標(biāo)簽的可選屬性如下:
屬性名 | 描述 |
---|---|
name
|
必選,要遍歷的數(shù)據(jù),可以是數(shù)組、集合。 |
value
|
必選,在遍歷數(shù)據(jù)過程中,用于標(biāo)識當(dāng)前元素的變量名。在標(biāo)簽中可以通過使用這個變量名訪問到元素。 |
更多建議: