【IBatis.net】動態SQL語句

在學習動態SQL語句以前,首先必須對條件查詢有必定了解,先來學習如何向IBatis.Net的映射文件裏傳入參數。html

1、條件查詢

  一、傳遞單個參數sql

  如根據Id查詢:緩存

    <select id="SelectPersonById" resultMap="Person" parameterClass="Int32" >
      SELECT * FROM Person WHERE Id = #Id#  --這樣傳入一個參數
    </select>

  調用的方法是:mybatis

PersonModel p = mapper.QueryForObject<PersonModel>("SelectPersonById", 3);   //3就是傳到SQL語句中的參數

  所以,最後生成的SQL語句爲:app

SELECT * FROM Person WHERE Id = 3

  以上只最簡單的方式,我連parameterClass都沒。svn

  二、傳遞多個參數學習

  傳遞多個參數一般使用鍵值對,如HashTable或實體類。google

  一、鍵值對的方式spa

  鍵值對的方式可使用HashTable或Dictionary<TKey,TValue>,當爲後者時映射文件中的parameterClass的值要爲:System.Collections.IDictionary。code

    <select id="SelectPersonById" resultMap="Person" parameterClass="HashTable">
      SELECT * FROM Person WHERE Id = #Id# AND Name = #Name#
    </select>

  調用方法:

            Hashtable ht = new Hashtable();
            ht.Add("Id",1);
            ht.Add("Name","劉備");
            PersonModel p = mapper.QueryForObject<PersonModel>("SelectPersonById", ht); 

  實際生成的SQL語句以下:

exec sp_executesql N'SELECT * FROM Person WHERE Id =  @param0  AND Name =  @param1',N'@param0 int,@param1 nvarchar(2)',@param0=1,@param1=N'劉備'

  IBatis.Net還不錯哦,自動緩存參數化查詢的執行計劃。

  二、自定義參數類

  自定義參數類一般是使用本實體類,固然你也能夠自定義一個參數類(與SQL語句中的參數同名就能夠)。

    <select id="SelectPersonById" resultMap="Person" parameterClass="Ibatis.Net.Domain.PersonModel">
      SELECT * FROM Person WHERE Id = #Id# AND Name = #Name#
    </select>

  調用方法:

  PersonModel p = new PersonModel();
  p.Id = 1;
  p.Name = "劉備";
  PersonModel p1 = mapper.QueryForObject<PersonModel>("SelectPersonById", p); 

2、動態查詢

  動態查詢的意思就是說,當知足必定的條件,才拼接某一段SQL代碼。

  仍是用剛纔的示例說明問題:

複製代碼
    <select id="SelectPersonById" resultMap="Person" parameterClass="Hashtable" >
      SELECT TOP 1 * FROM Person WHERE 1=1
      <dynamic prepend="AND">
        <isLessEqual prepend="AND" property="Id" compareValue="3">  <!--當傳入的參數Id小於3時,才拼接該子句-->
          Id = #Id#
        </isLessEqual>
        <isNotEmpty prepend="AND" property="Name">  <!--當傳入的參數Name不爲""或Null時,才拼接該子句-->
          Name = #Name#
        </isNotEmpty>
      </dynamic>
    </select>
複製代碼

  調用的方法不變,有意思的地方在這裏,假如傳入的參數爲:ht.Add("Id",4);

  則生成的SQL語句爲:

SELECT TOP 1 * FROM Person WHERE 1=1

  假如傳入的參數爲:ht.Add("Id",2);

  則生成的SQL語句爲:

SELECT TOP 1 * FROM Person WHERE 1=1 AND Id = @param0',N'@param0 int',@param0=2

  假如傳入的參數爲:ht.Add("Id",2);  ht.Add("Name","諸葛亮");

  則生成的SQL語句爲:

