`
ihibernate
  • 浏览: 153044 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

iBATIS一对多查询

 
阅读更多
iBATIS框架也提供了多种方法用以关联复杂的对象,比如订单(order)和它的订单项(order item)(还有它们的相关产品、顾客等等)。每种方法都有其优点和缺点,正所谓“尺有所短,寸有所长”,每一种方案都不是完美的。应根据需要来选择适合的方案。

注意:为简短起见,在本章的余下的例子中,我们将省略那些对于演示来说不必要的数据。例如,当我们获取了一个顾客(customer)对象,我们不会获取它的所有字段,而是仅仅获取它的主键和外键。

复杂的集合属性

在第4章中,我们学习了如何使用SELECT语句从数据库获取数据。在那些例子中,我们获取的结果仅仅是单个对象,即使是连接多表也是如此。事实上,如果您有多个复杂对象,也可以使用iBATIS加载它们。

如果我们的应用程序模型与数据模型比较类似,那么这个功能会很有用。可以考虑根据对象的关系(关联)来定义数据模型,然后使用iBATIS将它们一起加载。例如,如果在数据库中,Account记录对应着相关的Order记录,而Order又对应着相关的OrderItem记录,可以为这些记录建立关系,当我们请求一条Account记录时,可以一并获取所有的Order和OrderItem记录。下面的代码清单显示了如何定义我们的SQL映射:
 
<resultMap id="ResultAccountInfoMap" class="AccountInfo">
   <result property="accountId"
    column="accountId" />
   <result property="orderList"
    select="Ch6.getOrderInfoList"
    column="accountId" />
</resultMap>
<resultMap id="ResultOrderInfoMap" class="OrderInfo">
   <result property="orderId" column="orderId" />
   <result property="orderItemList" column="orderId"
    select="Ch6.getOrderItemList" />
</resultMap>
<resultMap id="ResultOrderItemMap" class="OrderItem">
   <result property="orderId" column="orderId" />
   <result property="orderItemId" column="orderItemId" />
</resultMap>

<select id="getAccountInfoList" resultMap="ResultAccountInfoMap" >
    select accountId from Account
</select>
<select id="getOrderInfoList" resultMap="ResultOrderInfoMap">
    select orderId from orders
    where accountId = #value#
</select>
<select id="getOrderItemList" resultMap="ResultOrderItemMap">
    select orderId, orderItemId from orderItem
    where orderid = #value#
</select>
 

先来看看结果映射(result map,即上面的ResultAccountInfoMap,ResultOrderInfoMap和ResultOrderItemMap),前两个Map都用到了select特性。这个特性告诉iBATIS,属性的值将由另一个映射语句来设置,语句的名称就是select特性的值。例如,我们执行getAccountInfoList语句时,ResultAccountInfoMap结果映射有一个子元素:
iBATIS一对多查询<resultproperty="orderList" select="Ch6.getOrderInfoList" column="accountId" />

它的作用是告诉iBATIS,account对象的orderList属性的值由Ch6.getOrderInfoList语句来设置,同时把accountId列的值传给Ch6.getOrderInfoList作为参数。类似地,在设置order对象的orderItemList对象时,也会执行getOrderItemList语句。

这个功能给我们带来便利的同时,也带来了两个问题。首先,创建包含大量对象的列表可能会消耗大量的内存。其次,这种方法会导致数据库的I/O问题,其原因是所谓的“N+1 Select”现象,这个现象将在后面讨论。对于每个问题,iBATIS框架都提供了解决方案,但是注意,没有哪一种能同时解决这两个问题。

数据库I/O

数据库I/O是数据库使用状况的一项指标,也是数据库性能的主要瓶颈之一。在读取或写入数据库时,数据必须要经历从磁盘到内存或者从内存到磁盘的转换,这个过程是比较耗时的。在程序中使用缓存可以减少对数据库的访问,但这种方法使用时要谨慎,否则也会引发问题。要了解iBATIS中的缓存机制,可以参看第10章的内容。

在使用关联数据时,可能会遭遇数据库I/O问题。考虑一下这个场景:有1000个Account,每一个关联了1000个Order,而每个Order则包含25个OrderItem。如果尝试将所有这些数据加载到内存,执行的SQL语句要超过1000000行(1条用来查询Account,1000条用于Order,1000000条用于OrderItem),而创建的对象大约为2500万——如果你真敢这么做,等你的系统管理员收拾你吧。
分享到:
评论

相关推荐

    ibatis 一对多 多对多完整映射

    总结,iBATIS的一对多和多对多关系映射是通过XML映射文件和自定义SQL查询实现的。理解这些配置和相关的源码有助于优化数据访问性能,同时使用合适的工具能提高开发效率。在实际项目中,务必根据具体需求选择合适的...

    ibatis 一对多

    本文将深入探讨`iBatis` 中的一对多映射关系,以及如何通过源码理解和使用这个特性。 一对多映射是数据库关系模型中的常见概念,指的是一个父表(如部门表)可以对应多个子表(如员工表),每个部门可以有多个员工...

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis 一对多关系映射

    这样,当我们调用`SqlSession`的`selectList`方法执行这个查询时,Ibatis会自动将返回的多条记录按照一对多的关系映射成`User`对象,每个`User`对象都有一个包含所有关联订单的`orderList`。 此外,还可以通过使用`...

    ibatis的的增删改查和一对一、一对多查询

    本篇文章将详细探讨iBatis在增删改查(CRUD)操作以及一对一和一对多关系映射中的应用。 首先,让我们了解一下iBatis的CRUD操作: 1. **创建(Create)**:在iBatis中,创建数据通常通过`&lt;insert&gt;`标签实现。你需要...

    ibatis多对多关系(详细)

    iBatis多对多关系详解 iBatis是一种流行的持久层框架,用于简化Java应用程序和关系数据库之间的交互。在本文档中,我们将详细介绍iBatis在处理多对多关系时的配置和实现。 多对多关系 多对多关系是一种常见的关系...

    ibatis 单表查询 一对多查询

    Source Database : ibatis_db Target Server Type : MYSQL Target Server Version : 50022 File Encoding : 65001 Date: 2013-05-02 22:49:28 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- --...

    ibatis多表查询

    在Ibatis中,多表查询是一项重要的功能,它允许我们处理复杂的数据库操作,例如一对多、多对一或一对一的关系。在这个例子中,我们将探讨如何使用Ibatis进行一对多的多表查询,以`book`和`user`两个表为例。 首先,...

    Ibatis多表查询

    在多表查询中,Ibatis 提供了多种方式来处理复杂的关联查询,包括一对一、一对多、多对一和多对多等关系。在这个例子中,我们将探讨如何在 Ibatis 中实现一对多的关系查询。 首先,我们创建了两个表:`book` 和 `...

    ibatis实战之一对多关联(源代码)

    在IT领域,特别是Java开发中,iBatis是一个非常受欢迎的...以上是关于iBatis一对多关联映射的实战介绍,希望对您在开发过程中有所帮助。更多关于iBatis的高级用法和最佳实践,可以通过文章链接中的资源进行深入学习。

    ibatis一对一、多对一示例

    利用ibatis实现一对一、多对一的示例代码。每种关系用两种方式实现,具体的讲解可看我的博客http://blog.csdn.net/duwenchao1986/article/details/8565386

    ibatis多表查询过程

    在数据库设计中,多表查询通常涉及到表之间的关联,例如一对一、一对多、多对多关系。在iBatis中,我们可以使用`&lt;select&gt;`标签来定义多表查询的SQL语句。 ### 3. 使用`&lt;include&gt;`标签 为了保持SQL语句的整洁和可...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...

    Mybatis/ibatiS多表映射 一对一 一对多 extjs前台取值 详细讲解

    总结来说,这个话题覆盖了Mybatis/iBatis中的多表映射,通过XML配置文件处理一对一和一对多关系,以及如何在ExtJS前端通过Model和Grid获取并展示这些数据。了解这些知识对于开发涉及多表交互的应用至关重要,能够...

    ibatis下oracle树查询

    总的来说,实现iBatis下Oracle的树查询需要对iBatis的映射机制、Oracle的层次查询语法以及可能的Java反编译工具有一定了解。这涉及到数据库设计、SQL优化、框架使用等多个方面的知识,是提升数据库操作技能的重要...

    主子表查询ibatis

    2. **一对多查询SQL编写**: 在SQL脚本(如sql.sql文件)中,我们需要编写查询主表及所有子表记录的SQL语句。通常使用JOIN操作来实现关联查询,例如LEFT JOIN或INNER JOIN,将主表和子表通过共同的外键连接起来。在...

    ibatis 一对多关系_longjia_zt_新浪博客.mht

    ibatis 一对多关系_longjia_zt_新浪博客.mht

    ibatis 多对多

    Ibatis的动态SQL功能使得在处理多对多关系时可以根据条件灵活地构造查询。例如,可以通过`if`、`choose`、`when`等标签来决定是否包含特定的关联数据。 5. **缓存机制** 考虑到性能,Ibatis提供了缓存机制。对于...

    ibatis one to many mapping

    标题 "iBatis 一对多映射" 描述中提到的是关于 iBatis 框架下的一对多关系映射。iBatis 是一个基于 Java 的持久层框架,它允许程序员将 SQL 查询与 Java 代码相结合,以实现更灵活的数据访问。在数据库关系模型中,...

Global site tag (gtag.js) - Google Analytics