`
zyl
  • 浏览: 486258 次
社区版块
存档分类
最新评论

ibatis 对象关系实现

    博客分类:
  • ORM
阅读更多
    hibernate 的强大在于完全的对象化,对于对象之间的关系解决的比较好,如1对1,1对多,多对1,以及多对多。当然也包括继承关系。
    而ibatis这方面就比较逊色了,不过对于也支持简单的关连查询,如1对1,和1对多。对于一般的情况来说,这两种已经足够了,当然不能层叠更新是一个缺陷,看了半天文档,也没有找到对象之间的层叠更新,估计是不支持。
    以前的版本ibatis处理关连是通过执行两次sql来实现的,如下的实例:
    一对多关联:
xml 代码
 
  1.    
  2. <sqlMap namespace="User">  
  3. <typeAlias alias="user" type="com.ibatis.sample.User"/>  
  4. <typeAlias alias="address" type="com.ibatis.sample.Address"/>  
  5. <resultMap id="get-user-result" class="user">  
  6. <result property="id" column="id"/>  
  7. <result property="name" column="name"/>  
  8. <result property="sex" column="sex"/>  
  9. <result property="addresses" column="id" select="User.getAddressByUserId"/>  
  10. </resultMap>  
  11. <select id="getUsers" parameterClass="java.lang.String" resultMap="get-user-result">  
  12. <![CDATA[ 
  13. select id,name,sex 
  14. from t_user 
  15. where id = #id# 
  16. ]]>  
  17. </select>  
  18. <select id="getAddressByUserId" parameterClass="int" resultClass="address">  
  19. <![CDATA[ 
  20. select address,zipcode 
  21. from t_address 
  22. where user_id = #userid# 
  23. ]]>  
  24. </select>  
  25. </sqlMap>       


这里通过在resultMap 中定义嵌套查询getAddressByUserId,我们实现了关联数据的读取。
需要注意的是,这里有一个潜在的性能问题,也就是所谓“n+1”Select问题。
一对一关联:
对于这种情况,我们可以采用一次Select两张表的方式,避免这样的性能开销(假设上面示例中,每个User 只有一个对应的Address记录):
xml 代码
 
  1.    
  2. <resultMap id="get-user-result" class="user">  
  3. <result property="id" column="id"/>  
  4. <result property="name" column="name"/>  
  5. <result property="sex" column="sex"/>  
  6. <result property="address" column="t_address.address"/>  
  7. <result property="zipCode" column="t_address.zipcode"/>  
  8. </resultMap>  
  9. <select id="getUsers" parameterClass="java.lang.String" resultMap="get-user-result">  
  10. <![CDATA[ 
  11. select * 
  12. from t_user,t_address 
  13. where t_user.id=t_address.user_id 
  14. ]]>  
  15. </select>  
  16.         


在现在的版本中,对于n+1问题,ibatis已经很好的解决了。如下的配置:
一对一
xml 代码
 
  1.    
  2. <resultMap id=”get-product-result” class=”com.ibatis.example.Product”>  
  3. <result property=”id” column=”PRD_ID”/>  
  4. <result property=”description” column=”PRD_DESCRIPTION”/>  
  5. <result property=”category” resultMap=“get-category-result” />  
  6. </resultMap>  
  7. <resultMap id=”get-category-result” class=”com.ibatis.example.Category”>  
  8. <result property=”id” column=”CAT_ID” />  
  9. <result property=”description” column=”CAT_DESCRIPTION” />  
  10. </resultMap>  
  11. <select id=”getProduct” parameterClass=”int” resultMap=”get-product-result”>  
  12. select *  
  13. from PRODUCT, CATEGORY  
  14. where PRD_CAT_ID=CAT_ID  
  15. and PRD_ID = #value#  
  16. </select>   
  
可以使用内在的resultMap来解决此问题。
同样一对多如下:
xml 代码
 
  1.    
  2. <sqlMap namespace="ProductCategory">  
  3. <resultMap id=”categoryResult” class=”com.ibatis.example.Category” groupBy=”id”>  
  4. <result property=”id” column=”CAT_ID”/>  
  5. <result property=”description” column=”CAT_DESCRIPTION”/>  
  6. <result property=”productList” resultMap=”ProductCategory.productResult”/>  
  7. </resultMap>  
  8. <resultMap id=”productResult” class=”com.ibatis.example.Product”>  
  9. <result property=”id” column=”PRD_ID”/>  
  10. <result property=”description” column=”PRD_DESCRIPTION”/>  
  11. </resultMap>  
  12. <select id=”getCategory” parameterClass=”int” resultMap=”categoryResult”>  
  13. select C.CAT_ID, C.CAT_DESCRIPTION, P.PRD_ID, P.PRD_DESCRIPTION  
  14. from CATEGORY C  
  15. left outer join PRODUCT P  
  16. on C.CAT_ID = P.PRD_CAT_ID  
  17. where CAT_ID = #value#  
  18. </select>  
  19. </sqlMap>       


注意,需要使用增加groupBy属性来分类
分享到:
评论
4 楼 abraham 2007-01-25  
在日志中显示sql语句
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
3 楼 wdl123 2007-01-25  
请教:在运行当中,能否显示所执行的sql语句。就和HIBERNATE的show_sql一样
2 楼 宏基小键盘 2007-01-23  
<sqlMapConfig>
  <settings lazyLoadingEnabled="true" ...
1 楼 lincee 2007-01-22  
看了楼主的文章,,我有一个问题
那就是,,如果我想实现 延迟加载的情况,,应该怎么配置呢?

相关推荐

    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