当前位置:网站首页>[MySql]实现多表查询-一对一,一对多
[MySql]实现多表查询-一对一,一对多
2022-08-09 14:51:00 【Ran959】
目录
多表关联关系的分类
既然数据库是存储项目中的数据的,项目中的数据主要是类型创建的对象,项目中类型和类型之间是有关系的,数据库中怎么体现出来?
不论是生活中,还是抽象出来的软件中,描述生活中的多个类型之间的关系,总结如下:
- 一对一关系
- 一对多关系、多对一关系
- 多对多关系
举例:
学生和成绩就是一对多 成绩和学生就是一对一
一个学生可以有多个成绩 多个成绩属于同一个学生
人和身份证号就是一对一
一个人只能有一个身份证号 一个身份证号只能属于一个人
老师和学生之间就是多对多
一个学生可以被多个老师教过 一个老师可以交多个学生
特例:
一个学生,他都只能有一个班级。
所以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 {
//一对多 用[email protected](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);
}注意:
一对多 用[email protected](select="包名.类名.方法名")
查询结果:

以上就是Mybatis的多表关联查询(一对一、一对多)的全部内容。
看完如果对你有帮助,感谢点赞支持!
如果你是电脑端的话,看到右下角的 “一键三连” 了吗,没错点它[哈哈]
加油!
共同努力!
边栏推荐
- 注解与反射
- Dapp系统开发及智能合约部署技术
- C语言——指针和数组、指针数组和数组指针、指针和二维数组
- A wave of Versailles: assault by the ali interview guide, I've got nine of the Offer
- MySQL 原理与优化:Limit 查询优化
- docke安装mysql以及主从搭建(并且指定数据生成路径)
- docker安装单机版redis、集群版redis
- [Database] How does Sqlserver backup the database regularly and clear it regularly
- 多线程学习
- OpenCV - Matrix Operations Part 3
猜你喜欢

C语言程序设计笔记(浙大翁恺版) 第七章:函数

DMPE-PEG-Mal Maleimide-PEG-DMPE 二肉豆蔻酰磷脂酰乙醇胺-聚乙二醇-马来酰亚胺

Docker安装Redis详细步骤

DSPE-PEG-Aldehyde, DSPE-PEG-CHO, Phospholipid-PEG-Aldehyde MW: 1000

C语言程序设计笔记(浙大翁恺版) 第十三周:文件

A wave of Versailles: assault by the ali interview guide, I've got nine of the Offer

MySQL principle and optimization: Limit the query optimization

DBCO-PEG-DSPE, Phospholipid-Polyethylene Glycol-Dibenzocyclooctyne, Reaction Without Copper Ion Catalysis

docker安装单机版redis、集群版redis

机器学习--数学库--概率统计
随机推荐
STSW-LINK00x下载集合,百度云连接
C语言程序设计笔记(浙大翁恺版) 第十二周:程序结构
[Database] How does Sqlserver backup the database regularly and clear it regularly
Mind map FreeMind installation problems and simple use
C语言——void指针、NULL指针、指向指针的指针、常量和指针
Common sql records
ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions unless TOP, OFFSET, or FOR XML is also specified
ArcGIS在国土空间·城乡规划中的实战应用
Regular Expressions for Shell Programming
EasyExcel的应用
docker安装单机版redis、集群版redis
DSPE-PEG-Aldehyde, DSPE-PEG-CHO, Phospholipid-PEG-Aldehyde MW: 1000
【Qt5 + OpenGL】glPointSize(10); error: undefined reference to `__imp_glPointSize‘
Swift中的Error处理
MySQL principle and optimization: Limit the query optimization
MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据
C语言程序设计笔记(浙大翁恺版) 第三周:判断
OpenCV - Matrix Operations Part 3
shell------常用小工具,sort,uniq,tr,cut
技术分享 | 接口自动化测试如何处理 Header cookie