日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

IBatis.net动态SQL语句

發布時間:2025/5/22 数据库 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IBatis.net动态SQL语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

一、條件查詢

  1、傳遞單個參數

  如根據Id查詢:

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

  調用的方法是:

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

  因此,最后生成的SQL語句為:

SELECT * FROM Person WHERE Id = 3

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

  2、傳遞多個參數

  傳遞多個參數通常使用鍵值對,如HashTable或實體類。

  1、鍵值對的方式

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

<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還不錯哦,自動緩存參數化查詢的執行計劃。

  2、自定義參數類

  自定義參數類通常是使用本實體類,當然你也可以自定義一個參數類(與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);

二、動態查詢

  動態查詢的意思就是說,當滿足一定的條件,才拼接某一段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/

轉載于:https://www.cnblogs.com/soundcode/p/4983179.html

總結

以上是生活随笔為你收集整理的IBatis.net动态SQL语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。