說(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