项目中经常会使用到一对多的查询场景,但是PageHelper对这种嵌套查询的支持不够,如果是一对多的列表查询,返回的分页结果是不对的
解决办法
-
使用mybatis提供的嵌套查询解决问题
缺点:消耗的资源多,性能低,每一次查询都需要循环遍历一次任务id
优化:在service层做判断,如果传入的page对象为空,我们就默认查询全部,传入page对象,
我们就做分页查询,在service实现层和dao层有不同的方法对应<resultMap id="baseMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="nickname" column="nickname"/> <result property="accessToken" column="access_token"/> <result property="headImg" column="head_img"/> <result property="phone" column="phone"/> <result property="email" column="email"/> <result property="status" column="status"/> <result property="createTime" column="create_time"/> <result property="updateTime" column="update_time"/> <result property="version" column="version"/> </resultMap> <!--property:对应JavaBean中的字段--> <!--ofType:对应JavaBean的类型--> <!--javaType:对应返回值的类型--> <!--column:对应数据库column的字段,不是JavaBean中的字段--> <!--select:对应查询子集的sql--> <!--extends: 可以实现存在继承关系的两个类实体的映射。extends填父类的resultMap。--> <resultMap id="userMap" type="User" extends="baseMap"> <!-- column="id" 对应bSelectAll parameterType对应的参数查询 id 的值对应 user的id--> <collection property="roles" column="id" ofType="Role" select="bSelectAll"> <id property="id" column="id"/> <result property="nickname" column="nickname"/> </collection> </resultMap> <select id="bSelectAll" resultType="Role" parameterType="Integer"> SELECT r.id, r.nickname, u.id as uid FROM user u, role r, user_role ur WHERE u.id=ur.uid AND r.id=ur.rid AND u.id = #{id} </select> <select id="selectAll" resultMap="userMap"> SELECT * FROM user </select>