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/

时间: 2024-12-19 10:53:51

IBatis.net动态SQL语句的相关文章

MyBatis 和 ibatis的动态SQL语句配置符号,不兼容大于号、小于号等特殊符号问题 X

TEST 在XML映射SQL的文件中,很多情况下会使用到大于号.小于号等特殊符号,这时候如果不进行控制是无法编译通过的,这时候需要用到<![CDATA[  ]]>符号进行说明,将此类符号不进行解析,其实,这个问题不止在MyBatis上通用,而是它通用于任何XML的文件中使用,比如Hibernate.Wabacus.Spring等等等等配置文件中,只要是XML文件就行,此类问题在以后的工作中,经常使用. 案例代码 <select id="findAllKiaAnalysisByC

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

三.动态SQL语句 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使

MyBatis学习 之 四、动态SQL语句

有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的s

MyBatis学习 之 三、动态SQL语句

有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的s

不需要配置log4j , 调试打印ibatis执行的sql语句和参数

背景:如果不想通过配置log4j的方式来打印ibatis执行的sql语句和参数param,可以使用如下方法在控制台打印sql语句和参数 public static void main(String[] args) { try { //声明配置文件的名称(映射文件被定义在其中) String resource = "com/test/tele/bean/iBatis-config-test.xml"; //利用工具类Resources来读取到配置文件 Reader reader = Re

mybatis--MyBatis动态SQL语句

mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的

MyBatis的动态SQL语句这么厉害的!

MyBatis动态SQL语句,非常实用 MyBatis 的强大特性之一便是它的动态 SQL.简直厉害啦~ if if 语句比较常用,查询.删除.修改的时候都是可以用到! 其中的 where 1 = 1 仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造一条正确能运行的动态SQL语句的一种方法. where 1 = 0 这个条件始终为false,结果不会返回任何数据,只有表结构,可用于快速建表 <!-- 测试 if 语句 id 与之查询方法相对应 resultType 表示User对

动态SQL语句:Mybaties SqlProvider

1.注解 @UpdateProvider(type = ClassName.class,method = "methodName")//更新 @InsertProvider//插入 @SelectProvider//选择 @DeleteProvider//删除   2.写法 package net.xdclass.xdvidio.provider; /** * @Author Pandas * @Date 2020/3/31 21:03 * @Version 1.0 * @Descri

MyBatis 源码分析——动态SQL语句

有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧.因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句.相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧.所以mybatis动态SQL功能在笔者看来是最引吸人的.为了更好的区别XML映射文件上的SQL语句.mybatis把SQL语句分为四类.那么这个笔者已经在前面的章节里面讲过了.但是我们在开发过程中常常用到的也就俩种:静态和动态. 关于静态和动态的定义,笔者是这样子理解的--静态SQL语句显示就是里面没有相