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

男娘i 2022-07-12 07:44 521阅读 0赞

Mybatis高级应用-嵌套查询

  1. 关联-association
  2. 集合-collection

    • 本文示例领域模型:
      订单:订单编号、顾客编号,总金额
      顾客:顾客编号、顾客姓名、顾客手机号
      货物:货物编号、货物名称、货物单价
      订单详情:订单、货物列表、货物总数量

id=”embed_dom” src=”https://www.processon.com/embed/58a54ca6e4b0669d99428ac1">

  • 接口:OrderDetail getOrderDetail(String orderNo);
    获取订单详情信息,其中订单详情关联了一个订单(1:1),订单详情还关联了一个货物列表(1:n)

mybatis的实现:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.sf.shiva.oms.query.mapper.OrderMapper">
  4. <resultMap id="OrderDetailResultMap" type="com.sf.shiva.oms.query.dto.OrderDetail">
  5. <result property="totalGoodsCount" column="totalGoodsCount" jdbcType="INTEGER" />
  6. <association property="order" javaType="com.sf.shiva.oms.query.model.Order" column="order_no" select="selectOrder">
  7. <id property="orderNo" column="order_no" jdbcType="INTEGER"/>
  8. <result property="customerNo" column="customer_no" jdbcType="INTEGER"/>
  9. <result property="amount" column="amount" jdbcType="DOUBLE"/>
  10. </association>
  11. <collection property="goodsList" ofType="com.sf.shiva.oms.query.model.Goods" select="selectGoods" column="order_no">
  12. </collection>
  13. </resultMap>
  14. <select id="getOrderDetail" parameterType="java.lang.String" resultMap="OrderDetailResultMap">
  15. select sum(rel.goods_quantity) as totalGoodsCount, order_no
  16. from order_goods_rel rel where
  17. rel.order_no=#{orderNo ,jdbcType=VARCHAR}
  18. </select>
  19. <select id="selectGoods" parameterType="java.lang.String" resultType="com.sf.shiva.oms.query.model.Goods" resultMap="GoodsResultMap">
  20. select g.* from goods g, order_goods_rel rel where rel.order_no=#{orderNo} and rel.goods_no=g.goods_no
  21. </select>
  22. <resultMap id="GoodsResultMap" type="com.sf.shiva.oms.query.model.Goods">
  23. <id column="goods_no" jdbcType="INTEGER" property="goodsNo" />
  24. <result column="goods_name" jdbcType="VARCHAR" property="goodsName" />
  25. <result column="goods_price" jdbcType="DOUBLE" property="goodsPrice" />
  26. </resultMap>
  27. <select id="selectOrder" resultType="com.sf.shiva.oms.query.model.Order">
  28. select order_no orderNo, customer_no customerNo, amount from t_order t where t.order_no = #{orderNo}
  29. </select>
  30. </mapper>
  • 需要注意的点:
  1. 1. 主查询语句的idgetOrderDetail,它的ResultMap就是对应了OrderDetailResultMapidOrderDetailResultMap,其包含了一个人result,一个association,一个collection
  2. 2. 特别注意ResultMap中的元素是有顺序的。
  3. 如果遇到报错“元素类型为 resultMap 的内容必须匹配 constructor?,id\*,result\*,association\*,collection\*,discriminator?)””。那么就是元素的顺序写的不对,需要按照顺序来写,没有的元素可以省略。
  4. 3. result元素对应了OrderDetail中的totalGoodsCountassociation对应了ordercollection对应了goodsList
  5. 4. ResultMap中,凡column皆指数据库字段,凡property皆指Domain实体类的属性。二者为对应关系,但是应理解区别,通常数据库字段为全小写字母加分隔符,类的属性为驼峰样式。如:order\_no,对应 orderNo
  6. 5. **特别的一点:** associationcollection的属性中的column,对应的是主查询语句中的查询结果列,如果主查询语句中没有写as别名,那么就是数据库列名。如果写了别名,那么这里的column就要跟别名保持一致。比如,在上面的`getOrderDetail`sql中,写了`select sum(rel.goods_quantity) as totalGoodsCount, order_no from`,那么查询的结果列就是totalGoodsCountorder\_no,则关联的associationcollection中的column,就要写order\_no。如果查询的sql中写的是`order_no as orderNo`,那么associationcollection中的column就应该写成orderNo。(测试时发现,写成OrderorderNo都可以)。
  7. 6. 详情可以参考mybatis官网:[http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html\#Result\_Maps][http_www.mybatis.org_mybatis-3_zh_sqlmap-xml.html_Result_Maps]

发表评论

表情:
评论列表 (有 0 条评论,521人围观)

还没有评论,来说两句吧...

相关阅读