在動態sql中所做的最通用的事情是包含部分where字句的條件。比如:
這條語句會提供乙個可選的文字查詢功能。如果你沒有傳遞title,那麼所有啟用的部落格都會被返回。但是如果你傳遞了title,那麼就會查詢相近的title(對於敏銳的檢索,這中情況下你的引數值需要包含任意的遮掩或萬用字元)的部落格。id="findactiveblogwithtitlelike"
parametertype="blog"
resulttype="blog」>
select * from blog
where state = 'active'
title != null">
and title like #
if>
select>
假若我們想可選地搜尋title和author呢?首先,要改變語句的名稱讓它有意義。然後簡單加入另外的乙個條件。
前面的例子已經方便地處理了乙個臭名昭著的動態sql問題。要考慮我們回到「if」示例後會發生什麼,但是這次我們將「active = 1」也設定成動態的條件。parametertype="blog" resulttype="blog">
select * from blog where state = 'active'
and title like
#if>
and title like
#if>
select>
如果這些條件都沒有匹配上將會發生什麼?這條sql結束時就會成這樣:parametertype="blog" resulttype="blog">
select * from blog
where
state = #
if>
and title like
#if>
and title like
#if>
select>
select * from blog
where
這會導致查詢失敗。如果僅僅第二個條件匹配是什麼樣的?這條sql結束時就會是這樣:
select * from blog
where
and title like „sometitle‟
這個查詢也會失敗。這個問題不能簡單的用條件來解決,如果你從來沒有這樣寫過,那麼你以後也不會這樣來寫。
mybatis有乙個簡單的處理,這在90%的情況下都會有用。而在不能使用的地方,你可以自定義處理方式。加上乙個簡單的改變,所有事情都會順利進行:
where元素知道如果由被包含的標記返回任意內容,就僅僅插入「where」。而且,如果以「and」或「or」開頭的內容,那麼就會跳過where不插入。parametertype="blog" resulttype="blog">
select * from blog
state = #
if>
and title like
#if>
and title like
#if>
where>
select>
如果where元素沒有做出你想要的,你可以使用trim元素來自定義。比如,和where元素相等的trim元素是:
overrides屬性採用管道文字分隔符來覆蓋,這裡的空白也是重要的。它的結果就是移除在overrides屬性中指定的內容,插入在with屬性中的內容。prefix="where"
prefixoverrides="and |or ">
…trim>
和動態更新語句相似的解決方案是set。set元素可以被用於動態包含更新的列,而不包含不需更新的。比如:
這裡,set元素會動態前置set關鍵字,而且也會消除任意無關的逗號,那也許在應用條件之後來跟蹤定義的值。"updateauthorifnecessary"
parametertype="domain.blog.author">
update author
username=#,if>
password=#,if>
email=#,if>
bio=#if>
set>
where id=#
如果你對和這相等的trim元素好奇,它看起來就是這樣的:
注意這種情況下我們覆蓋乙個字尾,而同時也附加字首。prefix="set"
suffixoverrides=",">
…trim>
另外乙個動態sql通用的必要操作是迭代乙個集合,通常是構建在in條件中的。比如:
foreach元素是非常強大的,它允許你指定乙個集合,宣告集合項和索引變數,它們可以用在元素體內。它也允許你指定開放和關閉的字串,在迭代之間放置分隔符。這個元素是很智慧型的,它不會偶然地附加多餘的分隔符。
select *
from post p
where id in
"item" index="index" collection="list"
open="(" separator="," close=")">
#select>
介面動態配置 持久化反持久化
介面在可配置的情況下需要讀寫配置檔案,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只是物件模型到關係模型之間轉換的不同實現。只不過物件模型和關係模型應用廣泛,所以就會誤認為資料...