Mybatis高级应用-嵌套查询association和collection

Mybatis高级应用-嵌套查询
1. 关联-association
2. 集合-collection

  • 本文示例领域模型:
    订单:订单编号、顾客编号,总金额
    顾客:顾客编号、顾客姓名、顾客手机号
    货物:货物编号、货物名称、货物单价
    订单详情:订单、货物列表、货物总数量
id="embed_dom" src="https://www.processon.com/embed/58a54ca6e4b0669d99428ac1">
  • 接口:OrderDetail getOrderDetail(String orderNo);
    获取订单详情信息,其中订单详情关联了一个订单(1:1),订单详情还关联了一个货物列表(1:n)

mybatis的实现:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sf.shiva.oms.query.mapper.OrderMapper">

    <resultMap id="OrderDetailResultMap" type="com.sf.shiva.oms.query.dto.OrderDetail">
        <result property="totalGoodsCount" column="totalGoodsCount" jdbcType="INTEGER" />
        <association property="order" javaType="com.sf.shiva.oms.query.model.Order" column="order_no" select="selectOrder">
            <id property="orderNo" column="order_no" jdbcType="INTEGER"/>
            <result property="customerNo" column="customer_no" jdbcType="INTEGER"/>
            <result property="amount" column="amount" jdbcType="DOUBLE"/>
        </association>
        <collection property="goodsList" ofType="com.sf.shiva.oms.query.model.Goods"
        select="selectGoods" column="order_no">
        </collection>
    </resultMap>

    <select id="getOrderDetail" parameterType="java.lang.String" resultMap="OrderDetailResultMap">
    select sum(rel.goods_quantity) as totalGoodsCount, order_no 
    from order_goods_rel rel where 
    rel.order_no=#{orderNo ,jdbcType=VARCHAR}
    </select>

    <select id="selectGoods" parameterType="java.lang.String" resultType="com.sf.shiva.oms.query.model.Goods" resultMap="GoodsResultMap">
    select g.* from goods g, order_goods_rel rel where rel.order_no=#{orderNo} and rel.goods_no=g.goods_no
    </select>

    <resultMap id="GoodsResultMap" type="com.sf.shiva.oms.query.model.Goods">
        <id column="goods_no" jdbcType="INTEGER" property="goodsNo" />
        <result column="goods_name" jdbcType="VARCHAR" property="goodsName" />
        <result column="goods_price" jdbcType="DOUBLE" property="goodsPrice" />
    </resultMap>


    <select id="selectOrder" resultType="com.sf.shiva.oms.query.model.Order">
    select order_no orderNo, customer_no customerNo, amount from t_order t where t.order_no = #{orderNo}
    </select>
</mapper>
  • 需要注意的点:
    1. 主查询语句的id是getOrderDetail,它的ResultMap就是对应了OrderDetail。ResultMap的id是OrderDetailResultMap,其包含了一个人result,一个association,一个collection。
    2. 特别注意ResultMap中的元素是有顺序的。
      如果遇到报错“元素类型为 “resultMap” 的内容必须匹配 “constructor?,id*,result*,association*,collection*,discriminator?)””。那么就是元素的顺序写的不对,需要按照顺序来写,没有的元素可以省略。
    3. result元素对应了OrderDetail中的totalGoodsCount,association对应了order,collection对应了goodsList。
    4. 在ResultMap中,凡column皆指数据库字段,凡property皆指Domain实体类的属性。二者为对应关系,但是应理解区别,通常数据库字段为全小写字母加分隔符,类的属性为驼峰样式。如:order_no,对应 orderNo。
    5. 特别的一点: 在association和collection的属性中的column,对应的是主查询语句中的查询结果列,如果主查询语句中没有写as别名,那么就是数据库列名。如果写了别名,那么这里的column就要跟别名保持一致。比如,在上面的getOrderDetailsql中,写了select sum(rel.goods_quantity) as totalGoodsCount, order_no from,那么查询的结果列就是totalGoodsCount和order_no,则关联的association和collection中的column,就要写order_no。如果查询的sql中写的是order_no as orderNo,那么association和collection中的column就应该写成orderNo。(测试时发现,写成Order和orderNo都可以)。
    6. 详情可以参考mybatis官网:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值