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

目录

多表关联关系的分类

mybatis中的多表查询:

数据库准备

 项目目录

 一对一查询(多对一)

方式一:(xml文件映射)

查询结果:

 方式二:(注解映射)

 一对多查询(一对多)

方式一:(xml文件映射)

 方式二:(注解映射)


多表关联关系的分类

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

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

举例

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

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

人和身份证号就是一对一

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

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

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

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

mybatis中的多表查询:

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

数据库准备

student(学生表)

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

 class(班级表)

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

 项目目录

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

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

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

 

 项目目录 

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

 一对一查询(多对一)

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

方式一:(xml文件映射)

创建StudengMapper接口

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

 对应的xml映射文件

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

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

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

在编写Sql语句注意:

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

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

查询结果:

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

 方式二:(注解映射)

创建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="")去调用

查询结果:

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

 一对多查询(一对多)

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

实体类注意:

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

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

方式一:(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

查询结果:

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

 方式二:(注解映射)

创建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="包名.类名.方法名")

查询结果:

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

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

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

在这里插入图片描述

加油!

共同努力!

 

版权声明:程序员胖胖胖虎阿 发表于 2023年9月4日 上午6:24。
转载请注明:[MySql]实现多表查询-一对一,一对多 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...