Mybatis中如何实现一对一,一对多的关联查询?

news/2024/5/19 19:14:35/文章来源:https://blog.csdn.net/m0_67942533/article/details/125382052

MyBatis实现一对一、一对多关联查询一般有两种方式:

方式一:sqlMapper配置文件

一对一:在resultMap标签中使用 association 标签

一对多:在resultMap 标签中使用collection 标签

方式二:注解

一对一:在@Results 注解中的@Result注解中使用@One注解

一对多:在@Results 注解中的@Result 注解中使用@Many注解

接下来,我们一起来看看这两种方式分别是怎么用代码实现的?

这里需要用到学生student和班级class两张表,如下图所示:

 

 一、一对一查询(sqlMapper配置文件

1. 需求

一个学生相对应一个专属班级,所以学生Student班级Banji是一对一的关系;

查询需求:查询一个学生,与此同时查询出该学生所属的班级信息(用sqlMapper的方式)

2. 创建Student和Banji实体类

Student.java

public class Student {private int sid;private String sname;private Date birthday;private String ssex;private int classid;// 外部属性private Banji bj;// 省略无参、有参、get、set、toString方法}

Banji.java 

public class Banji {private int classid;private String classname;//  省略无参、有参、get、set、toString方法}

3. 创建StudentMapper接口

public interface StudentMapper {//定义方法public List<Student> findAllStudent();	}

4. 配置 StudentMapper.xml

PS:查询的返回值类型使用的resultMap,和上面resultMap标签中的id名必须保持一致

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ape.mapper.StudentMapper"><!-- 手动映射column:数据表的字段名property:java中实体类的属性--><resultMap type="Student" id="Student_Class_Map"><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"/><association property="bj"><result column="classid"  property="classid"/><result column="classname"  property="classname"/></association>		</resultMap><!--一对一查询--><select id="findAllStudent" resultMap="Student_Class_Map">select * from studentinner join class on student.classid=class.classid</select></mapper>

5. 测试 Test

public class Test01 {public static void main(String[] args) {SqlSession sqlSession = DaoUtil.getSqlSession();StudentMapper sm = sqlSession.getMapper(StudentMapper.class);//一对一查询List<Student> slist = sm.findAllStudent();for (Student s:slist) {System.out.println(s);}//释放资源DaoUtil.closeSource(sqlSession);}

输出结果为:

  

二、一对一查询(注解

1. 需求

一个学生相对应一个专属班级,所以学生Student班级Banji是一对一的关系;

查询需求:查询一个学生,与此同时查询出该学生所属的班级信息(用注解的方式)

2. 创建Student和Banji实体类

Student.java

public class Student {private int sid;private String sname;private Date birthday;private String ssex;private int classid;// 外部属性private Banji bj;// 省略无参、有参、get、set、toString方法}

Banji.java 

public class Banji {private int classid;private String classname;//  省略无参、有参、get、set、toString方法}

3. 创建StudentMapper接口

public interface StudentMapper {//学生对班级一对一,做映射
@Results({@Result(column = "classid",property = "classid"),@Result(column = "classid",property = "bj",one=@One(select ="com.ape.mapper.BanjiMapper.findBanjiByClassid" ))	
})@Select("select * from student")
public List<Student> findAllStudent();}

4. 创建BanjiMapper接口

public interface BanjiMapper {//学生对班级,找班级对象@Select("select * from class where classid=#{v}")public Banji findBanjiByClassid(int classid);}

5. 测试 Test

public class Test01 {public static void main(String[] args) {SqlSession sqlSession = DaoUtil.getSqlSession();StudentMapper sm = sqlSession.getMapper(StudentMapper.class);List<Student> slist = sm.findAllStudent();for(Student s:slist) {System.out.println(s);}DaoUtil.closeSource(sqlSession);}
}

输出结果为: 

 

三、一对多查询(sqlMapper配置文件

1. 需求

一个班级对应多个学生,所以班级Banji学生Student是一对多的关系;

查询需求:查询一个班级,与此同时查询出该班级所有的学生信息(用sqlMapper的方式)

2. 创建Banji和Student实体类

Banji.java 

public class Banji {private int classid;private String classname;//外部属性private List<Student> slist;//  省略无参、有参、get、set、toString方法}

Student.java

public class Student {private int sid;private String sname;private Date birthday;private String ssex;private int classid;// 省略无参、有参、get、set、toString方法}

3. 创建BanjiMapper接口

public interface BanjiMapper {//班级对学生,一对多public List<Banji> findAllBanji();}

4. 配置BanjiMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.ape.mapper.BanjiMapper"><resultMap type="Banji" id="Class_Student_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="findAllBanji" resultMap="Class_Student_Map">select * from classleft join student on class.classid=student.classidorder by class.classid</select></mapper>

5. 测试 Test

public class Test01 {public static void main(String[] args) {SqlSession sqlSession = DaoUtil.getSqlSession();BanjiMapper bm = sqlSession.getMapper(BanjiMapper.class);List<Banji> blist = bm.findAllBanji();for (Banji b:blist) {System.out.println("班级编号"+b.getClassid()+","+"班级名称"+b.getClassname());for(Student s:b.getSlist()) {System.out.println(s);}System.out.println("====================================");}//释放资源DaoUtil.closeSource(sqlSession);}
}

输出结果为:

 

四、一对多查询(注解

1. 需求

一个班级对应多个学生,所以班级Banji学生Student是一对多的关系;

查询需求:查询一个班级,与此同时查询出该班级所有的学生信息(用注解的方式)

2. 创建Banji和Student实体类

Banji.java 

public class Banji {private int classid;private String classname;//外部属性private List<Student> slist;//  省略无参、有参、get、set、toString方法}

Student.java

public class Student {private int sid;private String sname;private Date birthday;private String ssex;private int classid;// 省略无参、有参、get、set、toString方法}

3. 创建BanjiMapper接口

public interface BanjiMapper {//班级对学生一对多,做映射@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<Banji> findAllBanji();
}

4. 创建StudentMapper接口

public interface StudentMapper {//班级对学生一对多,找学生对象@Select("select * from student where classid=#{v}")public Student findStudentByClassid(int classid);}

5. 测试 Test

public class Test01 {public static void main(String[] args) {SqlSession sqlSession = DaoUtil.getSqlSession();BanjiMapper bm = sqlSession.getMapper(BanjiMapper.class);List<Banji> blist = bm.findAllBanji();for (Banji b:blist) {System.out.println("班级编号"+b.getClassid()+","+"班级名称"+b.getClassname());for(Student s:b.getSlist()) {System.out.println(s);}System.out.println("====================================");}//释放资源DaoUtil.closeSource(sqlSession);}
}

输出结果为: 

其实,日常这样的例子也不少:

一对一:

一个人对应一张身份证

一张身份证对应一个人

一个课程对应一个老师

一个员工对应一个部门

……

一对多:

一个用户可以有多个订单

一个用户可以有账户

一个学生可以学多个课程

一个球队有多个球员

……

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

看完如果对你有帮助,点赞支持一下呀!
 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_88879.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL使用简单教程

本文通过演示如何使用MySQL客户机程序创建和使用一个简单的数据库&#xff0c;允许连接到MySQL服务器、运行查询和查看结果。 mysql也可以在批处理模式下使用&#xff1a;预先将查询放在文件中&#xff0c;然后告诉mysql执行文件的内容。 要查看mysql提供的选项列表&#xff0c…

解决MySQL插入不了中文数据问题

&#x1f388;目录&#x1f388; 原因⁉ 具体解决方法 1️⃣创建数据库时设置字符集为utf8 2️⃣修改数据库配置文件&#xff08;比较麻烦&#xff09; 我们使用MySQL可能会遇到加入中文报错的情况&#xff0c;如下。 报错&#xff1a;非法的字符值 放入 ‘name’ 为什么…

MySQL 复制架构

MySQL 复制架构 第一节 概述 1.1 数据拓展 热备份&#xff1a;数据库在运行的过程中&#xff0c;对数据进行备份操作。相对的&#xff0c;还有冷备份&#xff0c;冷备份需要停机&#xff0c;然后对数据进行备份操作。多活&#xff1a;所谓的多活&#xff0c;就是让数据库机器…

习惯了微信聊天,利用WebSocket手动实现个聊天功能怎么样?

1.背景 基于项目需求&#xff0c;最近需要实现一个简单的聊天功能。日常生活中&#xff0c;大家对于聊天也习以为常&#xff0c;微信、QQ等软件也经常用到&#xff0c;其实我们也可以引入一些第三方的sdk包等去实现&#xff0c;也可以利用WebSocket通信协议去手动实现简单的聊…

【蓝桥杯】第十三届蓝桥杯省赛 AK 攻略 —— C++ B组全真题超详细剖析

&#x1f384;目录&#x1f33c;写在前面&#x1f33b; A题 --- 九进制转十进制&#x1f337; 题目描述&#x1f337; 解题思路&#x1f337; 代码编写&#x1f33b; B题 --- 顺子日期&#x1f337; 题目描述&#x1f337; 解题思路&#x1f337; 代码编写&#x1f33b; C题 --…

92年程序员发帖晒薪资称自己很迷茫,网友:老弟你可以了

当下&#xff0c;是一个“向钱看&#xff0c;向厚赚”的社会。快节奏的生活下&#xff0c;家庭、工作各方面压力很容易使年轻人陷入迷茫和焦虑。 与其他行业相比&#xff0c;程序员的高薪让人羡慕。那么&#xff0c;对于那些真正达到这么多收入的人来说&#xff0c;他们是怎么…

Mysql安装包安装教程(亲测简单高效版)

Mysql安装包安装教程&#xff08;亲测简单高效版&#xff09;安装流程mysql安装SQLyog安装安装流程 mysql安装 1.下载mysql&#xff0c;官方地址&#xff1a;mysql官网 2.解压mysql安装包到任意目录下 3.新建my.ini文件 4.配置my.ini [mysqld] basedirD:\Program Files\J…

sql语法:详解DDL

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 目录一、DDL是什么&#xff1f;二、和数据库相关的DDL2.1 创建数据库2.2 删除数据库2.3 查看所有的数据库&#xff0c;当前用户登录后&#xff0c;可以看到哪些数据库2.4 查看某个数据库的详细定义2.5 修改数据库…

Windows系统GIT安装与GitHub远程仓库

文章目录Windows系统GIT安装Git是什么windows环境安装环境变量验证安装GitHub与远程仓库GitHub是什么GitHub账号注册创建本地SSH KeyGitHub接入本地电脑公匙创建个人远程库传送门Windows系统GIT安装 Git是什么 Git&#xff08;读音为/gɪt/&#xff09;是一个开源的分布式版本…

接口测试之Postman使用全指南(原来使用 Postman测试API接口如此简单)

目录 一、Postman背景介绍 二、Postman的操作环境 三、Postman重要提示&#xff1a; 四、什么是接口测试 五、接口测试工具 六、接口测试流程 七、接口测试执行 八、全局变量和环境变量 九、postman接口关联 十、postman动态参数 十一、postman断言 十二、postman用…

Unity --- Transform类

1.一个很有意思的事实是Transform类不仅用来管理游戏物体的位置缩放旋转&#xff0c;还用来管理游戏物体的父物体与子物体之间的关系 当游戏物体A的trasnform类a是游戏物体B的transform类b的父类的话&#xff0c;游戏物体A就是游戏物体B的父物体 2.如何访问脚本当前挂载的游戏…

手把手教你安装VSCode(附带图解步骤)

一、前端工具vscode 1.1、概述 前端开发是创建Web页面或app等前端界面呈现给用户的过程&#xff0c;通过HTML&#xff0c;CSS及JavaScript以及衍生出来的各种技术、框架、解决方案&#xff0c;来实现互联网产品的用户界面交互 [1] 。它从网页制作演变而来&#xff0c;名称上有…

如何用Python对股票数据进行LSTM神经网络和XGboost机器学习预测分析(附源码和详细步骤),学会的小伙伴们说不定就成为炒股专家一夜暴富了

前言 最近调研了一下我做的项目受欢迎程度&#xff0c;大数据分析方向竟然排第一&#xff0c;尤其是这两年受疫情影响&#xff0c;大家都非常担心自家公司裁员或倒闭&#xff0c;都想着有没有其他副业搞搞或者炒炒股、投资点理财产品&#xff0c;未雨绸缪&#xff0c;所以不少…

你单位数字化转型了吗?

写在前面&#xff1a;本文由Bing AI和我一起完成&#xff0c;它完成90%内容&#xff0c;致谢&#xff01; 1.数字化转型 近两年数字化转型在社会面搞得轰轰烈烈&#xff0c;数字化转型是指&#xff0c;利用新一代信息技术&#xff0c;构建数据的采集、传输、存储、处理和反馈的…

抓取某话题下指定时间内的微博数据,包括博文数据、评论信息等(可通过高级搜索筛选时间)

代码有点长&#xff0c;完整代码放在文章最后了。 最后的数据存储为了3个表&#xff0c;表的各字段如下&#xff1a; # csv头部 writer.writerow((话题链接, 话题内容, 楼主ID, 楼主昵称, 楼主性别, 发布日期,发布时间, 转发量, 评论量, 点赞量, 评论者ID, 评论者昵称,评论者…

低代码开发公司:用科技强力开启产业分工新时代!

实现办公自动化&#xff0c;是不少企业的共同追求。低代码开发公司会遵循时代发展规律&#xff0c;注入强劲的科技新生力量&#xff0c;在低代码开发市场厚积爆发、努力奋斗&#xff0c;推动企业数字化转型升级&#xff0c;为每一个企业的办公自动化升级创新贡献应有的力量。 一…

Matlab仿真,数字基带传输系统的设计实验报告

实验目的 1、提高独立学习的能力&#xff1b; 2、培养发现问题、解决问题和分析问题的能力&#xff1b; 3、学习Matlab 的使用&#xff1b; 4、掌握基带数字传输系统的仿真方法&#xff1b; 5、熟悉基带传输系统的基本结构&#xff1b; 6、理解奈奎斯特第一准则&#xff1b; 7…

echarts入门基础教程

目录 效果图 1.下载资源 新建项目 2.引入echarts 3.准备一个呈现图表的盒子 4.初始化echarts实例对象 5.准备配置项 6.将配置项设置给echarts实例对象 7.完整代码 效果图 1.下载资源 新建项目 去官网下载echarts压缩包&#xff0c;在包里的dist文件里找到echarts.min.j…

sql语法:事务的”那些事“

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 目录前言一、事务是什么&#xff1f;二、事务的特点三、如何提交事务和回滚事务?3.1 手动提交3.2 自动提交模式下开启事务3.3 注意事项四、事务的隔离级别4.1 模拟事务安全问题4.1.1 脏读问题模拟如下&#xff1…

【模块介绍】6×6矩阵键盘(硬件部分和扫描方式)

目录 概述 原理图 扫描方式 扫描法 单个按键按下 多个按键按下 行反转法 图解 成品 概述 矩阵键盘非常常见 就是利用键盘组成矩阵来减少IO口的使用 做成66的矩阵键盘可以使用12个IO口读取36个按键 矩阵键盘的优势在于成本低&#xff0c;无需其他芯片即可实现功能 …