`
helloyesyes
  • 浏览: 1304002 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

ibatis 对象关系实现

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


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


在现在的版本中,对于n+1问题,ibatis已经很好的解决了。如下的配置:
一对一
xml 代码
  1. <resultMapid=”get-product-result”class=”com.ibatis.example.Product”>
  2. <resultproperty=”id”column=”PRD_ID”/>
  3. <resultproperty=”description”column=”PRD_DESCRIPTION”/>
  4. <resultproperty=”category”resultMap=“get-category-result”/>
  5. </resultMap>
  6. <resultMapid=”get-category-result”class=”com.ibatis.example.Category”>
  7. <resultproperty=”id”column=”CAT_ID”/>
  8. <resultproperty=”description”column=”CAT_DESCRIPTION”/>
  9. </resultMap>
  10. <selectid=”getProduct”parameterClass=”int”resultMap=”get-product-result”>
  11. select*
  12. fromPRODUCT,CATEGORY
  13. wherePRD_CAT_ID=CAT_ID
  14. andPRD_ID=#value#
  15. </select>

可以使用内在的resultMap来解决此问题。
同样一对多如下:
xml 代码
  1. <sqlMapnamespace="ProductCategory">
  2. <resultMapid=”categoryResult”class=”com.ibatis.example.Category”groupBy=”id”>
  3. <resultproperty=”id”column=”CAT_ID”/>
  4. <resultproperty=”description”column=”CAT_DESCRIPTION”/>
  5. <resultproperty=”productList”resultMap=”ProductCategory.productResult”/>
  6. </resultMap>
  7. <resultMapid=”productResult”class=”com.ibatis.example.Product”>
  8. <resultproperty=”id”column=”PRD_ID”/>
  9. <resultproperty=”description”column=”PRD_DESCRIPTION”/>
  10. </resultMap>
  11. <selectid=”getCategory”parameterClass=”int”resultMap=”categoryResult”>
  12. selectC.CAT_ID,C.CAT_DESCRIPTION,P.PRD_ID,P.PRD_DESCRIPTION
  13. fromCATEGORYC
  14. leftouterjoinPRODUCTP
  15. onC.CAT_ID=P.PRD_CAT_ID
  16. whereCAT_ID=#value#
  17. </select>
  18. </sqlMap>


注意,需要使用增加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 的 jar包

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

    ibatis教程 输入参数详解

    通过`resultMap`可以实现复杂的对象关系映射,如一对一、一对多等关联关系。 ### 动态SQL ibatis还支持动态SQL语句,可以根据业务逻辑动态生成SQL语句。例如,使用`&lt;if&gt;`元素可以实现条件判断,`&lt;choose&gt;`, `...

Global site tag (gtag.js) - Google Analytics