mybatis之一个实体类内部嵌套两个同类型对象

说在前面

这个问题不知道其他人会不会遇见,反正我遇见了,我不管,我就是要记录下来,谁知道我下次会不会再遇见,毕竟我健忘呀。


问题描述

昨天做项目的时候要实现一个需求的的功能,持久层里要添加查找需求单的详细信息的接口,注意哦,是同时要查找出发单人还有接单人这两个对象的姓名、头像的哦,而发单人这个对象和接单人对象的关系是外键连接。


老规矩,以源码为导向

package ssm.aidai.pojo;

Order 实体类

import java.math.BigDecimal;
import java.util.Date;

public class Order {

private Long orderId;

private BigDecimal orderReward;

private Integer orderReceiveId;

private Integer orderType;

private Integer orderSendId;

private Integer placeId;

private Date orderTime;

private String orderExchnPlace;

private Date orderExpireTime;

private Date orderSendTime;

private BigDecimal orderWyMoney;

private Integer orderStatus;

private Date orderFinishTime;

private String orderContent;

private User receiveUser; //接单人User

private User sendUser;//发单人User

private Place place;


public User getReceiveUser() {
    return receiveUser;
}

public void setReceiveUser(User receiveUser) {
    this.receiveUser = receiveUser;
}

public User getSendUser() {
    return sendUser;
}

public void setSendUser(User sendUser) {
    this.sendUser = sendUser;
}

public Place getPlace() {
    return place;
}

public void setPlace(Place place) {
    this.place = place;
}

public Long getOrderId() {
    return orderId;
}

public void setOrderId(Long orderId) {
    this.orderId = orderId;
}

public BigDecimal getOrderReward() {
    return orderReward;
}

public void setOrderReward(BigDecimal orderReward) {
    this.orderReward = orderReward;
}

public Integer getOrderReceiveId() {
    return orderReceiveId;
}

public void setOrderReceiveId(Integer orderReceiveId) {
    this.orderReceiveId = orderReceiveId;
}

public Integer getOrderType() {
    return orderType;
}

public void setOrderType(Integer orderType) {
    this.orderType = orderType;
}

public Integer getOrderSendId() {
    return orderSendId;
}

public void setOrderSendId(Integer orderSendId) {
    this.orderSendId = orderSendId;
}

public Integer getPlaceId() {
    return placeId;
}

public void setPlaceId(Integer placeId) {
    this.placeId = placeId;
}

public Date getOrderTime() {
    return orderTime;
}

public void setOrderTime(Date orderTime) {
    this.orderTime = orderTime;
}

public String getOrderExchnPlace() {
    return orderExchnPlace;
}

public void setOrderExchnPlace(String orderExchnPlace) {
    this.orderExchnPlace = orderExchnPlace == null ? null : orderExchnPlace
            .trim();
}

public Date getOrderExpireTime() {
    return orderExpireTime;
}

public void setOrderExpireTime(Date orderExpireTime) {
    this.orderExpireTime = orderExpireTime;
}

public Date getOrderSendTime() {
    return orderSendTime;
}

public void setOrderSendTime(Date orderSendTime) {
    this.orderSendTime = orderSendTime;
}

public BigDecimal getOrderWyMoney() {
    return orderWyMoney;
}

public void setOrderWyMoney(BigDecimal orderWyMoney) {
    this.orderWyMoney = orderWyMoney;
}

public Integer getOrderStatus() {
    return orderStatus;
}

public void setOrderStatus(Integer orderStatus) {
    this.orderStatus = orderStatus;
}

public Date getOrderFinishTime() {
    return orderFinishTime;
}

public void setOrderFinishTime(Date orderFinishTime) {
    this.orderFinishTime = orderFinishTime;
}

public String getOrderContent() {
    return orderContent;
}

public void setOrderContent(String orderContent) {
    this.orderContent = orderContent == null ? null : orderContent.trim();
 }
}

OrderMapper关键源码:

<resultMap id="BaseResultMap2" type="ssm.aidai.pojo.Order"
    extends="BaseResultMap">
    <!-- 接单人身份的receiveUser关联 -->
    <association property="receiveUser" javaType="ssm.aidai.pojo.User"
        column="order_receive_id" select="getReceiveUser" />
    <!-- 发单人身份的sendUser关联 -->
    <association property="sendUser" column="order_send_id"
        select="getSendUser" />
