Mybatis关联查询

本文介绍了Mybatis中多对一和一对多的关系映射,包括情景分析、数据库字段设计和Java实体类的处理。详细讨论了多对一关联和一对一关联的实现方式,如子查询、联表查询以及使用VO类。同时,讲解了一对多集合查询的方法,如联表查询和分布查询策略。

多对一和一对多

情景

一个班里的一个老师和班里的全部学生之间的关系就是一对多或多对一

  • 多个学生对应一个老师
  • 对于老师而言,可以用**集合(collection)**来描述这种关系。一个老师对应着多个学生形成的集合 【一对多】
  • 对于学生而言,可以用**关联(association)**来描述这种关系。多个学生通过一个老师关联在了一起 【多对一】

多对一,一对一【关联】

数据库字段

在这里插入图片描述

Java实体类

public class Student{
    private int id;
    private String name;
    private Teacher teacher;
}
public class Teacher{
    private int id;
    private String name;
}
  • 方式一:子查询

    <select id="getStudent" resultMap="StudentTeacher">
        select * from student
    </select>
    <resultMap id="StudentTeacher" type="Student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" resultType="Teacher">
        select * from  teacher where id=#{id}
    </select>
    

在这里插入图片描述

  • 方式二:联表查询

       <!--    按照结果嵌套处理-->
    <select id="getStudent1" resultMap="StudentTeacher1">
       SELECT  student.id sid,student.name sname,teacher.name tname,teacher.id tid 
       FROM student  
       LEFT JOIN teacher  on student.tid = teacher.id
    </select>
    <resultMap id="StudentTeacher1" type="com.qcby.entity.Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="com.qcby.entity.Teacher">
            <result property="id" column="tid"/>
            <result property="name" column="tname"/>
        </association>
    </resultMap>
    

在这里插入图片描述

  • 方式三:联表查询,借助VO类

    public class Student{
        private int id;
        private String name;
    }
    
    public class StudentVO{
        private int id;
        private String name;
        private String teacherName;
    }
    
    public class Teacher{
        private int id;
        private String name;
    }
    
    <select id="getStudent1" resultType="StudentVO">
        SELECT  student.id sid,student.name sname,teacher.name tname
        FROM student
        LEFT JOIN teacher  on student.tid = teacher.id
    </select>
    

在这里插入图片描述

一对多【集合】

Java实体类

public class Student{
    private int id;
    private String name;
    private Teacher teacher;
}
public class Teacher{
    private int id;
    private String name;
    private List<Student> student
}

通过老师的id查询老师信息,其中包括该老师的所有学生

方式一:联表查询

sql语句

SELECT t.id tid,t.name tname,s.id sid,s.name sname  
from teacher t 
left JOIN student s 
on t.id =s.tid
WHERE tid=1

xml

<select id="getTeacherById" resultMap="Teacher">
    SELECT t.id tid,t.name tname,s.id sid,s.name sname
    from teacher t
    left JOIN student s
    on t.id =s.tid
    WHERE t.id=#{id}
</select>
<!--老师的封装规则-->
<resultMap id="Teacher" type="com.qcby.model.Teacher">
    <result property="id" column="tid"/>
    <result property="name" column="tname"/>
    <!--
        property="student" java类中的字段名
        ofType="com.qcby.model.Student"集合中元素的类型
    -->
    <collection property="student" ofType="com.qcby.model.Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
    </collection>
</resultMap>

在这里插入图片描述

方式二:分布查询

<select id="getTeacherByIdStep" resultMap="TeacherStep">
    select * from teacher
</select>
<resultMap id="TeacherStep" type="com.qcby.model.Teacher">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="student" select="com.qcby.dao.TeacherDao.getStudentByTeacherId" column="{ tid = id }">
    </collection>
</resultMap> 

<!--根据老师的id找到所有的学生-->
<select id="getStudentByTeacherId" resultType="com.qcby.model.Student">
    select * from student where tid=#{tid}
</select>

在这里插入图片描述

当传递多个参数时可以

{ 待传入的参数名1=列名1,待传入的参数名2=列名2}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值