`

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实战

    书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的大部分知识点,可以作为iBATIS学习和Web开发的经典案例,非常值得深入研究。 本书既可为广大的开发人员(不仅仅是Web应用程序开发人员)...

    ibatis 开发指南(pdf)

    26 一对多关联............................................................................................ 26 一对一关联...........................................................................

    MyBatis学习资料

    1. 背景 Ibatis 为Apache旗下的产品,随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis . 2. 是什么 MyBatis是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架 . ...一对多 多对一 多对多

    Spring面试题

    ☆ Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 ☆ Spring Web 模块:...

    流风通用管理框架源码

    iBATIS作为一种独特的Data Mapper,使用SQL映射的方式将对象持久化至关系型数据库。简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以...

    流风通用管理框架(源码+数据库)

    iBATIS作为一种独特的Data Mapper,使用SQL映射的方式将对象持久化至关系型数据库。简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以...

    通用管理框架源码下载 

    为一种独特的Data Mapper,使用SQL映射的方式将对象持久化至关系型数据库。简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过 关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以方便以后...

    Spring基础与快速入门

    4 依赖注入:建立对象与对象之间依赖关系的实现,包括接口注入、构造注入、set注入,在Spring中只支持后两种 5 AOP:面向方面编程,我们可以把日志、安全、事务管理等服务(或功能)理解成一个“方面”,那么以前...

    IBatisNet.DataMapper 之简单三层

    iBATIS允许你用多种方式建立从对象到数据库的映射关系 MySpace已应用 4.使用于任何类型的关系数据库: 应用数据库 企业数据库 私有数据库 遗留数据库 简单性 性能 明确分工 可移植性:Java、.Net或者其他 ...

    IBatisNet完整项目源码(含数据库)

    iBATIS允许你用多种方式建立从对象到数据库的映射关系 MySpace已应用 4.使用于任何类型的关系数据库: 应用数据库 企业数据库 私有数据库 遗留数据库 简单性 性能 明确分工 可移植性:Java、.Net或者其他...

    基于maven项目的SSM框架与layu前端框架的代码

    实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织...

    通用管理框架正式版1.1源码

    为一种独特的Data Mapper,使用SQL映射的方式将对象持久化至关系型数据库。简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过 关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以方便以后...

    最新Java面试宝典pdf版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    Java面试宝典2010版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 9、hibernate的inverse属性的作用? 13、在DAO中如何体现DAO设计模式? 14、spring+Hibernate中委托方案怎么配置? 15、spring+Hibernate中委托方案怎么配置? ...

    Java面试笔试资料大全

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    AppFramework_V1.0

    除了实现数据的增删改查,数据访问层还要提供一些与业务无关功能,例如面向对象的持久化与访问机制、本地事务与分布式事务支持、多数据库支持,这些机制或功能形成相对独立的逻辑领域,其主要目的有: &lt;br&gt;1、 ...

    JAVA面试宝典2010

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    Java面试宝典-经典

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    java面试题大全(2012版)

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

Global site tag (gtag.js) - Google Analytics