1. 程式人生 > >IBATIS動態SQL(轉)

IBATIS動態SQL(轉)

  直接使用JDBC一個非常普遍的問題就是動態SQL。使用引數值、引數本身和資料列都是動態SQL,通常是非常困難的。典型的解決辦法就是用上一堆的IF-ELSE條件語句和一連串的字串連線。對於這個問題,Ibatis提供了一套標準的相對比較清晰的方法來解決一個問題,這裡有個簡單的例子:

     <select id="getUserList" resultMap="user">

         select * from user

            <isGreaterThan prepend="and" property="id" compareValue="0">

                   where user_id = #userId#

            </isGreaterThan>

             order by createTime desc

    </select>

     上面的例子中,根據引數bean“id”屬性的不同情況,可建立兩個可能的語句。如果引數“id”大於0,將建立下面的語句:

      select * from user where user_id = ?  order by createTime desc

     或者,如果“id”引數小於等於0,將建立下面的語句:       select * from user  order by createTime desc

 以上的這個例子是否可以看出Ibatis裡提供的簡單的寫法來實現了複雜拖沓的動態SQL呢?我們在做查詢的時候,對於同一個表,甚至可以用來定義一個動態SQL,做到重用的地步,還是上面那個例子:

<sql id="queryCondition">

     <dynamic prepend="WHERE">

            <isGreaterThan prepend="and" property="id" compareValue="0">

                   where user_id = #userId#

            </isGreaterThan>

   </dynamic>

</sql>

<select id="getUserList" resultMap="user">

         select * from user

        <!-- 引入動態的查詢條件 -->

         <include refid="queryCondition"/>

          order by createTime desc

    </select>

      這個使用的話是否更加的具有公用效能,這就是Ibatis帶來的便利。

      在Ibatis中,動態的條件元素包含一下幾種:二元條件元素、一元條件元素和其他條件元素:

      (1)、二元條件元素:將一個屬性值和靜態值或另一個屬性值比較,如果條件為真,元素將被包容在查詢SQL語句中。

            二元條件元素的屬性:

             perpend——可被覆蓋的SQL語句組成部分,新增在語句的前面(可選)

             property——是比較的屬性(必選)

             compareProperty——另一個用於和前者比較的屬性(必選或選擇compareValue)

             compareValue——用於比較的值(必選或選擇compareProperty)

 <isEqual>  比較屬性值和靜態值或另一個屬性值是否相等。
 <isNotEqual>  比較屬性值和靜態值或另一個屬性值是否不相等。
 <isGreaterThan>  比較屬性值是否大於靜態值或另一個屬性值。
 <isGreaterEqual>  比較屬性值是否大於等於靜態值或另一個屬性值。
 <isLessThan>  比較屬性值是否小於靜態值或另一個屬性值。
 <isLessEqual>

 比較屬性值是否小於等於靜態值或另一個屬性值。

舉個小例子:

     <isLessEqual prepend=”AND” property=”age” compareValue=”18”>           ADOLESCENT = ‘TRUE’       </isLessEqual>

    如果大於等18歲時,則為成年人

   (2)、一元條件元素:一元條件元素檢查屬性的狀態是否符合特定的條件。

     一元條件元素的屬性:

      prepend——可被覆蓋的SQL語句組成部分,新增在語句前面(可選)

      property——被比較的屬性(必選)

 <isPropertyAvailable> 檢查是否存在該屬性(存在parameter bean的屬性) 
 <isNotPropertyAvailable>  檢查是否不存在該屬性(不存在parameter bean的屬性)
 <isNull>  檢查屬性是否為null
 <isNotNull>  檢查屬性是否不為null
 <isEmpty>  檢查Collection.size()的值,屬性的String或String.valueOf()值,是否為null或空(“”或size() < 1)
 <isNotEmpty>  檢查Collection.size()的值,屬性的String或String.valueOf()值,是否不為null或不為空(“”或size() > 0)

小例子:

    <isNotEmpty prepend="AND" property="firstName" >            FIRST_NAME=#firstName#    </isNotEmpty>

   (3)、其他元素條件

         (a).Parameter Present:這些元素檢查引數物件是否存在

         Parameter Present條件的屬性

        prepend - 可被覆蓋的SQL語句組成部分,新增在語句的前面(可選)

 <isParameterPresent>  檢查是否存在引數物件(不為null)
 <isNotParameterPresent>  例子: <isNotParameterPresent prepend=”AND”> EMPLOYEE_TYPE = ‘DEFAULT’ </isNotParameterPresent>

    (b)、Iterate:這屬性遍歷整個集合,併為List集合中的元素重複元素體的內容。

          Iterate的屬性:

          prepend - 可被覆蓋的SQL語句組成部分,新增在語句的前面(可選)           property - 型別為java.util.List的用於遍歷的元素(必選)           open - 整個遍歷內容體開始的字串,用於定義括號(可選)           close -整個遍歷內容體結束的字串,用於定義括號(可選)           conjunction - 每次遍歷內容之間的字串,用於定義AND或OR(可選)

 <iterate> 遍歷型別為java.util.List的元素。 例子: <iterate prepend="AND"  property="userNameList" open="(" close=")" conjunction="OR"> username=#userNameList[]# </iterate> 注意:使用<iterate>時,在List元素名後面包括方括號[]非常重要,方括號[]將物件標記為List,以防解析器簡單地將List輸出成String。 

     以上講述了關於Ibatis的動態SQL的功能,是否覺得非常強大,並且優雅呢?那還猶豫什麼呢?行動起來。

相關推薦

