【转】ibatis.net中的单个参数查询、多个参数查询和实体类查询以及动态SQL语句生成查询
【转】ibatis.net中的单个参数查询、多个参数查询和实体类查询以及动态SQL语句生成查询
刘昌鑫 发表于1年前
【转】ibatis.net中的单个参数查询、多个参数查询和实体类查询以及动态SQL语句生成查询
  • 发表于 1年前
  • 阅读 7
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 单个参数查询和多个参数利用hashtable比我自己写的要清楚,动态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/

共有 人打赏支持
粉丝 3
博文 42
码字总数 10199
×
刘昌鑫
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: