mybatis中的1+n问题及解决

目的

在使用mybatis的过程中,由于1+n问题导致查询速度偏慢,此文在于记录如何去解决。

1+n问题

何为1+n问题,举例说明(该例子来源于mybatis文档,略微修改):

<resultMap id="blogResult" type="Blog">
  <result column="id" jdbcType="INTEGER" property="id" />
    ...
<collection property="posts" javaType="ArrayList" column="id" ofType="Post" select="selectPostsForBlog"/> </resultMap>

当我们使用这种嵌套查询的方式来映射sql查询的结果时,主表中每一行数据都需要调用selectPostsForBlog,本来一次查询能得到的结果,最后需要1+n次才能解决。

解决方案

将上面的结构修改为:

<resultMap id="blogResult" type="Blog">
  <result column="id" jdbcType="INTEGER" property="id" />
    ...
<collection property="posts" ofType="Post"/>
     <result column="post_xxx"/>
  </collection>
</resultMap>

不使用嵌套查询,在sql中用join操作,将数据一次查出;

后续问题及解决

如果使用到pageHelper的方式做分页查询时,上面的解决方案会导致分页出现问题。具体原因可以自己查看sql结果(因为collection是多对一映射,映射后的结果会小于pageSize);
解决方法是放弃使用pageHelper,在sql中增加 limit start, pageSize. 利用其完成分页。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值