在學習動態SQL語句以前,首先必須對條件查詢有必定了解,先來學習如何向IBatis.Net的映射文件裏傳入參數。html
一、傳遞單個參數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);
動態查詢的意思就是說,當知足必定的條件,才拼接某一段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> |
若是不存在參數對象則查詢條件有效。 |
屬性說明:
還有一個比較特別的判斷條件: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的屬性:
最後附上好不容易纔找到的1.62的源代碼 http://mybatisnet.googlecode.com/svn/tags/cs_release_1.6.2/
摘自http://www.cnblogs.com/kissdodog/p/3436587.html 本身保存