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