关联对象mapper.xml的写法

产生如题的需求的原因如下,在查询订单列表的时候,订单表中只有地址的编号,不存在地址的详细信息,这时候需要表关联查询,将查询的结果映射到javabean中,在订单的bean中,还存在一个地址的bean,如何将查询的结果映射到地址bean当中呢?

mybatis支持将数据库查询结果映射为一个resultmap,通过resultmap进一步的将查询结果与Javabean对应起来:

<!--这边的id与下面的对应,数据的类型可以是Javabean-->
<resultMap id="cardDetailResultMap" type="com.lflweb.entity.mar.MarMem">
            <!--这边是将获取的结果与Javabean一一对应-->
        <result column="memid" property="memid" jdbcType="VARCHAR"/>
        <result column="prdid" property="prdid" jdbcType="VARCHAR"/>
        <result column="custid" property="custid" jdbcType="VARCHAR"/>
        <result column="orderid" property="orderid" jdbcType="VARCHAR"/>
        <!--对于javabean中存在子级Javabean的需要通过一下方法进行映射-->
        <association property="address" javaType="com.lflweb.entity.ctm.CtmAddress">
            <id column="addressid" property="addressid" jdbcType="VARCHAR"/>
            <result column="addcontact" property="addcontact" jdbcType="VARCHAR"/>
            <result column="addmobile" property="addmobile" jdbcType="VARCHAR"/>
            <result column="contactsex" property="contactsex" jdbcType="VARCHAR"/>
            <result column="addprov" property="addprov" jdbcType="VARCHAR"/>
        </association>
    </resultMap>
    <!--这边是一个正常的调用数据库的过程,可以是通过SQL、存储过程,只需将输出的结果resultType改为与resultmap的映射-->
    <select id="GetCardListByCustId" resultMap="cardDetailResultMap" parameterType="com.lflweb.entity.mar.MarMem" statementType="CALLABLE">
        {call P_Get_CardListByCustId(
            #{search.search,javaType=String,jdbcType=VARCHAR},
            #{search.start,javaType=int,jdbcType=INTEGER},
            #{search.end,javaType=int,jdbcType=INTEGER},
            #{search.total,javaType=int,jdbcType=INTEGER,mode=OUT}
        )}
    </select>

在某些情况下如果出现一对多的情况要怎么办呢?实际的情况中比如说是订单,在订单中会有商品列表需要到商品表中去查询,如果在代码中使用for循环的方式调用数据库,相信我速度会很慢,还会被说。

<!--主表结果通过resultMap返回-->
    <resultMap id="conDetailResultMap" type="com.lflweb.entity.mar.MarMemConDetail">
        <result column="conid" property="conid" jdbcType="VARCHAR"/>
        <result column="deliverstatus" property="deliverstatus" jdbcType="VARCHAR"/>
        <association property="address" javaType="com.lflweb.entity.ctm.CtmAddress">
            <id column="addressid" property="addressid" jdbcType="VARCHAR"/>
            <result column="addcontact" property="addcontact" jdbcType="VARCHAR"/>
            <result column="addmobile" property="addmobile" jdbcType="VARCHAR"/>
        </association>
    <!--这部分对应的是javabean中的List<javabean>,它也需要对应一个存储过程或是SQL语句-->
        <collection property="memconList" select="GetMemDetails" column="conid" ofType="com.lflweb.entity.mar.MarMemDetail">
        </collection>
    </resultMap>

    <resultMap id="conDetailsResultMap" type="com.lflweb.entity.mar.MarMemDetail">
        <result column="traceid" property="traceid"/>
        <result column="skuid" property="skuid"/>
    </resultMap>

    <!-- 订单主表存储过程 -->
    <select id="GetMemDetail" resultMap="conDetailResultMap" statementType="CALLABLE" parameterType="com.lflweb.entity.mar.MarMemConDetail">
        {call
        P_Get_XjcMarConDetail(
        #{search.search,javaType=String,jdbcType=VARCHAR}
        )}
    </select>

    <!-- 订单商品SQL语句 -->
    <select id="GetMemDetails" resultMap="conDetailsResultMap" parameterType="String">
        select a.*,b.* from t_mar_mem_detail a LEFT JOIN t_prd_sku b on a.skuid=b.skuid where traceid = #{conid}
    </select>

最后更新于