mybatis关联查询基础----高级映射
阅读原文时间:2022年04月10日阅读:1

本文链接地址:mybatis关联查询基础----高级映射(一对一,一对多,多对多)

前言:

今日在工作中遇到了一个一对多分页查询的问题,主表一条记录对应关联表四条记录,关联分页查询后每页只显示三条记录,sql查询主表一条记录的时候,加上关联表后主表每一条记录都和关联表相对应,也就是说主表一条记录和关联表四条对应实际查出的是4条,怎么实现主表一条记录和关联表多条数据关联后查出后是一条信息呢?(下面一对多详解),所以想将关于mybatis多表查询的问题整理记录下来,希望大家多多补充指正。

0.首先是三个对象(为了方便理解用了三个比较简单的对象):

一、一对一(以学生和学生信息为例,通过学号关联):

1.1相对来说一对一就比较简单学生表通过学号和学生信息表关联

注意:如果主表和关联表有字段重复,则需要查询语句中起别名,将别名写入在column属性中,因为起别名是对数据库字段起的别名,所以要写在数据库所对应的的字段上,别名自动就和实体类对应了。

二、一对多(学生表和学生成绩表)

当关联查询的时候需要分成两种情况,分页和不分页

2.1一对多不分页(写法和一对一一样只是将association 标签换成了collection )

   <resultMap id="BaseResultMap" type="com.qike.coldKu.entity.Student">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="num" property="num" jdbcType="INTEGER"/>
            <!--一对一-->
        <association property="studentInfo" javaType="com.qike.coldKu.entity.StudentInfo">
            <result column="id" property="id" jdbcType="INTEGER"/>
            <result column="age" property="age" jdbcType="INTEGER"/>
            <result column="phone" property="phone" jdbcType="VARCHAR"/>
            <result column="stuNum" property="stuNum" jdbcType="VARCHAR"/>
        </association>
      <!--一对多不分页-->
        <collection property="stuGradeList" ofType="com.qike.coldKu.entity.StuGrade" >
            <result column="stuNum" property="stuNum" jdbcType="VARCHAR"/>
            <result column="Chinese" property="Chinese" jdbcType="VARCHAR"/>
            <result column="mathematics" property="mathematics" jdbcType="VARCHAR"/>
        </collection>
    </resultMap>

2.2一对多分页(如果关联查询涉及到分页,则需要用到myBatils的一种映射规则)

当用分页插件PageHelper.startPage(pageCurrent,pageSize);进行分页时用第一种方式发现返回的数据变少了,前言中大体提了下原因,下面写一下具体的解决方式:

 <resultMap id="BaseResultMap" type="com.qike.coldKu.entity.Student">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="num" property="num" jdbcType="INTEGER"/>
        <!--一对一-->
        <association property="studentInfo" javaType="com.qike.coldKu.entity.StudentInfo">
            <result column="id" property="id" jdbcType="INTEGER"/>
            <result column="age" property="age" jdbcType="INTEGER"/>
            <result column="phone" property="phone" jdbcType="VARCHAR"/>
            <result column="stuNum" property="stuNum" jdbcType="VARCHAR"/>
        </association>
        <!--一对多不分页-->
        <collection property="stuGradeList" ofType="com.qike.coldKu.entity.StuGrade" >
            <result column="stuNum" property="stuNum" jdbcType="VARCHAR"/>
            <result column="Chinese" property="Chinese" jdbcType="VARCHAR"/>
            <result column="mathematics" property="mathematics" jdbcType="VARCHAR"/>
        </collection>
        <!--一对多分页  这个地方没有属性的映射了  select指的是映射执行查询的名字   column指的是传参-->
        <collection property="coldkuExpands" ofType="com.qike.coldKu.entity.ColdkuExpand" select="queryList" column="num">

        </collection>
    </resultMap>

sql写法

<select id="queryUserInfo"  resultMap="BaseResultMap">
    select a.name as name,a.num from student as a
</select>
<select id="queryStuGrade"  resultType="com.qike.coldKu.entity.StuGrade" parameterType="int">
    select * from StuGrade  where stuNum = #{num}
</select>