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

本文介绍了如何在MyBatis中进行多表关联查询,包括一对一和一对多关系的实现。内容涵盖从数据库设计、实体类创建到XML和注解映射的方式,详细解析了查询过程并提供了示例代码。

目录

多表关联关系的分类

mybatis中的多表查询:

数据库准备

?项目目录

?一对一查询(多对一)

方式一:(xml文件映射)

查询结果:

?方式二:(注解映射)

?一对多查询(一对多)

方式一:(xml文件映射)

?方式二:(注解映射)


多表关联关系的分类

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

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

举例

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

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

人和身份证号就是一对一

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

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

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

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

mybatis中的多表查询:

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

数据库准备

student(学生表)

class(班级表)

项目目录

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

项目目录

一对一查询(多对一)

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

方式一:(xml文件映射)

创建StudengMapper接口

对应的xml映射文件

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

多对一/一对一使用标签

在编写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映射文件名一致

一对多/多对多使用标签

在编写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的多表关联查询(一对一、一对多)的全部内容。

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

在这里插入图片描述

加油!

共同努力!

最后

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值