ibatis一对多关系映射技巧

转载 2012年03月23日 15:44:18
ibatis 一对多关系映射等使用的一些技巧2011-03-01 10:431.在<result/>标签中,使用select属性
例如:用户和角色
<sqlMap namespace="user">
 <resultMap id="userResult" class="ur">
  <result property="id" column="id" />
  <result property="name" column="name" />
  <result property="account" column="account" />
  <result property="password" column="password" />
  <result property="deptId" column="deptId" />
  ...........
  <result property="roles" column="id" select="user.selectUserRole" />
  <result property="fullName" column="{userName=name,deptCode=deptcode}" select="user.getUserFullName" />
 </resultMap>
 
 <select id="selectUserRole" parameterClass="string" resultMap="roleResult" cacheModel="urCache">
  select a.* from u_role a join u_associate b on a.id=b.rid and
  b.lid=#value# order by a.sortNo, a.name
 </select>
 
 <select id="getUserFullName" parameterClass="java.util.HashMap" resultClass="string">
  select
  #userName#||getTreePathFunction('u_department',#deptCode#,'name','code') as
  fullName from dual
 </select>
</sqlMap>
注:{userName=name,deptCode=deptcode} 是为select="user.getUserFullName"所传递的参数。getTreePathFunction是
创建的一个oralce的function。


2.<resultMap/>的灵活使用
例如:用户和订单
<sqlMap namespace="customer">
    <typeAlias alias="customer" type="com.test.domain.Customer"/>


    <resultMap id="result_base" class="customer">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="address" column="address"/>
  ..........
    </resultMap>
    <resultMap id="result" class="customer" extends="result_base">
        <result property="orderlist" column="id" select="orders.findByCustomerId"/>
    </resultMap>


    <select id="getById" parameterClass="long" resultMap="result_base">
        select * from customer where id = #value#
    </select>
    <select id="getWithCashById" parameterClass="long" resultMap="result">
        select * from customer where id = #value#
    </select>
</sqlMap>
注:<resultMap/>标签有个extends属性,当只需要用户信息时,返回resultMap="result_base",如果还需要查看
该用户的订单信息时,可以返回resultMap="result",如果任何时候都返回resultMap="result",效率太低。


3.ibatis中N+1问题
例如:客户和信用卡:
<sqlMap namespace="UserCards">  
    <resultMap id="UserResult" class="User">  
        <result property="id" column="id"/>  
        <result property="name" column="name"/>  
        <result property="cards" select="UserCards.getCardsByUserId" column="id"/>  
    </resultMap>  
      
 <resultMap id="CardResult" class="Card">
  <result property="id" column="id" nullValue="0" />
  <result property="cardName" column="cardName" />
  <result property="balance" column="balance" nullValue="0" />
  <result property="userId" column="userId" nullValue="0" />
 </resultMap>
      
    <select id="getUserById" resultMap="UserResult" parameterClass="int">  
        select * from user where id = #value#  
    </select>  
</sqlMap> 
上述写法会引起 N+1问题:
修改成:
<resultMap class="User" id="UserResult" groupBy="id"> 
        <result property="id" column="id" nullValue="0"/> 
        <result property="name" column="name"/> 
        <result property="cards" resultMap="UserCards.CardResult" /> 
</resultMap> 
 
<select id="getAllUsers" resultMap="UserResult"> 
        select * from user a left join card b on a.id = b.userId  
</select> 


就可以解决该问题:
区别主要体现在groupBy="id"和<result property="cards" resultMap="UserCardsN1.CardResult" />及select用了表连接
控制台输出信息


 

ibatis实战之一对多关联

ibatis一对多关联查询 在实际开发中,我们常常遇到关联数据的情况,如User对象拥有若干Book对象 每个Book对象描述了归属于一个User信息 如下步骤演示一对多关联 1、创建user(id,...
  • itmyhome
  • itmyhome
  • 2014年06月13日 21:13
  • 4567

IBatis配置一对一、一对多两种实现方式

IBatis配置一对一、一对多两种实现方式有两张表:student(学生)、class(班级),一个学生只属于某一个班级,但某一个班下可以有多个学生。一对一方式一...
  • Muspelheim
  • Muspelheim
  • 2016年01月08日 22:41
  • 2819

java ibatis 一对多查询

父查询和子查询都使用map来接收查询参数,如果是一对一的查询接收是OK的 但是一对多的查询,子查询使用map接收参数,会报错子查询查询有多条数据。所以我只能自己写 一个对象使用List来接收子查询...
  • yichaoliangcsdn
  • yichaoliangcsdn
  • 2016年08月25日 15:21
  • 1054

ibatis的一对多查询

在Mybatis中,遇到需要一对多和多对多查询的对象封装,可以使用标签加载 而在Mybatis的前身ibatis中,不支持该标签,要进行类似的封装可以使用resultMap属性加载 在MyBati...
  • bingo_G
  • bingo_G
  • 2017年04月14日 19:07
  • 405

Hibernate关联映射之一对多,多对一以及双向一对多

在上篇博客我们讲了hibernate对单表的操作,本篇博客就来讲讲对多表的关联映射操作。首先我们拿来做例子的表为班级表1---n学生表,在这次的测试主键我用的是序列,创建代码如下: --班级表 dro...
  • qq_26624661
  • qq_26624661
  • 2016年08月13日 15:17
  • 2248

ibatis 一对一多表关联查询的问题

ibatis 一对一多表关联查询的结果集写法问题 类的成员如下: public class Order { private String id; private String us...
  • xuanjiewu
  • xuanjiewu
  • 2015年09月25日 23:59
  • 1355

iBatis一对多 分页详解

iBatis分页详解 相关配置  1. ibatis version: 2.3.4.  2. 数据库是oracle 12g.  3. 前端js为EXT.js 3.3.2 分页sql  1. count...
  • u013274781
  • u013274781
  • 2016年09月01日 10:56
  • 534

Mybatis(ibatis)的一对多关联配置

学过hibernate的同学都知道了,如何配置实体类之间存在着(双)(单)一对多的关系,今天让我们来了解一下。Mybatis是如何配置这种关系的!测试的数据库drop table t_10_01_st...
  • u013410747
  • u013410747
  • 2015年10月12日 09:18
  • 1117

hibernate映射总结详解: 映射一对多双向自身关联关系

 Ⅲ. 映射实体关联关系---  一对多关联关系  ---  一对多双向自身关联映射:以category为例,它代表商品类别,存在一对多双向关联。如:食品类别包括蔬菜类型和水果类型,水果类型又包括苹果...
  • sunyadongwanghbjm
  • sunyadongwanghbjm
  • 2007年09月05日 14:05
  • 3377

ibatis配置多表关联(一对一、一对多、多对多)

iBatis的多表关联。ibatis的表关联,和数据库语句无关,是在Java程序中,把若干语句的结果关联到一起。这种关联形式,虽然在大数据量时是很奢侈的行为,但是看起来很干净,用起来也很方便。这里用表...
  • zzcv_
  • zzcv_
  • 2007年12月25日 17:22
  • 20669
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ibatis一对多关系映射技巧
举报原因:
原因补充:

(最多只允许输入30个字)