目的
在使用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. 利用其完成分页。