</resultMap>
<!-- 连接接单人对象的函数 -->
<select id="getReceiveUser" resultMap="UserResultMap"
    parameterType="java.lang.Integer">
    select
    user_id,user_name,user_icon
    from aidai_user where
    user_id =
    #{orderReceiveId,jdbcType=INTEGER}
</select>
<!-- 连接发单人对象的函数 -->
<select id="getSendUser" resultMap="UserResultMap"
    parameterType="java.lang.Integer">
    select
    user_id,user_name,user_icon
    from aidai_user where
    user_id =
    #{orderSendId,jdbcType=INTEGER}
</select>
<!-- 查找订单信息 -->
<select id="selectByPrimaryKey" resultMap="BaseResultMap2"
    parameterType="java.lang.Long">
    select
    <include refid="Base_Column_List" />
    ,
    <include refid="Additional_Column_Place" />
    from aidai_order o,
    aidai_place p
    where order_id =
    #{orderId,jdbcType=INTEGER} and p.place_id =
    o.place_id
</select>

源码分析:

在Order实体类中嵌套这两个对象,分别是:receiveUser和sendUser,而我们要做的就是将在查询Order这个对象的时候通过orderReceiveId和orderSendId这两个外键查询receiveUser和sendUser这两个对象,那么我是怎么做的呢?
在resultMap中:

      <resultMap id="BaseResultMap2" type="ssm.aidai.pojo.Order" extends="BaseResultMap"> 
      <!-- 接单人身份的receiveUser关联 --> 
      <association property="receiveUser" javaType="ssm.aidai.pojo.User" column="order_receive_id" select="getReceiveUser" /> 
       <!-- 发单人身份的sendUser关联 --> 
      <association property="sendUser" column="order_send_id"   javaType="ssm.aidai.pojo.User"  select="getSendUser" />
      </resultMap>

根据应用场景进行元素分析:

  • association: 复杂对象的映射
  • property: 映射到Order实体类中的receiveUser
  • column : 这个其实就是你要传的参数名
  • javaType: 一个 Java 类的完全限定名

整个查询操作流程是这样的:

1、数据库依据下面的代码查找Order对象,然后将对象映射到BaseResultMap2结果集中;

  <select id="selectByPrimaryKey" resultMap="BaseResultMap2"
    parameterType="java.lang.Long">
    select
    <include refid="Base_Column_List" />
    ,
    <include refid="Additional_Column_Place" />
    from aidai_order o,
    aidai_place p
    where order_id =
    #{orderId,jdbcType=INTEGER} and p.place_id =
    o.place_id
</select>

2、而在BaseResultMap2中有以下association复杂对象的映射,即

    <association property="receiveUser" javaType="ssm.aidai.pojo.User" column="order_receive_id" select="getReceiveUser" /> 

所以系统会通过select的属性值即getReceiveUser跳转到id="getReceiveUser"的xml中,并将column中的order_receive_id的映射字段中的值传递过去即

  <select id="getReceiveUser" resultMap="UserResultMap"
    parameterType="java.lang.Integer">
    select
    user_id,user_name,user_icon
    from aidai_user where
    user_id =
    #{orderReceiveId,jdbcType=INTEGER}
  </select>

那么为什么是#{orderReceiveId,jdbcType=INTEGER}呢,因为orderReceiveId是order_receive_id在实体类Order中的映射字段,可以装载值。
在查询到对象之后会将对象放入receiveUser。
sendUser的操作是一样的,就不解释了!!!


Note:发布的这些文章全都是自己边学边总结的,难免有纰漏,如果发现有不足的地方,希望可以指出来,一起学习咯,么么哒。
开源爱好者,相信开源的力量必将改变世界:
** osc :** https://git.oschina.net/xi_fan
github: https://github.com/wiatingpub

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,678评论 0 9
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,422评论 0 4
  • 天色黑透了,已经快九点了。 我和我的朋友,两个刚参加完高考的女生,在这异国的小巷里,抱着沉重的行李,已经寻觅了四个...
    窝书阅读 138评论 0 1