hibernate 的强大在于完全的对象化,对于对象之间的关系解决的比较好,如1对1,1对多,多对1,以及多对多。当然也包括继承关系。
而ibatis这方面就比较逊色了,不过对于也支持简单的关连查询,如1对1,和1对多。对于一般的情况来说,这两种已经足够了,当然不能层叠更新是一个缺陷,看了半天文档,也没有找到对象之间的层叠更新,估计是不支持。
以前的版本ibatis处理关连是通过执行两次sql来实现的,如下的实例:
一对多关联:
xml 代码
-
-
<sqlMapnamespace="User">
-
<typeAliasalias="user"type="com.ibatis.sample.User"/>
-
<typeAliasalias="address"type="com.ibatis.sample.Address"/>
-
<resultMapid="get-user-result"class="user">
-
<resultproperty="id"column="id"/>
-
<resultproperty="name"column="name"/>
-
<resultproperty="sex"column="sex"/>
-
<resultproperty="addresses"column="id"select="User.getAddressByUserId"/>
-
</resultMap>
-
<selectid="getUsers"parameterClass="java.lang.String"resultMap="get-user-result">
-
<![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">]>
-
</select>
-
<selectid="getAddressByUserId"parameterClass="int"resultClass="address">
-
<![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">]>
-
</select>
-
</sqlMap>
这里通过在resultMap 中定义嵌套查询getAddressByUserId,我们实现了关联数据的读取。
需要注意的是,这里有一个潜在的性能问题,也就是所谓“n+1”Select问题。
一对一关联:
对于这种情况,我们可以采用一次Select两张表的方式,避免这样的性能开销(假设上面示例中,每个User 只有一个对应的Address记录):
xml 代码
-
-
<resultMapid="get-user-result"class="user">
-
<resultproperty="id"column="id"/>
-
<resultproperty="name"column="name"/>
-
<resultproperty="sex"column="sex"/>
-
<resultproperty="address"column="t_address.address"/>
-
<resultproperty="zipCode"column="t_address.zipcode"/>
-
</resultMap>
-
<selectid="getUsers"parameterClass="java.lang.String"resultMap="get-user-result">
-
<![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">]>
-
</select>
-
在现在的版本中,对于n+1问题,ibatis已经很好的解决了。如下的配置:
一对一
xml 代码
-
-
<resultMapid=”get-product-result”class=”com.ibatis.example.Product”>
-
<resultproperty=”id”column=”PRD_ID”/>
-
<resultproperty=”description”column=”PRD_DESCRIPTION”/>
-
<resultproperty=”category”resultMap=“get-category-result”/>
-
</resultMap>
-
<resultMapid=”get-category-result”class=”com.ibatis.example.Category”>
-
<resultproperty=”id”column=”CAT_ID”/>
-
<resultproperty=”description”column=”CAT_DESCRIPTION”/>
-
</resultMap>
-
<selectid=”getProduct”parameterClass=”int”resultMap=”get-product-result”>
-
select*
-
fromPRODUCT,CATEGORY
-
wherePRD_CAT_ID=CAT_ID
-
andPRD_ID=#value#
-
</select>
可以使用内在的resultMap来解决此问题。
同样一对多如下:
xml 代码
-
-
<sqlMapnamespace="ProductCategory">
-
<resultMapid=”categoryResult”class=”com.ibatis.example.Category”groupBy=”id”>
-
<resultproperty=”id”column=”CAT_ID”/>
-
<resultproperty=”description”column=”CAT_DESCRIPTION”/>
-
<resultproperty=”productList”resultMap=”ProductCategory.productResult”/>
-
</resultMap>
-
<resultMapid=”productResult”class=”com.ibatis.example.Product”>
-
<resultproperty=”id”column=”PRD_ID”/>
-
<resultproperty=”description”column=”PRD_DESCRIPTION”/>
-
</resultMap>
-
<selectid=”getCategory”parameterClass=”int”resultMap=”categoryResult”>
-
selectC.CAT_ID,C.CAT_DESCRIPTION,P.PRD_ID,P.PRD_DESCRIPTION
-
fromCATEGORYC
-
leftouterjoinPRODUCTP
-
onC.CAT_ID=P.PRD_CAT_ID
-
whereCAT_ID=#value#
-
</select>
-
</sqlMap>
注意,需要使用增加groupBy属性来分类
分享到:
相关推荐
标题 "ibatis 的关系映射" 指的是在使用 iBATIS(一款优秀的Java持久层框架)时,如何处理数据库中的对象关系映射(ORM)问题。在Java应用程序中,iBATIS 提供了一种方便的方式来将数据库操作与业务逻辑解耦,使得...
**Ibatis 框架原理实现** Ibatis 是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,从而避免了Java代码与SQL的耦合,提高了开发效率。在这个自己编写的Ibatis框架实现中,我们可以看到类似的...
Ibatis通过将Java对象映射到SQL语句,实现了对象关系映射(ORM)。它允许开发者在XML配置文件或注解中编写SQL,然后通过SqlSession接口执行这些SQL,从而实现数据的增删改查。 在删除操作中,我们通常会有一个带有...
在本文档中,我们将详细介绍iBatis在处理多对多关系时的配置和实现。 多对多关系 多对多关系是一种常见的关系数据库设计模式,用于描述两个实体之间的多对多关系。在本例中,我们将使用学生(Student)和教师...
首先,Ibatis是一个轻量级的Java ORM(对象关系映射)框架,它的核心理念是将SQL语句与Java代码分离,提供一种XML或注解方式来定义SQL语句,从而简化数据库访问的复杂性。与传统的JDBC相比,Ibatis提供了一种更方便...
Ibatis的主要特点是通过XML或注解定义SQL映射文件,将SQL语句与Java对象绑定。例如,`<select>`标签用于定义查询语句,`<insert>`、`<update>`和`<delete>`分别对应增删改操作。在SQL映射文件中,可以使用动态SQL来...
在`org.apache.ibatis.executor.resultset.ResultSetHandler`中,ResultMap被用来定义字段与Java对象属性的映射关系。ResultMap不仅支持简单的列名映射,还能处理复杂的一对多、一对一关系映射。 六、...
1. 映射关系:Hibernate提供了一种对象关系映射(ORM)机制,自动处理对象与数据库之间的转换,而iBATIS需要开发者手动编写SQL语句。 2. 开发效率:在相同需求下,iBATIS的工作量可能大于Hibernate,因为需要手写SQL...
在IT行业中,数据库关系映射是数据访问层的重要部分,特别是在使用ORM(对象关系映射)框架时。Ibatis,作为一个轻量级的Java ORM框架,提供了强大的功能来处理复杂的数据映射,其中包括一对多的关系映射。在这个...
它不是一个完整的ORM(对象关系映射)框架,而是一个SQL映射框架,允许开发者编写动态SQL,将SQL语句与Java代码分离,提高了数据库操作的灵活性和可维护性。 **Ibatis的工作原理** 1. **配置文件**: Ibatis的核心是...
总结来说,Ibatis 是一个高效、灵活的 ORM(对象关系映射)框架,它让开发者能够更专注于业务逻辑,而不是繁琐的 JDBC 代码。通过学习 Ibatis,开发者可以更好地理解和掌握数据访问层的设计与实现,提升开发效率。...
5. ParameterMap和ParameterHandler:它们负责参数的设置和处理,ParameterMap代表了SQL参数的映射关系,而ParameterHandler则将Java对象转换为SQL语句中的参数。 6. ResultMap和ResultSetHandler:ResultMap定义了...
iBATIS DAO是Java开发中的一个持久层框架,它提供了数据访问对象(DAO)的实现,使得数据库操作更加简单和灵活。在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好...
例如,你可以通过使用`<if>`、`<choose>`等标签来编写条件语句,通过`<resultMap>`来定义复杂的对象关系映射。 学习Ibatis,不仅能够提高开发效率,还能使代码更加清晰、易于维护。随着对Ibatis的深入理解和实践,...
4. **ResultMap**:定义了结果集如何映射到Java对象,支持复杂的列名到Java属性的映射,如一对一、一对多、多对多的关系映射。 5. **Transaction**:处理数据库事务,提供了开始、提交、回滚等操作。 **二、iBATIS...
Ibatis 是一个优秀的 Java ORM(对象关系映射)框架,它允许程序员将数据库操作与业务逻辑分离,提供灵活的 SQL 配置和映射机制,使得开发人员能够自由地编写 SQL 而不被 ORM 的复杂性所束缚。这个入门级别的教程将...
在Java开发中,iBATIS是一个强大的持久层框架,它能够将SQL语句与Java代码分离,提供了一种简单但有效的对象关系映射解决方案。这个“ibatis-2.3.4.726.jar”文件是iBATIS框架的一个特定版本——2.3.4.726,它是Java...
通过`resultMap`可以实现复杂的对象关系映射,如一对一、一对多等关联关系。 ### 动态SQL ibatis还支持动态SQL语句,可以根据业务逻辑动态生成SQL语句。例如,使用`<if>`元素可以实现条件判断,`<choose>`, `...