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

2022-01-10 10:30 更新

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

if?

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

choose (when, otherwise)?

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

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

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

?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)簽中可以通過使用這個變量名訪問到元素。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號