MyBatis-一对多,多对一的映射关系(上)

MyBatis很好的简化了关于Dao层的开发,本文将讲述MyBatis中如何对数据库表之间一对多和多对一关系的开发

首先建立一个简单的对应数据库表结构

teacher表中字段

student表中字段

一对多

一对多是我们经常会遇见的情况,在SQL语句中我们常用子查询的方式来解决!

例如:现在我要 查询所有的学生信息,以及对应老师的信息

SELECT s.id,s.name,t.name FROM student s,teacher t WHERE s.tid = t.id;

查询结果为:

在MyBatis我们如何进行编写

package com.qyh.pojo;

import lombok.Data;

@Data
public class Teacher {
    private int id;
    private String name;
}
package com.qyh.pojo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;

    //学生要关联一个老师
    private Teacher teacher;

}

因为我们需要的学生关联老师所以在学生的实体类中添加一个老师类的属性。

接下来编写Mapper以及对应的xml,在xml中我们用两种方式来进行解决

第一种利用子查询来编写

        我们先查询所有学生,再根据所查询出的学生tid来查询老师

第二种利用结果嵌套来编写

        我们对子查询的查询结果进行嵌套映射,让结果映射到Student中Teacher属性对应的属性字段

package com.qyh.dao;

import com.qyh.pojo.Student;

import java.util.List;

public interface StudentMapper {

    //查询所有的学生信息,以及对应老师的信息
    public List<Student> getStudent();
    public List<Student> getStudent2();

}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.qyh.dao.StudentMapper">

    <!-- 方法二
        按照结果嵌套处理
    -->
    <resultMap id="StudentTeacher2" type="Student">
        <!--数据的字段取了别名 所以为sid-->
        <result column="sid" property="id"/>
        <result column="sname" property="name"/>
        <association property="teacher" javaType="Teacher">
            <result column="tname" property="name"/>
        </association>
    </resultMap>
    <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>

    <!--=========================================================-->

    <!-- 方法一
     思路:
        1.查询所有的学生
        2.根据查询出来的学生的tid,寻找相应的老师! 子查询
    -->
    <resultMap id="StudentTeacher" type="Student">
        <id column="id" property="id"/>
        <id column="name" property="name"/>
        <!--复杂的属性需要单独处理   对象:association   集合:collection
        -->
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
    <select id="getStudent" resultMap="StudentTeacher">
        select * from student
    </select>
    <select id="getTeacher" resultType="Teacher">
        select * from teacher where id = #{id}
    </select>

</mapper>

在进行复杂查询的时候,当我们一个类里边的属性是一个实体类而不是简单的普通数据,我们需要对该数据进行分析,在ResultMap当中有两个对复杂属性的处理  如果该属性是一个对象我们使用:association   如果该属性是一个集合我们使用:collection

<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>

 property="":该属性在实体类中的名称  column="":对应数据库字段的名称  javaType="":在java中的类型  select="":所要进行的查询

结果:

第一种:

第二种:

这里我们会发现一个奇怪的现象 在第一种方法下,查询出来的teacher的id=1,而第二种teacher的id=0,我也没弄清楚这个情况的原因,希望各位大佬知道的可以在下边留言。我暂且觉得在一对多的情况下我更喜欢采用第二种方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值