资讯专栏INFORMATION COLUMN

Mybatis处理一对多关系时的性能考虑

fengxiuping / 2003人阅读

Mybatis对于处理一对多的情况有三种解决方案:

查询的时候join子表,然后交由mybatis拼装

查询的时候不join子表,另外发起select去抓取子表数据

和第二种类似,只不过利用fetchType=lazy来延缓抓取的时机

这三种方案各有问题:

第一种方案有两个缺陷:1) 做分页查询的时候不准,2) 如果关联子表多,笛卡尔积会非常大

第二种方案会出现1+N次查询,发起的sql数量会非常恐怖

第三种方案看似提升了第一次查询的效率,但是如果在循环里get lazy property,那么和第二种方案没有什么区别

因此如果对性能上有要求, 需要由我们自己去拼装一对多的集合,处理的办法是:把主表的ID都收集起来, 发起一次性查询把所有子表的数据抓取出来,然后人工拼装。这样发起的查询数量就是1+1。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70072.html

相关文章

  • 面试官都会问的Mybatis面试题,你会这样回答吗?

    摘要:最终能和面试官聊的开心愉快投缘的叫面霸。能够与很好的集成提供映射标签,支持对象与数据库的字段关系映射提供对象关系映射标签,支持对象关系组件维护。使用可以有效的防止注入,提高系统安全性。 showImg(https://segmentfault.com/img/bVbsSlt?w=358&h=269); 一、概述 面试,难还是不难?取决于面试者的底蕴(气场+技能)、心态和认知及沟通技巧。...

    seanHai 评论0 收藏0
  • Mybatis常见面试题

    摘要:执行没有,批处理不支持,将所有都添加到批处理中,等待统一执行,它缓存了多个对象,每个对象都是完毕后,等待逐一执行批处理。 Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是预编译处理,${}是字符串替换。 使用#{}可以有效的防止...

    liuchengxu 评论0 收藏0
  • MyBatis 级联

    摘要:数据库关系模型中有一对一一对多关系首先建立如下表继续用最经典的学生管理系统建表模型图如图所示学生表为中心学生证表和其为一对一关系学生表和课程表为一对多一对一关系因为上图中学生和学生关系为一对一关系由于是数据库的一对一关系那么对应的中也应该是 数据库关系模型中有一对一,一对多,关系,首先建立如下表 继续用最经典的学生管理系统 建表 模型图如图所示showImg(https://segme...

    genedna 评论0 收藏0
  • 通过项目逐步深入了解Mybatis<三>

    摘要:场合常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用将每一条记录映射到中,在前端页面遍历中是即可。作用将关联查询信息映射到一个对象中。 相关阅读: 1、通过项目逐步深入了解Mybatis 2、 通过项目逐步深入了解Mybatis 本项目所有代码及文档都托管在 Github地址:https://github.com/zhisheng17/myb...

    khlbat 评论0 收藏0

发表评论

0条评论

fengxiuping

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<