zoukankan      html  css  js  c++  java
  • 【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/

    摘自http://www.cnblogs.com/kissdodog/p/3436587.html  自己保存

  • 相关阅读:
    SpringCloud高可用和高并发
    时间重要性,我们需要如何利用极致
    Spring是什么 包括SpringBean SpringMVC SpringBoot SpringCloud
    Java 线程的基本使用
    JVM 内存模型
    Java 8 ArrayList 详解
    Java 8 HashMap 源码解析
    Docker 运行 MySQL,使用 docker-compose
    Spring Boot 主从读写分离
    Spring Boot 整合 MyBatis 实现乐观锁和悲观锁
  • 原文地址:https://www.cnblogs.com/qifei-jia/p/8033447.html
Copyright © 2011-2022 走看看