在学习动态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",);
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 = ;
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/

 
 
原文地址:http://www.cnblogs.com/kissdodog/p/3436587.html

IBatis.net动态SQL语句(六)的更多相关文章

  1. Ibatis.Net 动态SQL语句学习(六)

    在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数吧. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&qu ...

  2. IBatis.net动态SQL语句

    在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&quo ...

  3. MyBatis学习(三)、动态SQL语句

    三.动态SQL语句 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Orac ...

  4. 三、动态SQL语句

    //备注:该博客引自:http://limingnihao.iteye.com/blog/106076 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空, ...

  5. MyBatis学习 之 三、动态SQL语句

    目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...

  6. mybatis 学习五 动态SQL语句

    3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selectKey ...

  7. MyBatis学习 之 四、动态SQL语句

    有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysq ...

  8. mybatis--MyBatis动态SQL语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...

  9. MySQL存储过程动态SQL语句的生成

    用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...

随机推荐

  1. TortoiseGIT

    TortoiseGIT 是Git版本控制系统的一个免费开源客户端,它是git版本控制的 Windows 扩展.可以使你避免使用枯燥而且不方便的命令行.它完全嵌入 Windows Explorer,使用 ...

  2. C++——类和动态内存分配

    一.动态内存和类 1.静态类成员 (1)静态类成员的特点 无论创建多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象都共享同一个静态成员. (2)初始化静态成员变量 1)不能在类声明中初 ...

  3. graph-tool文档(一)- 快速开始使用Graph-tool - 2.属性映射、图的IO和Price网络

    目录: 属性映射 -- 内部属性映射 图的I/O 构建一个 Price网络(例) 名词解释: Property maps:属性映射 PropertyMap:一个类 scalar value types ...

  4. iOS 静态类库 打包 C,C++文件及和OC混编

    iOS 静态类库 编译 C,C++ 我们都知道,OC 原生支持C, 在 创建的 OC类的 .m 里面,可以直接编写C的代码: 同样 Xcode 也支持 OC ,C++的混编,此时,我们通常把OC创建的 ...

  5. js encodeURI方法认识

    很早就知道js中encodeURI方法,也很早就用过,但是每次看到它总感觉有些陌生,因为不知道到底是什么原理,和普通的编码到底什么关系, 今天在查看w3c api时又遇到了她,正好有空就多看了几眼,突 ...

  6. 复杂TableView在iOS上的性能优化

    声明:本文翻译自<iOS performance optimization>,原文作者 Khang Vo.翻译本文纯属为了技术交流的目的,并不具有任何的商业性质,也不得利用本文内容进行商业 ...

  7. Hibernate的Restrictions用法

    Restrictions.eq --> equal,等于. Restrictions.allEq --> 参数为Map对象,使用key/value进行多个等于的比对,相当于多个Restri ...

  8. Date的那一大堆事儿--1

    String perfTimeStr = "";// 统一设置日历格式 Calendar calendar = Calendar.getInstance(); calendar.s ...

  9. python 练习 19

    #!/usr/bin/python # -*- coding: UTF-8 -*- for n in range(100,1000): i = n / 100 j = n / 10 % 10 k = ...

  10. Growing转化的每一步(笔记整理)

    渠道流量监控中,如何将劣质流量和优质流量区分开来? 劣质流量总会有有一些不同于其他正常渠道的特征,比如在同一个时间中大量集中访问.使用的硬件设备比较固定.使用特定的浏览器等. 实际案例:去年有一些 A ...