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

ibatis 对象关系实现

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

<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记录):


<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已经很好的解决了。如下的配置:
一对一


<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来解决此问题。
同样一对多如下:


<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属性来分类
分享到:
评论
2 楼 dxh031 2008-12-15  
请问博主:使用<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>  
时,查询时user的addresses属性总是为空 
1 楼 yourgame 2008-09-02  
请问博主:增加groupBy属性的原理是什么?

相关推荐

    ibatis 的关系映射

    标题 "ibatis 的关系映射" 指的是在使用 iBATIS(一款优秀的Java持久层框架)时,如何处理数据库中的对象关系映射(ORM)问题。在Java应用程序中,iBATIS 提供了一种方便的方式来将数据库操作与业务逻辑解耦,使得...

    ibatis 框架原理实现

    **Ibatis 框架原理实现** Ibatis 是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,从而避免了Java代码与SQL的耦合,提高了开发效率。在这个自己编写的Ibatis框架实现中,我们可以看到类似的...

    ibatis教程_删除指定id的单个对象.rar

    Ibatis通过将Java对象映射到SQL语句,实现了对象关系映射(ORM)。它允许开发者在XML配置文件或注解中编写SQL,然后通过SqlSession接口执行这些SQL,从而实现数据的增删改查。 在删除操作中,我们通常会有一个带有...

    ibatis多对多关系(详细)

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

    ibatis实现数据的操作

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

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis的主要特点是通过XML或注解定义SQL映射文件,将SQL语句与Java对象绑定。例如,`&lt;select&gt;`标签用于定义查询语句,`&lt;insert&gt;`、`&lt;update&gt;`和`&lt;delete&gt;`分别对应增删改操作。在SQL映射文件中,可以使用动态SQL来...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    在`org.apache.ibatis.executor.resultset.ResultSetHandler`中,ResultMap被用来定义字段与Java对象属性的映射关系。ResultMap不仅支持简单的列名映射,还能处理复杂的一对多、一对一关系映射。 六、...

    ibatis教程,ibatis帮助文档

    1. 映射关系:Hibernate提供了一种对象关系映射(ORM)机制,自动处理对象与数据库之间的转换,而iBATIS需要开发者手动编写SQL语句。 2. 开发效率:在相同需求下,iBATIS的工作量可能大于Hibernate,因为需要手写SQL...

    ibatis 一对多关系映射

    在IT行业中,数据库关系映射是数据访问层的重要部分,特别是在使用ORM(对象关系映射)框架时。Ibatis,作为一个轻量级的Java ORM框架,提供了强大的功能来处理复杂的数据映射,其中包括一对多的关系映射。在这个...

    ibatis实现的学生信息管理示例

    它不是一个完整的ORM(对象关系映射)框架,而是一个SQL映射框架,允许开发者编写动态SQL,将SQL语句与Java代码分离,提高了数据库操作的灵活性和可维护性。 **Ibatis的工作原理** 1. **配置文件**: Ibatis的核心是...

    Ibatis

    总结来说,Ibatis 是一个高效、灵活的 ORM(对象关系映射)框架,它让开发者能够更专注于业务逻辑,而不是繁琐的 JDBC 代码。通过学习 Ibatis,开发者可以更好地理解和掌握数据访问层的设计与实现,提升开发效率。...

    ibatis api,ibatis文档,ibatis说明文档

    5. ParameterMap和ParameterHandler:它们负责参数的设置和处理,ParameterMap代表了SQL参数的映射关系,而ParameterHandler则将Java对象转换为SQL语句中的参数。 6. ResultMap和ResultSetHandler:ResultMap定义了...

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    iBATIS DAO是Java开发中的一个持久层框架,它提供了数据访问对象(DAO)的实现,使得数据库操作更加简单和灵活。在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好...

    Ibatis入门例子,Ibatis教程

    例如,你可以通过使用`&lt;if&gt;`、`&lt;choose&gt;`等标签来编写条件语句,通过`&lt;resultMap&gt;`来定义复杂的对象关系映射。 学习Ibatis,不仅能够提高开发效率,还能使代码更加清晰、易于维护。随着对Ibatis的深入理解和实践,...

    ibatis api 帮助文档+IBATIS 开发文档

    4. **ResultMap**:定义了结果集如何映射到Java对象,支持复杂的列名到Java属性的映射,如一对一、一对多、多对多的关系映射。 5. **Transaction**:处理数据库事务,提供了开始、提交、回滚等操作。 **二、iBATIS...

    ibatis入门

    Ibatis 是一个优秀的 Java ORM(对象关系映射)框架,它允许程序员将数据库操作与业务逻辑分离,提供灵活的 SQL 配置和映射机制,使得开发人员能够自由地编写 SQL 而不被 ORM 的复杂性所束缚。这个入门级别的教程将...

    ibatis开发指南 经典教材

    ibatis,作为一款“半自动化”的对象关系映射(Object-Relational Mapping,简称ORM)工具,其设计理念与传统的ORM框架如Hibernate和Apache OJB有所不同。它在提供一定程度的自动映射功能的同时,也保留了对SQL语句...

    ibatis 的 jar包

    在Java开发中,iBATIS是一个强大的持久层框架,它能够将SQL语句与Java代码分离,提供了一种简单但有效的对象关系映射解决方案。这个“ibatis-2.3.4.726.jar”文件是iBATIS框架的一个特定版本——2.3.4.726,它是Java...

Global site tag (gtag.js) - Google Analytics