HasorDB Mapper 配置動(dòng)態(tài)SQL

2022-01-10 10:30 更新

HasorDB 提供基于XML 動(dòng)態(tài) SQL 配置,并且采用了大家熟悉的 MyBatis 風(fēng)格。

if?

?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 生成。

choose (when, otherwise)?

同 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)?

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

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

?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)到元素。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)