`
helpbs
  • 浏览: 1165345 次
文章分类
社区版块
存档分类
最新评论

解决Ibatis一对多映射n+1问题

 
阅读更多
背景: 一个存在一对多的逻辑关系,比如视频和视频标签(严格来讲是多对多的关系),目前想取出一些视频和该视频包含的标签,传统的做法往往会存在n+1问题,对性能有些影响

在IBatis中如何做?马上进入实战

配置文件如下:
<sqlMap namespace="search">

<
resultMapid="video-map"class="xx.index.dataset.VideoVO"groupBy="videoId">
<resultproperty="videoId"column="videoId"/>
............................
<resultproperty="tagList"resultMap="search.tag-map"/>


</resultMap>

<resultMapid="tag-map"class="java.util.HashMap">
<resultproperty="tagName"column="tagName"/>
</resultMap>

<statementid="query"resultMap="video-map"parameterClass="xx.index.dataset.DataSetVO">
selectv.videoIdasvideoId,
.............
vtg.nameastagname,
............

fromvideov
innerjoinvideotagrelvtgrelonv.videoId=vtgrel.videoId
innerjoinvideotagvtgonvtgrel.tagId=vtg.tagId
...........



</statement>
........
</sqlMap>

我们采用多表关联的方式用一个sql取出所有数据,然后定义我们映射规则(见上面的 resultMap段),从规则中可以看出,我们将查出来的结果根据videoId进行分组,然后相同videoId的标签会归入video的tagList,最后你会得到一个 video列表,其中每个video又包含一个相关的标签列表,整个过程一句sql搞定 避免了n+1问题
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics