在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数吧。

一、条件查询

1、传递单个参数

如根据Id查询:

  <select id="SelectOnePerson" resultMap="PersonModel">
<!--其中#Id就是传入的参数-->
select * from person where Id = #Id# 
</select>

调用的时候,只需要传入对应Id就可以了。

监控数据库,生成的SQL语句为:

exec sp_executesql N'select * from person where Id =  @param0',N'@param0 int',@param0=1

2、传递多个参数

传递多个参数通常使用键值对,如HashTable或实体类。

  • 键值对的方式

键值对的方式可以使用HashTable或Dictionary<TKey,TValue>,当为后者时映射文件中的parameterClass的值要为:System.Collections.IDictionary。

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

DAO层方法:

public PersonModel SelectPersonById(Hashtable ht)
{
PersonModel p = mapper.QueryForObject<PersonModel>("SelectPersonById", ht);
return p;
}

调用:

static void Main(string[] args)
{
PersonDAO dao = new PersonDAO(); Hashtable ht = new Hashtable();
ht.Add("Id", );
ht.Add("Name", "刘备");
PersonModel p = dao.SelectPersonById(ht);
if (p != null)
Console.WriteLine(p.PersonId + p.PersonName);
Console.ReadKey();
}

生成的SQL语句为:

exec sp_executesql N'SELECT * FROM Person WHERE Id =  @param0  AND Name =  @param1',N'@param0 int,@param1 nvarchar(2)',@param0=1,@param1=N'刘备'
  • 自定义参数类

     自定义参数类通常是使用本实体类,当然你也可以自定义一个参数类(与SQL语句中的参数同名就可以)。

PersonModel类如下:

public class PersonModel
{
public int PersonId { get; set; } public string PersonName { get; set; } //在Person之中加入一个CountryModel
public CountryModel Country { get; set; } }

因为PersonModel类定义的属性和表列名不一致(一般情况下最好和表列同名),所以我们这重新定义一个PersonViewModel类:

 public class PersonViewModel
{
public int Id { get; set; } public string Name { get; set; } }

然后在SqlMap.config中指定别名

 <typeAlias alias="PersonViewModel" type="IbatisNetModel.PersonViewModel,IbatisNetModel"/>

XML映射文件:

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

这里没有指定resultMap,而是指定了resultClass,当property与column完全相同时可以这样做,这个在第二篇中介绍过。

DAO层:

public PersonViewModel SelectPersonById(PersonViewModel p)
{
PersonViewModel per = mapper.QueryForObject<PersonViewModel>("SelectPersonById", p);
return per;
}

调用:

static void Main(string[] args)
{
PersonDAO dao = new PersonDAO(); PersonViewModel p = new PersonViewModel();
p.Id = ;
p.Name = "刘备";
PersonViewModel model = dao.SelectPersonById(p);
if (model != null)
Console.WriteLine(p.Id + p.Name);
Console.ReadKey();
}

二、动态查询

动态查询的意思就是说,当满足一定的条件,才拼接某一段SQL代码。

我们在之前的基础上改动下:

<select id="SelectPersonById" resultMap="PersonModel" parameterClass="HashTable">
SELECT * FROM Person
<dynamic prepend="where">
<isLessEqual prepend="AND" property="Id" compareValue="3">
<!--当传入的参数Id小于3时,才拼接该 子句-->
Id = #Id#
</isLessEqual>
<isNotEmpty prepend="AND" property="Name">
<!--当传入的参数Name不为""或Null时,才拼接该 子句-->
Name = #Name#
</isNotEmpty>
</dynamic>
</select>

DAO层方法:

public IList<PersonModel> SelectPersonById(Hashtable ht)
{
IList<PersonModel> pList = mapper.QueryForList<PersonModel>("SelectPersonById", ht);
return pList;
}

假如传入的参数为:ht.Add("Id", 4);

则生成的SQL语句为:

SELECT TOP 1 * FROM Person WHERE 1=1

假如传入的参数为:ht.Add("Id",2);

则生成的SQL语句为:

exec sp_executesql N'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(2)',@param0=2,@param1=N'关羽'

动态查询就是这样,根据一定的判断条件,去判断是否应该拼接某段SQL代码。

dynamic可以去除第一个prepend="and"中的字符(这里为and),当两个条件都不满足时,where会自动省略,当满足其中某个条件时,则会加上where,自动去除第一个prepend="and"中的字符。我觉得还可以换一种写法,不使用dynamic,加上 where 1=1,如下:

 <select id="SelectPersonById" resultMap="PersonModel" parameterClass="HashTable">
