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

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详细使用手册(.net版)[收集].pdf

    iBatis是一个基于.NET框架的持久层框架,提供了一种灵活、可控的方式来实现类ORM(Object-Relational Mapping)的解决方案。下面是对iBatis的详细使用手册的知识点总结: 1. iBatis概述 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 开发指南(pdf)

    使用ibatis 提供的ORM 机制,对业务逻辑实现人员而言,面对的是纯粹的Java 对象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL 语句,而ibatis 则要求...

    ibatis 开发指南

    使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL 语句,而ibatis 则要求...

    各技术框架架构图.doc

    * Spring ORM:提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQLMap。 iBATIS 架构图: iBATIS 是一个基于 Java 的持久层框架。iBATIS 提供的持久层框架包括 SQL Maps 和 DataAccess Objects...

    各种系统架构图及其简介.pdf

    iBATIS 只是封装了数据访问层,替我们做了部分的对象关系映射。但代价是必须要写 XML 配置文件,相对 Hibernate 还要写很多 SQL。 使用 iBATIS 我们可以做到代码和 SQL 的分离,只要 SQL 能够解决的问题,iBATIS 就...

    SpringBoot操作数据库jpa-SB系列之006-配套项目

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装。 hibernate劣势 难以使用数据库的一些功能 满足不了程序对cache的需求 耦合度高 debug难 hibernate更新大批量

    IBatisNet.DataMapper 之简单三层

    iBATIS允许你用多种方式建立从对象到数据库的映射关系 MySpace已应用 4.使用于任何类型的关系数据库: 应用数据库 企业数据库 私有数据库 遗留数据库 简单性 性能 明确分工 可移植性:Java、.Net或者其他 ...

    IBatisNet完整项目源码(含数据库)

    iBATIS允许你用多种方式建立从对象到数据库的映射关系 MySpace已应用 4.使用于任何类型的关系数据库: 应用数据库 企业数据库 私有数据库 遗留数据库 简单性 性能 明确分工 可移植性:Java、.Net或者其他...

    Spring面试题

    ☆ Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 ☆ Spring Web 模块:...

    六大类系统架构图及其简介.doc

    Spring 框架插入了假设干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 2. iBATIS 架构图 iBATIS 是一个基于...

    流风通用管理框架源码

    简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以方便以后的维护。 这个框架有两个主要的组成部分,一个是SQL Maps,另一个是Data ...

    Spring基础与快速入门

    4 依赖注入:建立对象与对象之间依赖关系的实现,包括接口注入、构造注入、set注入,在Spring中只支持后两种 5 AOP:面向方面编程,我们可以把日志、安全、事务管理等服务(或功能)理解成一个“方面”,那么以前...

    Python使用Pandas库实现MySQL数据库的读写

    对象关系映射技术,即ORM(Object-Relational Mapping)技术,指的是把关系数据库的表结构映射到对象上,通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 在Python中,最有名...

    Spring常见面试题与答案,IOC AOP等

    答案:对象/关系映射集成模块支持使用 ORM 工具,如 Hibernate、JDO 和 iBATIS SQL Maps,提供了事务管理服务。 9. WEB 模块 答案:WEB 模块提供了一个适合 web 应用的上下文,支持多种面向 web 的任务,如透明地...

    MyBatis学习资料

    对象关系映射的改进,效率更高 MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。 例如,#userName#---#{userName} (2) 缺点 与Hibernate比较  Mybatis并不会为程序员在运行期自动生成 SQL 执行 ...

    深入浅出Hibernate中文版 part2

    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 ...

    深入浅出Hibernate中文版 part1

    6.11 版面与帖子:Master/Detail 主从关系 6.12 帖子树及其分页 6.13 与Web层交互 6.14 帖子的多形扩展:投票 6.15 移植到Hibernate 3 6.16 结束语 第3部分 附 录 第7章 常用Hibernate映射配置说明 7.1 ...

Global site tag (gtag.js) - Google Analytics