文档章节

【转】ibatis.net中的单个参数查询、多个参数查询和实体类查询以及动态SQL语句生成查询

刘昌鑫
 刘昌鑫
发布于 2016/07/15 09:26
字数 1356
阅读 11
收藏 0
点赞 0
评论 0

  在学习动态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/archive/2013/11/21/3436587.html

共有 人打赏支持
刘昌鑫
粉丝 6
博文 69
码字总数 20757
作品 0
海淀
后端工程师
JPA之使用JPQL语句进行增删改查

JPA支持两种表达查询的方法来检索实体和来自数据库的其他持久化数据:查询语句(Java Persistence Query Language,JPQL)和条件API(criteria API)。JPQL是独立于数据库的查询语句,其用于...

落叶飞逝的恋 ⋅ 2017/12/26 ⋅ 0

穆建情/AgileDataAccess

#AgileDataAccess Agile.DataAccess基于FluentData扩展重写,提供高效的性能与风格简洁的API,支持多种主流数据库访问。当前市面上的 ORM 框架,如 Entity Framework 和 NHibernate,都过于复...

穆建情 ⋅ 2017/06/18 ⋅ 0

hibernate—QBC

QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。我们看下面的示例程序: Criteria criteria=...

北京_ ⋅ 2014/11/09 ⋅ 0

六、hibernate之HQL

一. HQL 1. 大小写 HQL语句本身和SQL一样不区分大小写, 但其中的类名, 属性名, (绑定参数的)数据区分大小写. 2. 从类中而不是从表中操作 如果类有子类, 会连同子类一起查询, 不论子类是否和父...

wbf961127 ⋅ 2017/11/13 ⋅ 0

Spring Data Jpa(分页、Specification、Criteria)

分页的主要接口与类 PagingAndSortingRepository 继承自 CrudRepository 接口,提供了排序以及分页查询能力,提供了两个方法 虽然 PagingAndSortingRepository 接口中只有 findAll 方法,但是...

林塬 ⋅ 01/04 ⋅ 0

hibernate--HQL语法与详细解释

HQL查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此 Hibernate将HQL查询方式立...

随智阔 ⋅ 2014/03/08 ⋅ 0

【JPQL】—查询参数、命名查询和使用构造器查询

JPA定义了一套属于面向对象的查询语言:JPQL,它具有良好的移植性。JPA提供了一套功能非常强大的查询体系,它不仅可以使用JPA本身定义的JPQL语句进行查询,还可以利用原生SQL语句进行查询,这...

zt15732625878 ⋅ 2017/10/29 ⋅ 0

充血模型的ORM能做什么?——ORM组件XCode(十八般武艺)

ORM组件XCode(十八般武艺) 之前,XCode总是若隐若现,耐性好的同学想知道它还有啥特点,沉不住气的则认为不过是CURD耳! XCode开发模式是灵魂,XCode组件通过具体实现对其支持! XCode的特...

大石头 ⋅ 2010/12/21 ⋅ 0

JPA criteria 查询:类型安全与面向对象

序言 自工作以来,除了以前比较流量的hibernate,就是一直使用ORM 规范 JPA了.而这几天工作需要,研究了下JPA的标准查询,名为:JPA criteria查询.相比JPQL,其优势是类型安全,更加的面向对象. 使用...

Zhao-Qian ⋅ 2013/05/26 ⋅ 20

Hibernate Hibernate的检索方式

HIbernate提供了以下几种检索对象的方式: ①、导航对象图检索方式:根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrders().iterator()方法就可以导航...

Winnie007 ⋅ 2015/10/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从零开始搭建Risc-v Rocket环境---(1)

为了搭建Rocke环境,我买了一个2T的移动硬盘,安装的ubuntu-16.04 LTS版。没有java8,gcc是5.4.0 joe@joe-Inspiron-7460:~$ java -version程序 'java' 已包含在下列软件包中: * default-...

whoisliang ⋅ 29分钟前 ⋅ 0

大数据学习路线(自己制定的,从零开始学习大数据)

大数据已经火了很久了,一直想了解它学习它结果没时间,过年后终于有时间了,了解了一些资料,结合我自己的情况,初步整理了一个学习路线,有问题的希望大神指点。 学习路线 Linux(shell,高并...

董黎明 ⋅ 35分钟前 ⋅ 0

systemd编写服务

一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。 ...

勇敢的飞石 ⋅ 37分钟前 ⋅ 0

mysql 基本sql

CREATE TABLE `BBB_build_info` ( `community_id` varchar(50) NOT NULL COMMENT '小区ID', `layer` int(11) NOT NULL COMMENT '地址层数', `id` int(11) NOT NULL COMMENT '地址id', `full_......

zaolonglei ⋅ 46分钟前 ⋅ 0

安装chrome的vue插件

参看文档:https://www.cnblogs.com/yulingjia/p/7904138.html

xiaoge2016 ⋅ 49分钟前 ⋅ 0

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 今天 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 今天 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 今天 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 今天 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部