Mybatis resultMap中一对多和多对一的关系

假设有两张表 一张学生表和一张教师表 表的具体结构如下:
在这里插入图片描述
学生表的tid作为外键和教师表的id进行关联 这样学生和教师之间就有了奇妙的联系了。 对于学生来说 他们和教师之间的关系应该是 多对一 的关系 多个学生对应一个教师 但是对于教师而已 他们和学生之间的关系就应该是 一对多 的关系 一个教师对应多个学生嘛 对于这两种情况 我们分别来讲解一下

多对一的关系:
我们设计实体类的时候 应该是这样设计的
学生的实体类
教师的实体类
从类的结构上来看 我们在学生的实体类中定义了一个教师的成员 这样就把学生和教师关联了起来 是一种一对多的关系 这和我们在数据库表中分析的结果是一样的 所以我们这样设计是合理的 。
那当我们通过Mybatis使用sql查询的时候 我们会得到什么结果呢 我们写一条sql语句 查询所有的学生信息

<select id="getAllStudent2" resultType="student">
        select * from student
    </select>

但是返回的结果是这样的
在这里插入图片描述
我们注意 学生中的teacher属性的值为 null 这是为什么呢,因为我们student表中的字段有 id,name,tid。其中id和实体类中的id相对应 name和实体类中的name相对应 ,但是表中的字段 tid 它是varchar属性的 而类中的teacher属性确实一个Teacher类 他们两个无法对应上 所以查找不到 会出现null的情况。 说到底 就是表中的列名和实体类中的属性名不一致 所以才会造成这样的问题 为了解决这种问题 我们需要对这个查询进行一个映射 resultMap就是用来解决这一方法的 我们来看这样一个sql语句

<select id="getAllStudent" resultMap="studentTeacher">
        select s.id sid,s.name sname,t.id tid,t.name tname
        from student s inner join teacher t on s.tid = t.id
    </select>

    <resultMap id="studentTeacher" type="student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="teacher">
            <result column="tid" property="id"/>
            <result property="name" column="tname"/>
        </association>
    </resultMap>

这里我们使用了sql中的连表查询 查询teacher表中id和student表中tid一样的情况 就是查询出了Student类中的teacher属性的值 。 然后我们使用resultMap这样一个标签 对表中列名和实体类中字段名不一致的情况进行相应的映射 resultMap标签中的id对应我们select标签中的resultMap名 type是指我们select标签返回的类型
resultMap标签中的 result标签 指的是将表中的列名和类中属性不一致的情况进行相应的处理操作 result标签中的property指的是类中的属性名 column指的是表中列的名字 如果这两者不一致 那么我们就使用一个result标签将他们进行映射 这样原本名字不一致的问题就可以解决了 这里需要注意的是 如果实体类中相应的属性的类型不是基本类型而是一个对象的引用的话 (例如我们这种情况) 如果是多对一的关系 我们就使用一个association标签对其进行映射 association标签中的property还是一样是类中属性的名字 javaType顾名思义就是他的Java类型 然后我们再在association标签中 对这个属性的值进行映射 这样就可以解决实体类与表中字段名不一致并且实体类中包含一个对象的情况了。 (听起来有点复杂 需要仔细想一下)
通过这样的操作我们就可以把学生对应的教师也一并找到了。
在这里插入图片描述
这就是多对一关系的处理 一对多关系和多对一处理的流程几乎一致 只是不是用association标签来处理实体类中的对象引用 因为一对多它的实体类中的属性类型是一个List列表 所以这里我们使用collection标签

<select id="getAllTeacher" resultMap="teacherStudent">
        select t.id tid,t.name tname,s.id sid,s.name sname,s.tid stid
        from teacher t inner join student s on t.id = s.tid
    </select>
    <resultMap id="teacherStudent" type="teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <collection property="students" ofType="student">
            <result column="sid" property="id"/>
            <result column="sname" property="name"/>
            <result column="stid" property="tid"/>
        </collection>
    </resultMap>

collection标签中和association标签不一样的地方在于 他是oftype 而association标签是 javatype 其他的都差不多 这样就完成了我们的工作了。
在这里插入图片描述

总之 一对多的情况 resultMap中使用collection标签 多对一的情况使用 association标签 collection标签中使用oftype定义类型 而 association标签使用Javatype定义类型 。

发布了53 篇原创文章 · 获赞 0 · 访问量 1962

猜你喜欢

转载自blog.csdn.net/XXuan_/article/details/104087144
今日推荐