[SSM] 一对多和多对一处理

本文详细介绍了在MyBatis中如何处理多对一和一对多的关系映射。通过修改实体类和配置Mapper文件,展示了如何实现学生与老师、老师与学生的关联查询。包括查询嵌套和结果嵌套两种处理方式,以获取学生及对应老师、老师及所有学生的信息。
摘要由CSDN通过智能技术生成

数据库中有两个表

  • Teacher表:id,name(姓名)
  • Student表:id,name(姓名),tid(老师的id)

新建两个实体类,学生和老师

@Data //GET,SET,ToString,有参,无参构造
public class Teacher {
   private int id;
   private String name;
}
@Data
public class Student {
   private int id;
   private String name;
}

一、多对一处理

多对一的理解:

  • 多个学生对应一个老师
  • 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师!

修改学生实体类如下,给学生添加一个老师属性

@Data
public class Student {
   private int id;
   private String name;
   //多个学生可以是同一个老师,即多对一
   private Teacher teacher;
}

当我们需要获取所有学生及对应老师的信息时,首先肯定是获取所有学生的信息,然后根据获取的学生信息的老师ID来获取该老师的信息,这样学生的结果集中应该包含老师,所以数据库中我们一般使用关联查询来处理

给StudentMapper接口增加方法

//获取所有学生及对应老师的信息
public List<Student> getStudents();

再去编写对应的Mapper文件

1. 按查询嵌套处理

<select id="getStudents" resultMap="StudentTeacher">
    select * from student
   </select>
   <resultMap id="StudentTeacher" type="Student">
       <!--association关联属性,用于一对一和多对一
       		property 学生pojo类中的属性名
       		javaType 属性类型
       		column 在多的一方的表中的列名,可以近似理解为外键-->
       <association property="teacher"  column="tid" javaType="Teacher" select="getTeacher"/>
   </resultMap>
   <!--
   这里的id=#{id}
   		第一个id指的是和上面的column对应的属性名,教师表的id和学生表的tid对应
   		第二个id,column只有一个属性的时候,可以写任何名字
   -->
   <select id="getTeacher" resultType="teacher">
      select * from teacher where id = #{id}
   </select>

2. 按结果嵌套处理

<select id="getStudents2" 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">
   <id property="id" column="sid"/>
   <result property="name" column="sname"/>
   <!--关联对象property 关联对象在Student实体类中的属性-->
   <association property="teacher" javaType="Teacher">
       <result property="name" column="tname"/>
   </association>
</resultMap>

二、一对多处理

一对多的理解:

  • 一个老师拥有多个学生

  • 如果对于老师这边,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)!

修改老师实体类如下,给老师添加学生集合属性

@Data
public class Teacher {
   private int id;
   private String name;
   //一个老师多个学生
   private List<Student> students;
}

给TeacherMapper接口增加方法

//获取指定老师,及老师下的所有学生
public Teacher getTeacher(int id);

再去编写对应的Mapper文件

1. 按查询嵌套处理

<select id="getTeacher2" resultMap="TeacherStudent2">
select * from teacher where id = #{id}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
   <result property="id" column="id"/><!--这一句一定要加,不然获取的id值都是0-->
   <!--集合的话,使用collection!
           JavaType和ofType都是用来指定对象类型的
               JavaType是用来指定pojo中属性的类型
               ofType指定的是映射到list集合属性中pojo的类型
           column是一对多的外键 , 写的是一的主键的列名-->
   <collection property="students" javaType="ArrayList" ofType="Student" column="id" select="getStudentByTeacherId"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
  select * from student where tid = #{id}
</select>

2. 按结果嵌套处理

   <select id="getTeacher" resultMap="TeacherStudent">
      select s.id sid, s.name sname , t.name tname, t.id tid
      from student s,teacher t
      where s.tid = t.id and t.id=#{id}
   </select>

   <resultMap id="TeacherStudent" type="Teacher">
       <result  property="name" column="tname"/>
       <collection property="students" ofType="Student">
           <result property="id" column="sid" />
           <result property="name" column="sname" />
           <result property="tid" column="tid" />
       </collection>
   </resultMap>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值