1. 程式人生 > >mybatis關聯查詢resultmap的使用詳解resultmap

mybatis關聯查詢resultmap的使用詳解resultmap

因為該案例比較典型,所以記錄一下,恐後期有所疑問,以便用時便於會議。

案例典型在 關聯關係典型

主表一張業務模板表

TABLE_NAME	COLUMN_NAME	COMMENTS
YMIT_BIZ_TMP	PK_ID	自增主鍵
YMIT_BIZ_TMP	BIZ_TMP_NM	業務模板名稱
YMIT_BIZ_TMP	TRD_INF_ID	交易介面ID,與介面用例樹關聯
YMIT_BIZ_TMP	TRD_INF_NM	交易介面名稱
YMIT_BIZ_TMP	CRT_USR_ID	LOGINCODE
YMIT_BIZ_TMP	CRT_TM	建立時間

關係表一張關聯關係表

TABLE_NAME	COLUMN_NAME	COMMENTS
YMIT_BIZTMP_FLD	TEMP_ID	業務模板資訊表的PK_ID
YMIT_BIZTMP_FLD	MSG_ID	BSP對應報文ID
YMIT_BIZTMP_FLD	FLD_ID	公共報文欄位ID

關聯資料表一張 報文欄位表

TABLE_NAME	COLUMN_NAME	COMMENTS
YMIT_MSG_FLD	PK_ID	欄位ID,自增主鍵
YMIT_MSG_FLD	MSG_ID	關聯報文,對應報文的NODE_ID值
YMIT_MSG_FLD	FLD_NM	報文欄位名稱
YMIT_MSG_FLD	FLD_DESC	欄位描述
YMIT_MSG_FLD	FLD_LEN	資料長度
YMIT_MSG_FLD	IS_REQ	是否必填,1為是,0為否
YMIT_MSG_FLD	DEF_VAL	預設值
YMIT_MSG_FLD	FIX_VAL	修訂值

一次查詢,返回主表模板資訊加上模板關聯的所有欄位資訊

一  定義接手domain

public class YmitBizTmpVM {

	private	String	pkId	;//	自增主鍵
	private	String	bizTmpNm	;//	業務模板名稱
	private	String	trdInfId	;//	交易介面ID,與介面用例樹關聯
	private	String	trdInfNm	;//	交易介面名稱
	private	String	crtUsrId	;//	LOGINCODE
	private	String	crtTm	;//	建立時間
	private	String	msgId	;//	報文結構樹上選擇點的pkId
    private List<YmitMsgFld> ymitMsgFld; //通訊型別對應的引數

二 編寫resultmap

<!--模板資訊 -->
	<resultMap id="ymitBizTmpVMMap" type="cn.com.yusys.ymit.web.rest.vm.YmitBizTmpVM">
		<id column="PK_ID" property="pkId" jdbcType="VARCHAR" />
		<result column="BIZ_TMP_NM" property="bizTmpNm" jdbcType="VARCHAR" />
		<result column="TRD_INF_ID" property="trdInfId" jdbcType="VARCHAR" />
		<result column="TRD_INF_NM" property="trdInfNm" jdbcType="VARCHAR" />
		<result column="CRT_USR_ID" property="crtUsrId" jdbcType="VARCHAR" />
		<result column="CRT_TM" property="crtTm" jdbcType="VARCHAR" />
		<collection property="ymitMsgFld" javaType="java.util.List" ofType="cn.com.yusys.ymit.domain.YmitMsgFld">
			<id column="FLD_ID" property="pkId" jdbcType="VARCHAR" />
			<id column="MSG_ID" property="msgId" jdbcType="VARCHAR" />
			<result column="FLD_NM" property="fldNm" jdbcType="VARCHAR" />
			<result column="FLD_DESC" property="fldDesc" jdbcType="VARCHAR" />
			<result column="FLD_LEN" property="fldLen" jdbcType="VARCHAR" />
			<result column="IS_REQ" property="isReq" jdbcType="VARCHAR" />
			<result column="DEF_VAL" property="defVal" jdbcType="VARCHAR" />
			<result column="FIX_VAL" property="fixVal" jdbcType="VARCHAR" />
		</collection>
	</resultMap>

詳細解釋:                    id :resultmap的標識 select語句中引用時用的,

                                  type: 查詢返回的資料型別

<id><result column>      : 都是屬性的名字對應關係分別對應表中列的名字和domain中的名字

collection                        :說明這是一個一對多的關係,多就放在這裡

collection中的property是接收domain中的那個多的的屬性名字 javatype是多的型別

collection中的其他的和上邊的一樣了。

三 書寫SQL

<select id="getTmpVm" parameterType="java.util.Map"
		resultMap="ymitBizTmpVMMap">
		select 
		c.PK_ID as FLD_ID,
		c.MSG_ID,
		c.FLD_NM,
		c.FLD_DESC,
		c.FLD_LEN,
		c.IS_REQ,
		c.DEF_VAL,
		c.FIX_VAL,
		a.PK_ID,
		a.BIZ_TMP_NM,
		a.TRD_INF_ID,
		a.TRD_INF_NM,
		a.CRT_USR_ID,
		a.CRT_TM

		from ymit_biz_tmp a,ymit_biztmp_fld b,ymit_msg_fld c
		where
		a.trd_Inf_Id=#{condition.trdInfId}
		and b.msg_id=#{condition.msgId}
		and
		a.pk_id=b.temp_id and b.msg_id =c.msg_id and b.fld_id = c.pk_id

	</select>

詳細介紹:

因為兩張表的有重名的,所以呢,在查詢的時候呢,將其中的一個用as給起個暫時名字,然後對應到resultmap中的那個,

曲線救國。

然後就沒有然後了。

resultmap作為mybatis中最常用最靈活最難得傢伙,這樣就可以用起來了。