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

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

  1. 查询的时候join子表,而后交由mybatis拼装mybatis

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

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

这三种方案各有问题:code

  1. 第一种方案有两个缺陷:1) 作分页查询的时候不许,2) 若是关联子表多,笛卡尔积会很是大get

  2. 第二种方案会出现1+N次查询,发起的sql数量会很是恐怖效率

  3. 第三种方案看似提高了第一次查询的效率,可是若是在循环里get lazy property,那么和第二种方案没有什么区别select

所以若是对性能上有要求, 须要由咱们本身去拼装一对多的集合,处理的办法是:把主表的ID都收集起来, 发起一次性查询把全部子表的数据抓取出来,而后人工拼装。这样发起的查询数量就是1+1。循环

相关文章
相关标签/搜索