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

这篇具有很好参考价值的文章主要介绍了[MySql]实现多表查询-一对一,一对多。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

多表关联关系的分类

mybatis中的多表查询:

数据库准备

 项目目录

 一对一查询(多对一)

方式一:(xml文件映射)

查询结果:

 方式二:(注解映射)

 一对多查询(一对多)

方式一:(xml文件映射)

 方式二:(注解映射)


多表关联关系的分类

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

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

举例

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

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

人和身份证号就是一对一

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

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

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

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

mybatis中的多表查询:

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

数据库准备

student(学生表)

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

 class(班级表)

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

 项目目录

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

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

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

 文章来源地址https://www.toymoban.com/news/detail-409260.html

 项目目录 

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

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

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

加油!

共同努力!

 

到了这里,关于[MySql]实现多表查询-一对一,一对多的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询

    MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询 MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询 com.github.dreamyoung mprelation 0.0.3.2-RELEASE 注解工具使用优缺点: 优点: 使用简单,通过在实体类上添加@OneToOne / @OneToMany / @ManyToOne / @ManyToM

    2024年01月20日
    浏览(57)
  • TCP实现一对一聊天

    一,创建类 二,类 1.ChatSocketServer类 2.ChatSocketClient类 三,结果(先服务  再客户)

    2024年02月03日
    浏览(47)
  • Elasticsearch实战(二十二)---ES数据建模与Mysql对比 一对一模型

    我们如何把Mysql的模型合理的在ES中去实现? 就需要你对要存储的数据足够的了解,及对应用场景足够的深入分析,才能建立一个合适的模型,便于你后期扩展 实体之间的关系: 一对一 模型 一对一(1:1):一个实体最多只能能另一个实体相关联,另一个实体如是。 例:一个只能

    2024年02月10日
    浏览(57)
  • Springboot + websocket 实现 一对一 单人聊天

    Springboot + websocket   实现 一对一 单人聊天 打开项目中的pom.xml,添加以下内容 配置websocke的endpoints 配置websocket的server @ServerEndpoint (value = \\\"/websocket/{username}\\\" ) 这句话 一定要注意, 这里 路径指定的是 页面需要访问的server的地址, {username} 表示需要传递参数 为刚刚的类 添加 属性

    2024年01月17日
    浏览(105)
  • java使用WebSocket实现一对一实时对话

    最近的项目中有实时对话的需求。这里也是查阅了很多的资料。使用webSocket实现一对一对话是最多的。 链接: https://pan.baidu.com/s/1Vn1e1qw7nRnU1_4R-4fcGg 提取码: qwer  逻辑讲解: 现在我们要给张三丰发一个你好,我们要解决下面两个问题 ·  这个你好怎么展示在我的窗口 ·   这个

    2023年04月09日
    浏览(53)
  • webrtc 入门第五章 一对一视频通话实现

    一、介绍 ​ 在前面的章节我们学习了如何操作本地的设备摄像头,麦克风等,学会了如何进行本地的流媒体操作如录制,下载,同步等。在第三第四章节学习了webrtc的一对一连接的原理和实操并且实现了简单的数据传输。 ​ 但是之前的实践在两个不同的设备之间还不能实现

    2023年04月11日
    浏览(41)
  • NRF24L01学习操作教程(二)——NRF实现一对一,一对多通讯

    上篇博客链接:https://blog.csdn.net/DIVIDADA/article/details/130599974?spm=1001.2014.3001.5501 以下单片机例程都是基于STM32 HAL库,在文档末尾,我会提供参考博客和源码程序的链接。 在CubeMx中配置单片机时钟、SPI通讯接口、NRF24L01接口等,并生成Keil工程 将NRF24L01的驱动程序的.c文件和.h文件

    2024年01月15日
    浏览(45)
  • 基于声网 SDK 实现 iOS 端的一对一视频通话

    在很多产品,加入实时视频通话已经不是新鲜事情了,尤其是近几年的疫情影响,个人公司国家对于实时音视频的需求一直在快速的增长。例如视频会议、社交应用、实时游戏,甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网视频 SDK 在 iOS 平台上实现一个

    2023年04月08日
    浏览(56)
  • uniapp集成腾讯即时通信IM,实现一对一聊天,支持文字、表情、语音、图片、视频

    原则 介绍 效果图 uniapp集成腾讯即时通信IM,实现一对一聊天,支持文字、 使用方式 将文件放到相应的位置 app配置 main.js 配置 pages.json 配置 GenerateTestUserSig.js配置SDKAPPID和SECRETKEY 安装 npm i 运行 下载源码 联系方式 查看文章

    2024年02月09日
    浏览(91)
  • [Django-04]一对一,一对多

    OneToOneField(),ForeignKey() 的参数如下 to 要连接的模型 to_field 要被关联的目标Model的字段 on_delete 删除主表(被关联的表,也就是非OneToOneField,ForeignKey的表)时,当前表怎么处理。 CASCADE-联动删除 PROTECT -抛出异常 SET_NULL-设为null SET_DEFAULT-设为预定义的默认值 SET-设置为指定的值

    2024年02月04日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包