mybatis之一個(gè)實(shí)體類內(nèi)部嵌套兩個(gè)同類型對(duì)象

說(shuō)在前面

這個(gè)問(wèn)題不知道其他人會(huì)不會(huì)遇見(jiàn),反正我遇見(jiàn)了,我不管,我就是要記錄下來(lái),誰(shuí)知道我下次會(huì)不會(huì)再遇見(jiàn),畢竟我健忘呀。


問(wèn)題描述

昨天做項(xiàng)目的時(shí)候要實(shí)現(xiàn)一個(gè)需求的的功能,持久層里要添加查找需求單的詳細(xì)信息的接口,注意哦,是同時(shí)要查找出發(fā)單人還有接單人這兩個(gè)對(duì)象的姓名、頭像的哦,而發(fā)單人這個(gè)對(duì)象和接單人對(duì)象的關(guān)系是外鍵連接。


老規(guī)矩,以源碼為導(dǎo)向

package ssm.aidai.pojo;

Order 實(shí)體類

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;//發(fā)單人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關(guān)鍵源碼:

<resultMap id="BaseResultMap2" type="ssm.aidai.pojo.Order"
    extends="BaseResultMap">
    <!-- 接單人身份的receiveUser關(guān)聯(lián) -->
    <association property="receiveUser" javaType="ssm.aidai.pojo.User"
        column="order_receive_id" select="getReceiveUser" />
    <!-- 發(fā)單人身份的sendUser關(guān)聯(lián) -->
    <association property="sendUser" column="order_send_id"
        select="getSendUser" />
</resultMap>
<!-- 連接接單人對(duì)象的函數(shù) -->
<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>
<!-- 連接發(fā)單人對(duì)象的函數(shù) -->
<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實(shí)體類中嵌套這兩個(gè)對(duì)象,分別是:receiveUser和sendUser,而我們要做的就是將在查詢Order這個(gè)對(duì)象的時(shí)候通過(guò)orderReceiveId和orderSendId這兩個(gè)外鍵查詢r(jià)eceiveUser和sendUser這兩個(gè)對(duì)象,那么我是怎么做的呢?
在resultMap中:

      <resultMap id="BaseResultMap2" type="ssm.aidai.pojo.Order" extends="BaseResultMap"> 
      <!-- 接單人身份的receiveUser關(guān)聯(lián) --> 
      <association property="receiveUser" javaType="ssm.aidai.pojo.User" column="order_receive_id" select="getReceiveUser" /> 
       <!-- 發(fā)單人身份的sendUser關(guān)聯(lián) --> 
      <association property="sendUser" column="order_send_id"   javaType="ssm.aidai.pojo.User"  select="getSendUser" />
      </resultMap>

根據(jù)應(yīng)用場(chǎng)景進(jìn)行元素分析:

  • association: 復(fù)雜對(duì)象的映射
  • property: 映射到Order實(shí)體類中的receiveUser
  • column : 這個(gè)其實(shí)就是你要傳的參數(shù)名
  • javaType: 一個(gè) Java 類的完全限定名

整個(gè)查詢操作流程是這樣的:

1、數(shù)據(jù)庫(kù)依據(jù)下面的代碼查找Order對(duì)象,然后將對(duì)象映射到BaseResultMap2結(jié)果集中;

  <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復(fù)雜對(duì)象的映射,即

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

所以系統(tǒng)會(huì)通過(guò)select的屬性值即getReceiveUser跳轉(zhuǎn)到id="getReceiveUser"的xml中,并將column中的order_receive_id的映射字段中的值傳遞過(guò)去即

  <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}呢,因?yàn)閛rderReceiveId是order_receive_id在實(shí)體類Order中的映射字段,可以裝載值。
在查詢到對(duì)象之后會(huì)將對(duì)象放入receiveUser。
sendUser的操作是一樣的,就不解釋了?。?!


Note:發(fā)布的這些文章全都是自己邊學(xué)邊總結(jié)的,難免有紕漏,如果發(fā)現(xiàn)有不足的地方,希望可以指出來(lái),一起學(xué)習(xí)咯,么么噠。
開(kāi)源愛(ài)好者,相信開(kāi)源的力量必將改變世界:
** osc :** https://git.oschina.net/xi_fan
github: https://github.com/wiatingpub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,711評(píng)論 19 139
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,101評(píng)論 0 9
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,854評(píng)論 18 399
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 6,286評(píng)論 0 4
  • 天色黑透了,已經(jīng)快九點(diǎn)了。 我和我的朋友,兩個(gè)剛參加完高考的女生,在這異國(guó)的小巷里,抱著沉重的行李,已經(jīng)尋覓了四個(gè)...
    窩書(shū)閱讀 180評(píng)論 0 1

友情鏈接更多精彩內(nèi)容