0


[MySql]实现多表查询-一对一,一对多

多表关联关系的分类

既然数据库是存储项目中的数据的,项目中的数据主要是类型创建的对象,项目中类型和类型之间是有关系的,数据库中怎么体现出来?
不论是生活中,还是抽象出来的软件中,描述生活中的多个类型之间的关系,总结如下:

  • 一对一关系
  • 一对多关系、多对一关系
  • 多对多关系

举例

学生和成绩就是一对多 成绩和学生就是一对一

一个学生可以有多个成绩 多个成绩属于同一个学生

人和身份证号就是一对一

一个人只能有一个身份证号 一个身份证号只能属于一个人

老师和学生之间就是多对多

一个学生可以被多个老师教过 一个老师可以交多个学生

特例
一个学生,他都只能有一个班级。
所以Mybatis就把多对一(多个学生对一个班级)看成了一对一。

mybatis中的多表查询:

示例:学生和班级
     一个班级可以有多个学生
     一个学生只能属于一个班级(多个学生也可以属于同一个班级)
 步骤:
     1、建立两张表:学生表,班级表
         让学生表和班级表之间具备一对多的关系:需要使用外键在学生表中添加
     2、建立两个实体类:学生实体类和班级实体类
         让学生和班级的实体类能体现出来一对多的关系
     3、建立两个配置文件
         学生的配置文件
         班级的配置文件
     4、实现配置:
         当我们查询学生时,可以同时得到学生所对应的班级信息
         当我们查询班级时,可以同时得到班级的所属学生信息

数据库准备

student(学生表)

class(班级表)

项目目录

实体类(有参无参getset方法以及tostring)

项目目录

一对一查询(多对一)

需求:
查询所有学生,同时还要获取当前学生的所属班级信息。
注意:
因为一个学生信息只能提供一个班级,所以从查询学生信息出发关联查询班级信息为一对一查询。如果从班级信息出发查询每个班级下的学生信息则为一对多查询,因为一个班级可以有多个学生。

方式一:(xml文件映射)

创建StudengMapper接口

对应的xml映射文件

注意:接口名与xml映射文件名一致

多对一/一对一使用<association>标签

在编写Sql语句注意:

实现查询学生信息时,也要查询学生所对应的班级信息。

select * from student inner join class on student.classid=class.classid

查询结果:

方式二:(注解映射)

创建studentMapper接口 与对应ClassMapper所对应的方法

public interface StudentMapper {

    
    //多对一/一对一映射 @One(Select="能得到属性对象的反射字符串  包.类.方法名",fetchType)
    //联查两表 要有跟那个表对应的属性 classid去映射Class表的单查
    @Results({
        @Result(column = "classid",property ="classid" ),
        @Result(column = "classid",property = "bj",
        one = @One(select = "com.ape.mapper.ClassMapper.findClassByclassid"))
    })
    @Select("select * from student")
    public List<Student> findAllStudent();
    
    
    @Select("select * from student where classid=#{classid}")
    public Student findStudentByClassid(int classid);
}
public interface ClassMapper {

    
    
    
    @Select("select * from Class where classid=#{classid}")
    public Class findClassByclassid(int classid);
}

注意:

@Results只修饰下面所遇见的第一个方法,别的方法需要映射需要@ResultMap(id="")去调用

查询结果:

一对多查询(一对多)

需求:
查询所有班级,同时还要获取当前班级的所属学生信息。
注意:
班级信息和他的学生信息为一对多关系,并且查询过程中如果班级没有学生信息,此时也要将学生信息查询出来,我们想到了左外连接查询比较合适。

实体类注意:

班级里有多个学生对应需要有学生集合的属性。

方式一:(xml文件映射)

创建ClassMapper接口

package com.ape.mapper;

import java.util.List;

import com.ape.bean.Class;

public interface ClassMapper {

    
    public List<Class> findAllClass();
}

同名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.ape.mapper.ClassMapper">

<resultMap type="Class" id="Class_Stu_Map">
    <result column="classid" property="classid"/>
    <result column="classname" property="classname"/>
    <collection property="slist" ofType="Student">
    <result column="sid" property="sid"/>
    <result column="sname" property="sname"/>
    <result column="birthday" property="birthday"/>
    <result column="ssex" property="ssex"/>
    <result column="classid" property="classid"/>
    </collection>
</resultMap>

 <select id="findAllClass" resultMap="Class_Stu_Map">
 select * from class left join student on student.classid=class.classid
</select>

</mapper>

注意:接口名与xml映射文件名一致

一对多/多对多使用<collection>标签

在编写Sql语句注意:

实现查询班级信息时,也要查询班级所对应的学生信息。

select * from class left join student on student.classid=class.classid

查询结果:

方式二:(注解映射)

创建ClassMapper接口 与对应StudentMapper所对应的方法

package com.ape.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.ape.bean.Class;

public interface ClassMapper {

    //一对多 用many=@Many(select="包名.类名.方法名")
    
    @Results({
        @Result(column = "classid",property = "classid"),
        @Result(column = "classid",property = "slist",
        many = @Many(select="com.ape.mapper.StudentMapper.findStudentByClassid"))
    })
    
    
    @Select("select * from Class")
    public List<Class> findAllClass();
package com.ape.mapper;

import java.util.List;

import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.ape.bean.Student;

public interface StudentMapper {

    
    @Select("select * from student where classid=#{classid}")
    public Student findStudentByClassid(int classid);
}

注意:

一对多 用many=@Many(select="包名.类名.方法名")

查询结果:

以上就是Mybatis的多表关联查询(一对一、一对多)的全部内容。

看完如果对你有帮助,感谢点赞支持!
如果你是电脑端的话,看到右下角的 “一键三连” 了吗,没错点它[哈哈]

在这里插入图片描述

加油!

共同努力!

标签: 大数据

本文转载自: https://blog.csdn.net/weixin_67588007/article/details/125473424
版权归原作者 Ran959 所有, 如有侵权,请联系我们删除。

“[MySql]实现多表查询-一对一,一对多”的评论:

还没有评论