SELECT * FROM Person where 1=1
<isLessEqual prepend="AND" property="Id" compareValue="3">
<!--当传入的参数Id小于3时,才拼接该 子句-->
Id = #Id#
</isLessEqual>
<isNotEmpty prepend="AND" property="Name">
<!--当传入的参数Name不为""或Null时,才拼接该 子句-->
Name = #Name#
</isNotEmpty>
</select>

更多的判断条件如下:

属性关键字

含义

<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="SelectPersonById" resultMap="PersonModel" 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>

调用方法为:

static void Main(string[] args)
{
PersonDAO dao = new PersonDAO();
List<string> ListStr = new List<string>();
ListStr.Add("刘备");
ListStr.Add("曹操");
ListStr.Add("孙权");
Hashtable ht = new Hashtable();
ht.Add("NameList", ListStr);
IList<PersonModel> pList = dao.SelectPersonById(ht);
foreach (var item in pList)
{
Console.WriteLine(item.PersonId + item.PersonName);
}
Console.ReadKey();
}

生成的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,该属性为可选。

参考:http://www.cnblogs.com/caoyc/category/873268.html

Ibatis.Net 动态SQL语句学习(六)的更多相关文章

  1. IBatis.net动态SQL语句(六)

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

  2. IBatis.net动态SQL语句

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

  3. Ibatis.Net 输出SQL语句学习(七)

    一.IBatis.net输出SQL语句 输出IBatis.net生成的SQL语句,能够方便调试. 在MapperHelper类中添加GetSql方法: /// <summary> /// ...

  4. mybatis动态sql语句学习(一)

    动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格 ...

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

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

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

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

  7. mybatis 学习五 动态SQL语句

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

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

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

  9. MyBatis学习总结_11_MyBatis动态Sql语句

    MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...

随机推荐

  1. PHP 使用GD 库绘制图像,无法显示的问题

    根据官方GD 库绘制图像文档样式 原基本样式 $width = 120; $height = 50; $img = @imagecreatetruecolor($width, $height) or ...

  2. OneZero第四次站立会议(2016.3.24)

    会议时间:2016年3月24日 15:30~15:47 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论,确定会后修改内容. 会议内容:以下为会议插图 1.界面原型方面,在 ...

  3. 2013长春网赛1004 hdu 4762 Cut the Cake

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4762 题意:有个蛋糕,切成m块,将n个草莓放在上面,问所有的草莓放在同一块蛋糕上面的概率是多少.2 & ...

  4. 怎么把焦点放在RichEdit的最后一行

    急急急!!!!如何把焦点放在RichEdit的最后一行!! 请高手指点,在线等!!!!当添加到出现滚动条时焦点就不会往下了,怎么把焦点移到最后一行 RichEdit-> Lines-> A ...

  5. Kafka数据可靠性深度解读

    原文链接:http://www.infoq.com/cn/articles/depth-interpretation-of-kafka-data-reliability Kafka起初是由Linked ...

  6. REQUIRES_NEW 如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务 相当于嵌套事务 双层循环那种

    REQUIRES_NEW   如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务  相当于嵌套事务 双层循环那种 不管是否存在事务,业务方法总会自己开启一个事 ...

  7. hdwiki 部署

    1.安装wamp 集成环境(部署过程出现的环境问题请搜索我的另外一篇文章 <wamp安装失败原因大全>)2.到 http://kaiyuan.hudong.com/download/ 下载 ...

  8. 【bzoj4730】 Alice和Bob又在玩游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=4730 (题目链接) 题意 给出一个森林,两个人轮流操作,每次把一个节点以及它的祖先全部抹去,无节点可 ...

  9. 使用highlight.js高亮静态页面的语言代码

    显示静态的代码其实html的pre标签基本可以满足需求了,至少不会将换行的文本显示成一堆字符串. 不过能使静态的文本能高亮显示,倒更炫酷一点.其实很简单的,引入highlight.js包,可以使用cd ...

  10. ServiceStack.Redis 之 IRedisTypedClient<第四篇>

    IRedisTypedClient IRedisTypedClient类相当于IRedicClient的强类型版,其方法与属性大多数与IRedisClient类似. 它支持在Redis中使用Linq查 ...