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是一个基于.NET框架的持久层框架,提供了一种灵活、可控的方式来实现类ORM(Object-Relational Mapping)的解决方案。下面是对iBatis的详细使用手册的知识点总结: 1. iBatis概述 iBatis是一种灵活的持久层...
第10章 iBATIS数据访问对象 173 10.1 隐藏实现细节 173 10.1.1 为何要分离 174 10.1.2 一个简单示例 175 10.2 配置DAO 177 10.2.1 properties元素 177 10.2.2 context元素 178 10.2.3 transactionManager元素 178 ...
使用ibatis 提供的ORM 机制,对业务逻辑实现人员而言,面对的是纯粹的Java 对象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL 语句,而ibatis 则要求...
使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL 语句,而ibatis 则要求...
* Spring ORM:提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQLMap。 iBATIS 架构图: iBATIS 是一个基于 Java 的持久层框架。iBATIS 提供的持久层框架包括 SQL Maps 和 DataAccess Objects...
iBATIS 只是封装了数据访问层,替我们做了部分的对象关系映射。但代价是必须要写 XML 配置文件,相对 Hibernate 还要写很多 SQL。 使用 iBATIS 我们可以做到代码和 SQL 的分离,只要 SQL 能够解决的问题,iBATIS 就...
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装。 hibernate劣势 难以使用数据库的一些功能 满足不了程序对cache的需求 耦合度高 debug难 hibernate更新大批量
iBATIS允许你用多种方式建立从对象到数据库的映射关系 MySpace已应用 4.使用于任何类型的关系数据库: 应用数据库 企业数据库 私有数据库 遗留数据库 简单性 性能 明确分工 可移植性:Java、.Net或者其他 ...
iBATIS允许你用多种方式建立从对象到数据库的映射关系 MySpace已应用 4.使用于任何类型的关系数据库: 应用数据库 企业数据库 私有数据库 遗留数据库 简单性 性能 明确分工 可移植性:Java、.Net或者其他...
☆ Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 ☆ Spring Web 模块:...
Spring 框架插入了假设干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 2. iBATIS 架构图 iBATIS 是一个基于...
简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以方便以后的维护。 这个框架有两个主要的组成部分,一个是SQL Maps,另一个是Data ...
4 依赖注入:建立对象与对象之间依赖关系的实现,包括接口注入、构造注入、set注入,在Spring中只支持后两种 5 AOP:面向方面编程,我们可以把日志、安全、事务管理等服务(或功能)理解成一个“方面”,那么以前...
对象关系映射技术,即ORM(Object-Relational Mapping)技术,指的是把关系数据库的表结构映射到对象上,通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 在Python中,最有名...
答案:对象/关系映射集成模块支持使用 ORM 工具,如 Hibernate、JDO 和 iBATIS SQL Maps,提供了事务管理服务。 9. WEB 模块 答案:WEB 模块提供了一个适合 web 应用的上下文,支持多种面向 web 的任务,如透明地...
对象关系映射的改进,效率更高 MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。 例如,#userName#---#{userName} (2) 缺点 与Hibernate比较 Mybatis并不会为程序员在运行期自动生成 SQL 执行 ...
6.11 版面与帖子:Master/Detail 主从关系 6.12 帖子树及其分页 6.13 与Web层交互 6.14 帖子的多形扩展:投票 6.15 移植到Hibernate 3 6.16 结束语 第3部分 附 录 第7章 常用Hibernate映射配置说明 7.1 ...
简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以方便以后的维护。 这个框架有两个主要的组成部分,一个是SQL Maps,另一个是Data ...
6.11 版面与帖子:Master/Detail 主从关系 6.12 帖子树及其分页 6.13 与Web层交互 6.14 帖子的多形扩展:投票 6.15 移植到Hibernate 3 6.16 结束语 第3部分 附 录 第7章 常用Hibernate映射配置说明 7.1 ...