Mybatis多对一复杂查询两种实现方法

提出问题:如何查询出所有学生以及学生对应的老师信息

第一种解决办法:按照查询嵌套处理

思路:
1,先查询出所有学生信息。
2,再通过查询出来的学生信息的tid,寻找对应的老师信息。

先写学生接口
public interface StudentMapper {
    //查询所有学生以及对应的老师信息
    List<Student> getStudent();
}
学生接口配置文件中,先执行所有信息的查询,老师同理
 <select id="getStudent" resultMap="Student">
        select * from student
    </select>
     <select id="getTeacher" resultType="Teacher">
        select * from teacher where id=#{id}
    </select>

这个时候student执行查询的结果,老师信息会为null
于是采用结果集映射的方法解决:

<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
            如果是集合,就用:collection
-->
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>

    <select id="getTeacher" resultType="Teacher">
        select * from teacher where id=#{id}
    </select>

学生表中的字段id,name是能够对应到实体类中的。但是tid对应的是一个类对象teacher,所以用到association映射,对应到数据库中的tid.
要注意的是,在association标签中,还需要加上javaType的属性(需要映射的是teacher对象,所以上面的JavaType为Teacher类)和查询老师信息的执行语句。

执行查询:能够将老师信息查询出来

在这里插入图片描述

第二种解决办法:按照结果嵌套处理

先将连表查询的sql语句写出来

select s.id sid,s.name sname,t.name tname from student s,teacher,t where s.tid = t.id

在student,teacher这两张表中,当学生表中的tid等于老师表中的id相等时,查询出学生id,学生姓名,学生关联的老师的名字。


    <select id="getStudent2" resultMap="StudentTeacher2">
        select s.id sid,s.name sname,t.name tname
        from student s,teacher t
        where s.tid = t.id;
    </select>

<resultMap id="StudentTeacher2" type="Student">
    <result property="id" column="sid"/>
    <result property="name" column="sname"/>
    <association property="teacher" javaType="Teacher">
        <result property="name" column="tname"/>
    </association>
</resultMap>

最上面的select查询语句查询出来了tname,即老师的名字,然后通过ResultMap将Teacher实体类中的name字段映射到Student中。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值