mybatis Association标签 分两次sql查询时,参数传递问题

直接给个例子,该例子来自:http://www.cnblogs.com/xdp-gacl/p/4264440.html

<!-- 
37     方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
38         SELECT * FROM class WHERE c_id=1;
39         SELECT * FROM teacher WHERE t_id=1   //1 是上一个查询得到的teacher_id的值
40     -->
41      <select id="getClass2" parameterType="int" resultMap="ClassResultMap2">
42         select * from class where c_id=#{id}
43      </select>
<!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
45      <resultMap type="me.gacl.domain.Classes" id="ClassResultMap2">
46         <id property="id" column="c_id"/>
47         <result property="name" column="c_name"/>
48         <association property="teacher" column="teacher_id" select="getTeacher"/>
49      </resultMap>
50      
51      <select id="getTeacher" parameterType="int" resultType="me.gacl.domain.Teacher">
52         SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
53      </select>

这个例子中查询分了两次,其中第二条查询语句:

SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}

中的id,如果是一个参数,名字随便取,写成

SELECT t_id id, t_name name FROM teacher WHERE t_id=#{yutao}

也是可以的。
原因参考:http://cczakai.iteye.com/blog/1276722
但是如果,需要传递的是多个参数。
片段一

    <select id="selectOrderAllotByOrderId" parameterType="Integer" resultMap="findHandlerId">
        select a.id oa_id,
                schoolBranchId,
                schoolCourseId,
                channelId
        from t_order_allot a left join t_sys_user b on a.handlerId = b.id
        where orderId = #{orderId}
    </select>

片段二

    <resultMap type="com.zexiaoqiao.admin.model.OrderAllotInfo" id="findHandlerId">
        <id property="id" column="oa_id"/>
        <association property="courseInfo" 
        column="{id=channelId,courseId=schoolCourseId}" select="getSchool"/>
    </resultMap>

片段三

<select id="getSchool" resultType="com.zexiaoqiao.admin.model.GeneralCourseInfo" parameterType="map">
        <if test="id ==1">
            SELECT
            gs.id AS schoolId,
            gs.name AS schoolName,
            gc.id AS courseId,
            gc.title AS courseName,
            1 AS channelId,
            "国际学校" AS channelName
            FROM t_guoji_school gs INNER JOIN t_guoji_course gc ON gs.id = gc.school_id
            where gc.id = #{courseId}
        </if>
</select>

片段三中 两个参数 courseId与id,是希望从片段二中传过来。这里就需要对
association中column多参数配置

<association property="courseInfo" 
        column="{id=channelId,courseId=schoolCourseId}" select="getSchool"/>

{key=value},column中其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的字段名。

参考链接:http://blog.csdn.net/jbgtwang/article/details/17548829

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MyBatis中的"association"标签也可以用于传递常量参数。在使用"association"标签,可以在其内部使用"resultMap"标签来定义一个中间结果集,然后在中间结果集中定义常量参数。 例如,假设有一个订单(Order)对象和一个客户(Customer)对象,它们之间建立了关联关系,其中一个订单对象可能需要传递一个常量参数(例如订单的状态),可以在"association"标签内部使用"resultMap"标签定义一个中间结果集,然后在中间结果集中定义一个常量参数。 示例代码如下: ``` <resultMap id="orderResultMap" type="Order"> <id property="id" column="id"/> <association property="customer" column="customer_id" select="findCustomerById"> <resultMap id="customerResultMap" type="Customer"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="phone" column="phone"/> </resultMap> </association> <result property="status" column="status"/> </resultMap> <select id="findOrderById" resultMap="orderResultMap"> SELECT o.id, o.customer_id, o.status, c.name, c.phone FROM orders o INNER JOIN customers c ON o.customer_id = c.id WHERE o.id = #{id} </select> <select id="findCustomerById" resultMap="customerResultMap"> SELECT id, name, phone FROM customers WHERE id = #{id} </select> ``` 在上面的示例代码中,定义了一个包含常量参数的Order对象,其中常量参数为"status",可以在中间结果集中定义这个常量参数,并在"association"标签中通过select属性调用"findCustomerById"查询方法来获取Customer对象。这样就可以通过"association"标签传递常量参数了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值