zoukankan      html  css  js  c++  java
  • Ibatis组合键关联查询

    在使用Ibatis时,会经常遇到关联查询,一般有两种解决方案:

    1. 使用代码进行关联查询
    2. 使用Ibatis配置文件进行关联查询

    使用代码进行关联查询不作解释,本次主要是针对Ibatis配置文件进行关联查询进行探究,如发现有问题或不当之处还请不吝赐教!

    对于Ibatis配置文件进行关联查询,下面举一个例子进行辅助描述:

    假设有这样一个需求:某一网站页面需要展示文章,文在每篇文章后都会跟随一些相关的商品,同一商品可关联任意类别文章。

    分析该需求可得知,文章一张表,相关商品一张表,相关商品和文章的关联在一张关联表中,因此当文章去查找相关商品时,就无法单单根据文章的主键id去查询,而是要根据关联表中文章的id和相关商品id来进行判断。

    相关代码如下:

    文章DO:

     1   class Article{
     2         /**
     3          * 主键id
     4          */
     5         private Long id;
     6         /**
     7          * 文章标题
     8          */
     9         private String title;
    10         /**
    11          * 文章类别
    12          */
    13         private Integer type;
    14         /**
    15          * 文章商品关联集合
    16          */
    17         private List<articleCommodityRel> articleCommmodityRels;
    18 }

    文章商品关联DO:

     1    class articleCommodityRel{
     2         /**
     3          * 主键id
     4          */
     5         private Long id;
     6         /**
     7          * 商品id
     8          */
     9         private Long commodityId;
    10         /**
    11          * 文章类别
    12          */
    13         private Integer articleType;
    14     }

    为简单起见,省略相关商品DO以及文章商品关联sqlmapping,其中文章商品关联sqlmapping中根据商品id关联查询相关商品,即查询到一条关联记录,该条记录就会携带一条相关商品记录,具体不再赘述

    我们知道,如果是只有一种文章对应多种商品,只需要根据文章主键id即可查询,对应sqlmapping如下:

    1 <resultMap class="Article" id="baseResult">
    2     <result property="id" column="id" />
    3     <result property="articleCommmodityRels" column="id" select="commdityAss.findById"/>
    4 </resultMap>

    那么遇到上述情况时:需要传递多个参数进行关联查询。又该如何书写呢?

    在Ibatis中,有一个组合键的概念,利用它即可达到我们的目的,假设需要用文章id和类别联合查询,首先将结果放出来:

    1 <resultMap class="Article" id="baseResult">
    2     <result property="id" column="id" />
    3     <result property="type" column="type" />
    4     <result property="articleCommodityRels" column="{id=id,type=type}" select="commodityAss.findByIdAndType"/>
    5 </resultMap>    

    没错,只是将result的column属性由column="id"改为column="{id=id,type=type}"即可,这样Ibatis就会将这两个字段对应的值传递给commodityAss.findByIdAndType对应的sql语句,从而实现了组合键查询,其具体形式为:{param1=column1,param2=column2,…,paramN=columnN}

    其中需要注意的是,param1..N是可以不用写的,只要对应查询语句的变量即可,但建议写上,因为这样即保证了可读性又保证了对应的参数值的匹配正确性,另外使用{}表示传递过去的是个Map类型,这一点很重要,column="id"和column="{id=id}"是完全不同的

    当然,并不建议都使用Ibatis配置进行关联查询,如上案例,假如只是查询一篇文章,那影响还不大,但是一旦是大量文章查询(如100),那么一次sql查询是查询100篇文章,获得每一篇文章后又会根据文章的主键id和类别进行关联查询,1+N问题(101次查询,1:查询100篇文章,100:查询相关商品)由此产生,所以这种查询的使用要根据实际使用场景来确定是否使用。

  • 相关阅读:
    Educational Codeforces Round 92
    练习
    03 并查集(带权,分类) 树状数组 线段树
    02 动态规划 LIS LCS
    05 矩阵优化 (斜率优化等待补)
    01 STL 打表 二分查找
    AtCoder Beginner Contest 174
    Codeforces Round #660 (Div. 2)
    PCHMI工控组态开发视频教程
    分享一款免费的工控组态软件(PCHMI)
  • 原文地址:https://www.cnblogs.com/liaochong/p/ibatis_group_search.html
Copyright © 2011-2022 走看看