论坛首页 Java企业应用论坛

ibatis 对象关系实现

浏览 11698 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-16  
    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属性来分类
   发表时间:2007-01-22  
看了楼主的文章,,我有一个问题
那就是,,如果我想实现 延迟加载的情况,,应该怎么配置呢?
0 请登录后投票
   发表时间:2007-01-23  
<sqlMapConfig>
  <settings lazyLoadingEnabled="true" ...
0 请登录后投票
   发表时间:2007-01-25  
请教:在运行当中,能否显示所执行的sql语句。就和HIBERNATE的show_sql一样
0 请登录后投票
   发表时间: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
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics