我是靠谱客的博主 自觉篮球,最近开发中收集的这篇文章主要介绍Mybatis的多对一与一对多查询 Mapper.xml 讲解Mybatis、谢谢观看~,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • Mybatis、
    • 一、数据库搭建
    • 二、多对一查询
      • **1.创建Student实体类**
      • **2.创建Teacher实体类**
      • **3.StudentMapper构建**
      • **4. StudentMapper.xml 讲解(只展示核心代码部分)**
        • **4.1 按照查询嵌套处理**
        • **4.2 按照结果嵌套处理**
    • 三、一对多
      • 1. 创建Student实体类
      • 2. 创建Teacher实体类对象
      • 3. TeacherMapper构建
      • 4. TeacherMapper.xml讲解(只展示核心代码部分)
        • 4.1 按照结果嵌套处理
        • 4.2 按照查询嵌套处理
  • 谢谢观看~

Mybatis、

一、数据库搭建

1、学生表:
student表
1、老师表:
在这里插入图片描述

二、多对一查询

1.创建Student实体类

//@Data 是Lombok的注解 用来生成get、set、toString等方法
@Data
public class Student {
    private int id;
    private String name;
    private Teacher teacher;
}

2.创建Teacher实体类

@Data
public class Teacher {
    private int id;
    private String name;
}

3.StudentMapper构建

public interface StudentMapper {
    //查询所有学生信息
    List<Student> getStudent();
    
    List<Student> getStudent2();
}

4. StudentMapper.xml 讲解(只展示核心代码部分)

4.1 按照查询嵌套处理

    <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 = #{tid};
    </select>
<!--
 思路:
    1. 查询所有的学生信息
    2. 根据查询出来的学生的tid寻找特定的老师 (子查询)
-->

过程分析:

  • 书写select 标签:指定id,这里使用结果集(StudentTeacher)处理
  • 定义结果集:实体类相同的属性可不写,复杂的属性,我们需要使用association ,定义association 的select属性
  • 定义association 的select方法:根据查询出来的tid列名属性去嵌套一个子查询 通过tid去查询teacher姓名

Student实体类中的teacher属性是一个复杂类型 我们需要使用 association(关联)
association讲解

association – 一个复杂类型的关联;许多结果将包装成这种类型
嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用

简单来说,就是可以使用association 去绑定一个复杂类型(在resultMap 结果集中嵌套使用)
属性:

  • property:实体类属性 这里是Student 的 teacher属性。

  • column:查询出来的列名 这里是 student表中的 tid 。

  • javaType:是指property的java类型(没有起别名的情况下需要写全路径)

  • select:嵌套的查询语句(自定义)。

小结: 先查询出student表中的所有数据 再通过student.tid的值书写子查询语句。

4.2 按照结果嵌套处理

<select id="getStudent2" resultMap="StudentTeacher2" >
        select s.id sid , s.name sname, t.name tname , t.id tid
        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="id" column="tid"/>
            <result property="name" column="tname"/>
        </association>
    </resultMap>

过程分析:

  1. 书写select 标签:指定id,这里使用结果集(StudentTeacher)处理
  2. 定义结果集:实体类相同的属性可不写,复杂的属性,我们需要使用association
  3. 定义association的结果集映射

小结:
直接通过sql语句的连表查询,查询出需要的值 进行结果集映射(这里sql已取别名
这样association中只需要进行Student的teacher属性的结果集映射即可。

三、一对多

1. 创建Student实体类

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

2. 创建Teacher实体类对象

@Data
public class Teacher {
    private int id;
    private String name;
    private List<Student> students;
}

3. TeacherMapper构建

public interface TeacherMapper {
    //用过id获取老师信息
    Teacher getTeacher(@Param("tid") int id);
    //用过id获取老师信息2
    Teacher getTeacher2(@Param("tid") int id);
}

4. TeacherMapper.xml讲解(只展示核心代码部分)

4.1 按照结果嵌套处理

<!--按照结果嵌套处理-->
    <select id="getTeacher" parameterType="int" 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 tid = #{tid}
    </select>
    <resultMap id="TeacherStudent" type="Teacher" >
        <result property="id" column="tid"/>
        <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. 书写select 标签:指定id,这里使用结果集(TeacherStudent)处理
  2. 定义结果集:实体类相同的属性可不写,复杂的属性,我们需要使用collection
  3. 定义collection的结果集映射

collection属性:

  • property:实体类属性 这里是Teacher的 students属性。
  • ofType:泛型的信息的java类型
  • javaType:是指property的java类型(这里是集合的java类 可不写)

4.2 按照查询嵌套处理

    <select id="getTeacher2" parameterType="int" resultMap="TeacherStudent2" >
        select * from teacher where id = #{tid};
    </select>

    <resultMap id="TeacherStudent2" type="teacher">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="students" column="id" javaType="ArrayList" ofType="student" select="getStudent"/>
    </resultMap>
    <select id="getStudent" parameterType="int" resultType="student">
        select * from student where tid = #{tid};
    </select>

过程分析:

  1. 书写select 标签:指定id,这里使用结果集(TeacherStudent)处理
  2. 定义结果集:实体类相同的属性可不写,复杂的属性,我们需要使用collection
  3. 定义collection的结果集映射:自定义select属性(子查询方法)
    具体与association相似

谢谢观看~

~写完了哦 有错误请通知我呢~

最后

以上就是自觉篮球为你收集整理的Mybatis的多对一与一对多查询 Mapper.xml 讲解Mybatis、谢谢观看~的全部内容,希望文章能够帮你解决Mybatis的多对一与一对多查询 Mapper.xml 讲解Mybatis、谢谢观看~所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部