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",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/
转载于:https://www.cnblogs.com/soundcode/p/4983179.html
IBatis.net动态SQL语句相关推荐
- IBatis.net动态SQL语句(六)
在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&quo ...
- xml模糊查询语句_2Mybatis学习笔记07:动态SQL语句(原创,转载请注明来源)
开发环境: 硬件环境:Windows10+JDK 1.8: 软件环境:Java+Eclipse+Mybatis+maven3.6+tomcat8.0+Postgresql 10.6: 用到的jar包: ...
- MyBatis学习 之 三、动态SQL语句
2019独角兽企业重金招聘Python工程师标准>>> 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的, ...
- Mybatis注解-注解方式的动态SQL语句
基于手写SQL语句的注解CRUD 把手写SQL语句的注解CRUD,修改为动态SQL语句方式. CategoryDynaSqlProvider 新增CategoryDynaSqlProvider,提供C ...
- Mybatis—动态SQL语句与逆向工程
Mybatis动态SQL语句与逆向工程 MyBatis动态SQL语句与逆向工程 1.动态SQL语句 1.1.动态SQL是什么 1.2.动态SQL有什么用 1.3.基于XML的实现 1.3.2.接口文件 ...
- 02JavaWeb之MyBatis详解、SqlSession执行、mapper代理执行、动态SQL语句、注解开发、resultMap、resultType、多参数传递
MyBatis MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发,它封装了JDBC大部分的操作. MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由 ...
- Oracle基础 动态SQL语句
一.静态SQL和动态SQL的概念. 1.静态SQL 静态SQL是我们常用的使用SQL语句的方式,就是编写PL/SQL时,SQL语句已经编写好了.因为静态SQL是在编写程序时就确定了,我们只能使用SQL ...
- 动态SQL语句--mybatis
转自:http://www.blogjava.net/Steven-bot/articles/363460.html 动态SQL语句--mybatis 动态SQL语句 有些时候,sql ...
- oracle中执行动态sql语句吗,oracle中有没有可动态执行sql语句的函数
oracle中有没有可动态执行sql语句的函数 关注:233 答案:2 手机版 解决时间 2021-03-05 15:53 提问者祗剩寂寞 2021-03-04 22:38 oracle中有没有可 ...
最新文章
- 图像分割2020总结:结构,损失函数,数据集和框架
- 在ubuntu16.04中一键创建LAMP环境
- Spring Boot 内置Tomcat——IntelliJ IDEA中配置模块目录设为文档根目录(DocumentRoot)解决方案
- 今天,Java编程周末提高班(第一期)正式结束
- Visual.Assist.X.V10.7.1949的汉化破解补丁
- Lydsy2017年4月月赛 抵制克苏恩
- Java练习:tips.Print
- HTML5手机重力与方向感应的应用——摇一摇效果
- m1芯片MacBook安装Apple优化版TensorFlow(虚拟环境)
- hdu4746 Mophues
- 考上研究生就脱单?快来看看这些女生多的大学!
- 计算机组成总CPI,计算机组成原理——计算机系统概述考研题
- 重构分析21: 被拒绝的遗赠(Refused Bequest)
- 项目沟通管理和项目干系人管理
- faceless 开源_Big Faceless Java报表生成器
- Python 3 爬虫之批量下载字帖图片
- ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8....Cortex-A53,A57,A72
- 收集得最全的sql 语句
- PHP中国际化地数字格式处理
- SQL(12) 抽样取数