exec sp_executesql N'SELECT TOP 1 * FROM Person WHERE 1=1 AND Id =  @param0 AND Name =  @param1',N'@param0 int,@param1 nvarchar(3)',@param0=2,@param1=N'諸葛亮'

  動態查詢就是這樣,根據必定的判斷條件,去判斷是否應該拼接某段SQL代碼。

  更多的判斷條件以下:

屬性關鍵字

含義

<isEqual>

若是參數相等於值則查詢條件有效。

<isNotEqual>

若是參數不等於值則查詢條件有效。

<isGreaterThan>

若是參數大於值則查詢條件有效。

<isGreaterEqual>

若是參數大於等於值則查詢條件有效。

<isLessEqual>

若是參數小於值則查詢條件有效。

<isPropertyAvailable>

若是參數中有此屬性則查詢條件有效。

<isNotPropertyAvailable>

若是參數中沒有此屬性則查詢條件有效。

<isNull>

若是參數爲NULL則查詢條件有效。

<isNotNull>

若是參數不爲NULL則查詢條件有效。

<isEmpty>

若是參數爲空則查詢條件有效。

<isNotEmpty>

若是參數不爲空則查詢條件有效。

<isParameterPresent>

若是存在參數對象則查詢條件有效。

<isNotParameterPresent>

若是不存在參數對象則查詢條件有效。

  屬性說明:

  • perpend——可被覆蓋的SQL語句組成部分,添加在語句的前面,該屬性爲可選。
  • property——是比較的屬性,該屬性爲必選。
  • compareProperty——另外一個用於和前者比較的屬性(必選或選擇compareValue屬性)
  • compareValue——用於比較的值(必選或選擇compareProperty屬性)

  還有一個比較特別的判斷條件:iterate。這個東西用於循環生成多個SQL片斷。

複製代碼
    <select id="SelectPersonWithCountryName" resultMap="Person">
      SELECT Person.Id,Person.Age,Person.Name,Country.CountryName FROM Person INNER JOIN Country ON Person.CountryId = Country.Id
    </select>
    <select id="SelectPersonById" resultMap="Person" parameterClass="Hashtable" >
      SELECT * FROM Person
      <dynamic prepend="WHERE">
        <isNotNull prepend="And" property="NameList">  <!--遍歷NameList參數,對於每個生成一個Name in NameList[i]-->
          Name in
          <iterate property="NameList" open="(" close=")" conjunction=",">
            #NameList[]#
            </iterate>
        </isNotNull>
      </dynamic>
    </select>
複製代碼

  調用方法爲:

複製代碼
  List<string> ListStr = new List<string>();
  ListStr.Add("劉備");
  ListStr.Add("黃忠");
  ListStr.Add("曹操");
  Hashtable ht = new Hashtable();
  ht.Add("NameList",ListStr);
  IList<PersonModel> ListP = mapper.QueryForList<PersonModel>("SelectPersonById", ht);
複製代碼

  生成的SQL語句爲:

exec sp_executesql N'SELECT * FROM Person WHERE Name in (@param0,@param1,@param2)',N'@param0 nvarchar(2),@param1 nvarchar(2),@param2 nvarchar(2)',@param0=N'劉備',@param1=N'黃忠',@param2=N'曹操'

  Iterate的屬性:

  • prepend——可被覆蓋的SQL語句組成部分,添加在語句的前面,該屬性爲可選。
  • property——類型爲List的用於遍歷的元素屬性,該屬性爲必選。
  • open——整個遍歷內容體開始的字符串,用於定義括號,該屬性爲可選。
  • close ——整個遍歷內容體結束的字符串,用於定義括號,該屬性爲可選。
  • conjunction——每次遍歷內容之間的字符串,用於定義AND或OR,該屬性爲可選。

  最後附上好不容易纔找到的1.62的源代碼 http://mybatisnet.googlecode.com/svn/tags/cs_release_1.6.2/

 

 

摘自http://www.cnblogs.com/kissdodog/p/3436587.html  本身保存

相關文章
相關標籤/搜索