MyBatis資料持久化(九)動態sql

2021-07-03 12:21:22 字數 2675 閱讀 3738

在動態sql中所做的最通用的事情是包含部分where字句的條件。比如:

id="findactiveblogwithtitlelike"

parametertype="blog"

resulttype="blog」>

select * from blog

where state = 'active'

title != null">

and title like #

if>

select>

這條語句會提供乙個可選的文字查詢功能。如果你沒有傳遞title,那麼所有啟用的部落格都會被返回。但是如果你傳遞了title,那麼就會查詢相近的title(對於敏銳的檢索,這中情況下你的引數值需要包含任意的遮掩或萬用字元)的部落格。

假若我們想可選地搜尋title和author呢?首先,要改變語句的名稱讓它有意義。然後簡單加入另外的乙個條件。

parametertype="blog" resulttype="blog">

select * from blog where state = 'active'

and title like

#if>

and title like

#if>

select>

前面的例子已經方便地處理了乙個臭名昭著的動態sql問題。要考慮我們回到「if」示例後會發生什麼,但是這次我們將「active = 1」也設定成動態的條件。

parametertype="blog" resulttype="blog">

select * from blog

where

state = #

if>

and title like

#if>

and title like

#if>

select>

如果這些條件都沒有匹配上將會發生什麼?這條sql結束時就會成這樣:

select * from blog

where

這會導致查詢失敗。如果僅僅第二個條件匹配是什麼樣的?這條sql結束時就會是這樣:

select * from blog

where

and title like „sometitle‟

這個查詢也會失敗。這個問題不能簡單的用條件來解決,如果你從來沒有這樣寫過,那麼你以後也不會這樣來寫。

mybatis有乙個簡單的處理,這在90%的情況下都會有用。而在不能使用的地方,你可以自定義處理方式。加上乙個簡單的改變,所有事情都會順利進行:

parametertype="blog" resulttype="blog">

select * from blog

state = #

if>

and title like

#if>

and title like

#if>

where>

select>

where元素知道如果由被包含的標記返回任意內容,就僅僅插入「where」。而且,如果以「and」或「or」開頭的內容,那麼就會跳過where不插入。

如果where元素沒有做出你想要的,你可以使用trim元素來自定義。比如,和where元素相等的trim元素是:

prefix="where"

prefixoverrides="and |or ">

…trim>

overrides屬性採用管道文字分隔符來覆蓋,這裡的空白也是重要的。它的結果就是移除在overrides屬性中指定的內容,插入在with屬性中的內容。

和動態更新語句相似的解決方案是set。set元素可以被用於動態包含更新的列,而不包含不需更新的。比如:

"updateauthorifnecessary"

parametertype="domain.blog.author">

update author

username=#,if>

password=#,if>

email=#,if>

bio=#if>

set>

where id=#

這裡,set元素會動態前置set關鍵字,而且也會消除任意無關的逗號,那也許在應用條件之後來跟蹤定義的值。

如果你對和這相等的trim元素好奇,它看起來就是這樣的:

prefix="set"

suffixoverrides=",">

…trim>

注意這種情況下我們覆蓋乙個字尾,而同時也附加字首。

另外乙個動態sql通用的必要操作是迭代乙個集合,通常是構建在in條件中的。比如:

select *

from post p

where id in

"item" index="index" collection="list"

open="(" separator="," close=")">

#select>

foreach元素是非常強大的,它允許你指定乙個集合,宣告集合項和索引變數,它們可以用在元素體內。它也允許你指定開放和關閉的字串,在迭代之間放置分隔符。這個元素是很智慧型的,它不會偶然地附加多餘的分隔符。

介面動態配置 持久化反持久化

介面在可配置的情況下需要讀寫配置檔案,vcl提供了一種方式 treader 和 twriter 方式儲存介面資源。object form1 tform1 left 0 top 0 caption form1 object lbl1 tlabel left 200 top 152 end object...

RabbitMQ 九 訊息持久化

rabbitmq系列rabbitmq 一 簡介rabbitmq 二 模式型別rabbitmq 三 簡單模式 rabbitmq 四 工作佇列模式 rabbitmq 五 發布訂閱模式 rabbitmq 六 路由模式 rabbitmq 七 主題模式 rabbitmq 八 訊息確認 rabbitmq 九 訊...

資料持久化

資料持久化就是將記憶體中的資料模型轉換為儲存模型,以及將儲存模型轉換為記憶體中的資料模型的統稱.資料模型可以是任何資料結構或物件模型,儲存模型可以是關係模型 xml 二進位製流等。cmp和hibernate只是物件模型到關係模型之間轉換的不同實現。只不過物件模型和關係模型應用廣泛,所以就會誤認為資料...