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",);
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/
IBatis.net动态SQL语句(六)的更多相关文章
- Ibatis.Net 动态SQL语句学习(六)
在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数吧. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&qu ...
- IBatis.net动态SQL语句
在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&quo ...
- MyBatis学习(三)、动态SQL语句
三.动态SQL语句 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Orac ...
- 三、动态SQL语句
//备注:该博客引自:http://limingnihao.iteye.com/blog/106076 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空, ...
- MyBatis学习 之 三、动态SQL语句
目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...
- mybatis 学习五 动态SQL语句
3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selectKey ...
- MyBatis学习 之 四、动态SQL语句
有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysq ...
- mybatis--MyBatis动态SQL语句
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...
- MySQL存储过程动态SQL语句的生成
用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...
随机推荐
- 阻塞与非阻塞的IO网络读写
看我之前的文章就知道,一般对于网络读的socket,都会加上O_NONBLOCK,非阻塞的选项. int setnonblocking(int fd) { int old_option = fcntl ...
- Object Pascal 控制语句
控制语句 1.常量声明语句常量在声明时就被赋予了一个值,在程序执行过程中是不可改变的. 格式 const 常量名 :数据类型 = 值 下面的例子声明了3 个常量: const Pi = 3.14159 ...
- 原创: 开题报告中摘要部分快速将一段文字插入到word的表格中
开题报告的摘要是表格形式,之前需要一个一个字的敲入,十分不方便修改. 所以百度了一下方法.现总结如下: 达到的效果 1 将这段文字复制粘贴到word中,在word文件中的每一个字与字之间插入空格.如何 ...
- php中高级基础知识点
1. 基本知识点 HTTP协议中几个状态码的含义:1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 100 (继续) 请求者应当继续提出请求. 服务器返回此代码 ...
- Sun Grid Engine (SGE)大型集群作业调度系统
Oracle Grid Engine 作业调度系统的简介(目前为止我用过PBS和SGE) SGE作业调度系统学习笔记 SGE作业调度 USE of Sun Grid Engine(SGE) 待续~
- 优之星S900平板电脑root方法
优之星S900root方法: 尝试百度一键root安卓的apk版本root失败. 电脑上下载百度一键root的Windows版本,平板设置→开发者选项→允许USB调试√,保持唤醒状态√,安全设置→允许 ...
- 集成代码编辑器ACE的经验
ACE是最流行的在线代码编辑器之一,在CanTK的集成开发环境GameBuilder里也使用了ACE.ACE的功能非常强大,但是由于使用方法不当,大家反映GameBuilder的代码编辑器不好用.最近 ...
- mixamo fuse三维角色制作
软件下载: http://www.cgtsj.com/cg/yj/1302/index.html 资源名称: Mixamo Fuse三维角色制作软件V1.3版 本站编号: YJ1302 百度网盘:下 ...
- JVM调优总结(转)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- 【bzoj1027】合金
[bzoj1027]合金 分析 数形结合+计算几何+Floyd最小环. http://blog.csdn.net/popoqqq/article/details/40539273 虽然这样占大家的很不 ...