`

ibatis 对象关系实现,一对多,多对一

 
阅读更多

hibernate 的强大在于完全的对象化,对于对象之间的关系解决的比较好,如1对1,1对多,多对1,以及多对多。当然也包括继承关系。
    而ibatis这方面就比较逊色了,不过对于也支持简单的关连查询,如1对1,和1对多。对于一般的情况来说,这两种已经足够了,当然不能层叠更新是一个缺陷,看了半天文档,也没有找到对象之间的层叠更新,估计是不支持。
    以前的版本ibatis处理关连是通过执行两次sql来实现的,如下的实例:
    一对多关联:

xml 代码

<sqlMap namespace="User">  
<typeAlias alias="user" type="com.ibatis.sample.User"/>  
<typeAlias alias="address" type="com.ibatis.sample.Address"/>  
<resultMap id="get-user-result" class="user">  
<result property="id" column="id"/>  
<result property="name" column="name"/>  
<result property="sex" column="sex"/>  
<result property="addresses" column="id" select="User.getAddressByUserId"/>  
</resultMap>  
<select id="getUsers" parameterClass="java.lang.String" resultMap="get-user-result">  
<![CDATA[ 
select id,name,sex 
from t_user 
where id = #id# 
]]>  
</select>  
<select id="getAddressByUserId" parameterClass="int" resultClass="address">  
<![CDATA[ 
select address,zipcode 
from t_address 
where user_id = #userid# 
]]>  
</select>  
</sqlMap>
 这里通过在resultMap 中定义嵌套查询getAddressByUserId,我们实现了关联数据的读取。

需要注意的是,这里有一个潜在的性能问题,也就是所谓“n+1”Select问题。
一对一关联:
对于这种情况,我们可以采用一次Select两张表的方式,避免这样的性能开销(假设上面示例中,每个User 只有一个对应的Address记录):

xml 代码
<resultMap id="get-user-result" class="user">  
<result property="id" column="id"/>  
<result property="name" column="name"/>  
<result property="sex" column="sex"/>  
<result property="address" column="t_address.address"/>  
<result property="zipCode" column="t_address.zipcode"/>  
</resultMap>  
<select id="getUsers" parameterClass="java.lang.String" resultMap="get-user-result">  
<![CDATA[ 
select * 
from t_user,t_address 
where t_user.id=t_address.user_id 
]]>  
</select>  
 在现在的版本中,对于n+1问题,ibatis已经很好的解决了。如下的配置:

一对一

xml 代码
<resultMap id=”get-product-result” class=”com.ibatis.example.Product”>  
<result property=”id” column=”PRD_ID”/>  
<result property=”description” column=”PRD_DESCRIPTION”/>  
<result property=”category” resultMap=“get-category-result” />  
</resultMap>  
<resultMap id=”get-category-result” class=”com.ibatis.example.Category”>  
<result property=”id” column=”CAT_ID” />  
<result property=”description” column=”CAT_DESCRIPTION” />  
</resultMap>  
<select id=”getProduct” parameterClass=”int” resultMap=”get-product-result”>  
select *  
from PRODUCT, CATEGORY  
where PRD_CAT_ID=CAT_ID  
and PRD_ID = #value#  
</select>   
 可以使用内在的resultMap来解决此问题。

同样一对多如下:

xml 代码
<sqlMap namespace="ProductCategory">  
<resultMap id=”categoryResult” class=”com.ibatis.example.Category” groupBy=”id”>  
<result property=”id” column=”CAT_ID”/>  
<result property=”description” column=”CAT_DESCRIPTION”/>  
<result property=”productList” resultMap=”ProductCategory.productResult”/>  
</resultMap>  
<resultMap id=”productResult” class=”com.ibatis.example.Product”>  
<result property=”id” column=”PRD_ID”/>  
<result property=”description” column=”PRD_DESCRIPTION”/>  
</resultMap>  
<select id=”getCategory” parameterClass=”int” resultMap=”categoryResult”>  
select C.CAT_ID, C.CAT_DESCRIPTION, P.PRD_ID, P.PRD_DESCRIPTION  
from CATEGORY C  
left outer join PRODUCT P  
on C.CAT_ID = P.PRD_CAT_ID  
where CAT_ID = #value#  
</select>  
</sqlMap>
 注意,需要使用增加groupBy属性来分类
分享到:
评论

相关推荐

    ibatis 一对多 多对多完整映射

    本文将深入探讨如何在iBATIS中实现一对多和多对多的关系映射,并提供相关的源码分析和工具使用技巧。 **一对多关系映射** 在数据库设计中,一对多关系是指一个父记录可以与多个子记录关联,例如,一个用户可以有多...

    ibatis 一对多关系映射

    在这个场景下,我们将深入探讨Ibatis如何实现一对多的关系映射。 一对多关系在数据库设计中非常常见,它意味着一个实体可以与多个其他实体关联。例如,一个用户可能有多个订单,或者一个部门包含多个员工。在Ibatis...

    ibatis 一对多

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

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

    在服务层或DAO层,通过SqlSessionFactory创建SqlSession,调用`selectList`方法,传入SQL查询ID,iBatis会自动处理一对多的关联,将数据填充到对应的Java对象中。 ```java SqlSession sqlSession = ...

    ibatis多对多关系(详细)

    在本文档中,我们将详细介绍iBatis在处理多对多关系时的配置和实现。 多对多关系 多对多关系是一种常见的关系数据库设计模式,用于描述两个实体之间的多对多关系。在本例中,我们将使用学生(Student)和教师...

    ibatis 的关系映射

    这篇博客可能深入探讨了iBATIS如何实现从数据库结果集到Java对象的映射,以及如何处理一对多、多对一和多对多的关系。 在数据库设计中,关系映射是至关重要的,因为它允许我们将复杂的数据库结构转换为易于管理和...

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

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

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

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

    ibatis 框架原理实现

    此外,还可以使用`&lt;result&gt;`元素进行单个字段的映射,或者使用嵌套结果映射处理一对多或多对多的关系。 5. **SqlSession接口**: 在Ibatis中,SqlSession是执行SQL的主要接口,它提供了执行SQL、事务控制等方法。...

    ibatis one to many mapping

    综上所述,iBatis 的一对多和多对多映射是数据库操作中的重要概念,它们通过 ResultMap 和特定的标签实现对象关系的映射,简化了数据访问层的编程。深入理解和熟练运用这些映射技术,能有效提高开发效率并降低维护...

    ibatis多表查询

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

    Ibatis多表查询

    在这个例子中,我们将探讨如何在 Ibatis 中实现一对多的关系查询。 首先,我们创建了两个表:`book` 和 `user`。`book` 表存储书籍的信息,而 `user` 表记录作者信息,其中 `book_oid` 字段作为外键引用 `book` 表...

    ibatis 多对多

    在Ibatis中,多对多关系通常通过`&lt;collection&gt;`标签来实现,它定义在一个实体类的映射文件中。这个标签通常包含`select`属性,用于指定一个查询子集的SQL语句。例如,如果有一个`Student`类和一个`Course`类,`...

    使用ibatis操作两个有关系的表

    在处理两个有关系的表时,Ibatis提供了多种策略,如一对一、一对多、多对一、多对多等映射关系。 1. **一对一映射**:当两个表之间存在一对一关系时,例如用户表和用户详细信息表,一个用户对应一条详细信息。在...

    iBatis开发指南和一个iBatis实例

    "spring+iBatis处理1对多数据表实例"展示了如何将iBatis与Spring框架集成,实现更高级的数据操作。Spring的依赖注入可以简化iBatis的配置,而Spring的事务管理则能确保数据的一致性。1对多关系的处理通常涉及到集合...

    Ibatis

    1.4 结果集映射:通过 `&lt;resultMap&gt;` 元素,定义了 SQL 查询结果如何映射到 Java 对象,支持一对一、一对多、多对多等复杂关系映射。 **2. Ibatis 工作原理** 2.1 配置:在启动时,Ibatis 读取配置文件,加载 SQL ...

    ibatis总结 ibatis ibatis ibatis ibatis

    - `applicationContext.xml`是Spring的主配置文件,它定义了Spring容器中的bean,包括对Struts、Ibatis等其他框架的配置,实现各组件间的依赖注入。 - `codelist.xml`则可能包含了全局共享的bean,如`...

    ibatis实现数据的操作

    首先,Ibatis是一个轻量级的Java ORM(对象关系映射)框架,它的核心理念是将SQL语句与Java代码分离,提供一种XML或注解方式来定义SQL语句,从而简化数据库访问的复杂性。与传统的JDBC相比,Ibatis提供了一种更方便...

Global site tag (gtag.js) - Google Analytics