IBATIS動態SQL

  直接使用JDBC一個非常普遍的問題就是動態SQL。使用引數值、引數本身和資料列都是動態SQL,通常是非常困難的。典型的解決辦法就是用上一堆的IF-ELSE條件語句和一連串的字串連線。對於這個問題,Ibatis提供了一套標準的相對比較清晰的方法來解決一個問題,這裡有個簡單的例子:      <sel

MyBatis基礎:MyBatis動態SQL3

span column foreach param ati when nbsp base condition 1. 概述   MyBatis中動態SQL包括元素: 元素作用備註 if 判斷語句 單條件分支判斷 choose(when、othe

spring boot-mybatis三種動態sql5

內部 轉換成 ava .get bat class ide div upd 腳本sql XML配置方式的動態SQL我就不講了,有興趣可以自己了解,下面是用<script>的方式把它照搬過來,用註解來實現。適用於xml配置轉換到註解配置 @Select("&l

MyBatis的動態SQL

pan 需要 9.png ack bat 鏈接 where In 標簽    用於實現動態SQL的元素主要有iftrimwheresetchoose(when、otherwise)foreach if標簽   Where標簽   Sql後面添加: where 1=1 ,那

JDBC批量執行sql

JDBC的批量處理語句包括下面兩個方法:addBatch(String):新增需要批量處理的SQL語句或是引數;executeBatch();執行批量處理語句;通常我們會遇到兩種批量執行SQL語句的情況

mybatis--動態SQLif

本篇博文適合已學過相關動態SQL的讀者,因為本文省略了許多語句,僅僅把最需要說明的部分寫出來,歡迎提建議,共同進步!!! 1.<if> if 元素與java中的if差不多 --------------------------------------------------

mybatis--動態SQL

**本博文僅僅作為本人的學習小總結,適合有相關基礎,但對該部分的內容比較困惑的讀者,歡迎提建議,共同進步         在使用<if>元素時,只要test屬性中的表示式為true,就會執行元素中的條件語句,但是在實際應用中只需要從多個選項

【Mybatis】MyBatis之動態SQL

aslist 當前 public 不能 var int nts email tle   MyBatis 的強大特性之一便是它的動態 SQL,本章介紹動態 SQL   查看本章,請先閱讀【Mybatis】MyBatis對表執行CRUD操作(三)。   本例表結構 1 CRE

使用Mybatis實現動態SQL

使用Mybatis實現動態SQL 作者 : Stanley 羅昊 【轉載請註明出處和署名,謝謝!】 寫在前面:        *本章節適合有Mybatis基礎者觀看* 使用Mybatis實現動態SQL(一)連結:https://www.cnblogs.com/

靜態鏈接庫與動態鏈接庫的區別及動態庫的創建

相關 賦值 include ret sta 參數解析 span static 很好 一、引言通常情況下,對函數庫的鏈接是放在編譯時期(compile time)完成的。所有相關的對象文件(object file)與牽涉到的函數庫(library)被鏈接合成一個可執行文

Unity3d使用心得2:Unity3d 動態下載動畫資源——AnimationClip 的使用 - 斯瑪特琦

通過 dsm color 解決 con content 資源 sse popu 引言: 在使用 Unity3d 開發微端、或者網頁遊戲的時候常常須要將資源打包成 AssetBundle ,然後通過 www 的方式動態的下載資源。今天要分享的是我再動態下

Android 6.0 - 動態權限管理的解決方案

long div span 添加 包含 detail 工具類 putextra ref 轉自:http://www.cnblogs.com/dubo-/p/6018262.html Android 6.0 - 動態權限管理的解決方案 轉載請標註 Android 6.

dp動態規劃分類詳解

fun balance card 給定 def bits eve 回文串 好的 dp動態規劃分類詳解 轉自:http://blog.csdn.NET/cc_again/article/details/25866971 動態規劃一直是ACM競賽中的重點,同時又是難點,因為

MyBatis在註解上使用動態SQL@select使用if

quest param select derby where 1=1 color 建議 utils and 1、用script標簽包圍,然後像xml語法一樣書寫 @Select({"<script>", "SELECT * FROM tbl_or

java的動態代理機制詳解

spring throw system urn log enc before 代理類 三個參數 原文出自:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在學習Spring的時候,我們知道Spring主要

使用MYSQL命令直接導入導出SQL文件

cmd 界面 eat 保存 tail utf mysqldump info tails 參考:http://blog.csdn.net/jiary5201314/article/details/52026816 1.MYSQL中將數據庫導出成SQL文件 其實很簡單的,就

深入探討Linux靜態庫與動態庫的詳解

share 分享 命名 one .com 過程 程序 簡單介紹 mage 2.生成動態庫並使用 linux下編譯時通過 -shared 參數可以生成動態庫(.so)文件,如下 庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。庫分靜態庫和動態庫兩種。

SQL Server 2005兩種安全驗證模式

信任 nbsp 維護 混合 login 帳戶 所有 兩種 seve (1) Windows身份驗證模式 Windows 身份驗證模式是指用戶通過 Windows 用戶帳戶連接到SQL Server,即用戶身份由Windows 系統來驗證。SQL Server 使用 Win

動態規劃初探及什麽是無後效性?

電腦 整理 tar aux 小白 zax ima 個數 研究 轉自:http://blog.csdn.net/qq_30137611/article/details/77655707 初探動態規化 剛學動態規劃,或多或少都有一些困惑。今天我們來看看什麽是動態規劃,以及他的

Linq to SQL 的連表查詢

equal query 交集 數據庫 調用 數據 變量 bst log 關於數據庫的查詢中經常需要用到多表的連接查詢,這裏就簡單地展示關於linq的查詢功能。 1、單表的查詢 [csharp] view plain copy var query = from