ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

mybatis-03 多对一,一对多的处理

2021-01-07 10:01:57  阅读:145  来源: 互联网

标签:03 name int 老师 private tid mybatis 一对 id


多对一处理

举例:
  • 对学生而言是多个学生对一个老师

  • 对老师而言是一个老师关联多个学生

    标签:适用于一对一和多对一
    适用于多对多和一对多

    • 思路:

      • 编写实体类
      @Data //GET,SET,ToString,有参,无参构造
      public class Teacher{
      private int id;
      private String name;
      }
      
      @Data
      public class Student {
      private int id;
      private String name;
      //多个学生可以是同一个老师,即多对一
      private Teacher teacher;
      }
      
      • 编写接口

        public interface StudentMapper {
        		// 查询所有的学生信息和老师的信息
             List<Student> getStudents();
        }
        
        public interface TeacherMapper {
        }
        
      • 编写对应的Mapper.xml文件

      <?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.kuang.mapper.StudentMapper">
        
      </mapper>
      
      <?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.kuang.mapper.TeacherMapper">
      </mapper>
      

      多对一: 查询 :多个学生对应一个老师

      按查询嵌套处理

      <?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.kuang.mapper.StudentMapper">
      <!--
      	需求:获取所有学生及对应老师的信息
      思路:
      	1. 获取所有学生的信息
      	2. 根据获取的学生信息的老师ID->获取该老师的信息
      	3. 思考问题,这样学生的结果集中应该包含老师,该如何处理呢,数据库中我们一般
      使用关联查询?
      	1. 做一个结果集映射:StudentTeacher
      	2. StudentTeacher结果集的类型为 Student
      	3. 学生中老师的属性为teacher,对应数据库中为tid。
      多个 [1,...)学生关联一个老师=> 一对一,一对多
      4. 查看官网找到:association – 一个复杂类型的关联;使用它来处理关联查
      询
      -->
      <select id="getStudents" resultMap="StudentTeacher">
      	select * from student
      </select>
      <resultMap id="StudentTeacher" type="Student">
      	<!--association关联属性 property属性名 javaType属性类型 column在多的一方的表中的列名-->
      	<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
      </resultMap>
      <!--
      	这里传递过来的id,只有一个属性的时候,下面可以写任何值
      	association中column多参数配置:
      	column="{key=value,key=value}"
      	其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的
      	字段名。
      -->
      <select id="getTeacher" resultType="teacher">
      		select * from teacher where id = #{id}
      </select>
      </mapper>
      

      按结果嵌套处理

      <!--
      按查询结果嵌套处理
      思路:
      1. 直接查询出结果,进行结果集的映射
        多对一
      -->
      <!--按照结果嵌套查询-->
              <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">
      
              <result property="id" column="sid"/>
              <result property="name" column="sname"/>
              <!--association: 关联属性 : 用于多对一,一对一 -->
              <association property="teacher" javaType="Teacher">
                  <result property="name" column="tname"/>
              </association>
      
          </resultMap>
      
      • 按照查询进行嵌套处理就像SQL中的子查询
      • 按照结果进行嵌套处理就像SQL中的联表查询

一对多的处理:

​ 举例:一个老师拥有对个学生

​ 就是一对多: 可以理解为老师的类下拥有一个学生的集合

实例类:

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

按结果嵌套处理

// 获取指定老师下的所有学生,以及老师的信息
    Teacher getTeacher2(@Param("tid") int id);
<!--按结果嵌套查询-->
    <select id="getTeacher2" 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 = #{tid}
    </select>
    <resultMap id="TeacherStudent" type="Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <!--复杂的属性,我们需要单独处理 对象: association  集合: collection
            javaType : 指定的属性的类型
                集合中的泛型信息,用 ofType 获取
        -->
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>

Teacher getTeacher3(@Param("tid") int id);
<!--按照查询嵌套-->
    <select id="getTeacher3" resultMap="TeacherStudent2">
        select * from teacher where  id = #{tid}
    </select>
    <resultMap id="TeacherStudent2" type="Teacher">
        <collection property="students" column="id" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId"/>

    </resultMap>
    <select id="getStudentByTeacherId" resultType="Student">
        select * from student where tid = #{tid}
    </select>
  1. 关联-association (多对一,一对一)

  2. 集合-collection (一对多,多对多)

  3. 所以association是用于一对一和多对一,而collection是用于一对多的关系

  4. JavaType和ofType都是用来指定对象类型的 JavaType是用来指定pojo中属性的类型 ofType指定的是映射到list集合属性中pojo的类型。

标签:03,name,int,老师,private,tid,mybatis,一对,id
来源: https://www.cnblogs.com/yppaopao/p/14244857.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有