Mybatis中如何实现一对一,一对多的关联查询?
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的多表关联查询(一对一、一对多)的全部内容。
看完如果对你有帮助,点赞支持一下呀!
Mybatis中如何实现一对一,一对多的关联查询?相关推荐
- (探讨)MyBatis中的N+1问题,多表关联查询效率高点还是多次单表查询效率高
MySQL多表关联查询效率高点还是多次单表查询效率高,为什么? https://blog.csdn.net/weixin_33869377/article/details/86265527 MyBat ...
- 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)
视频地址:http://edu.51cto.com/sd/be679 在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实 ...
- mybatis一对多关联查询_Mybatis 一对一、一对多的关联查询 ?
<mapper namespace="com.lcb.mapping.userMapper"> <!--association 一对一关联查询 --> &l ...
- MyBatis开发入门二:一对多连表查询
1. 步骤: (1). 加包 (2). 编写db.properties:编写conf.xml,将db.properties加入到conf.xml:引入别名 (3). 建立实体类 (4). 编写sql操 ...
- MyBatis中使用YEAR和MONTH方法获取时间查询参数的年和月
场景 实体类中的时间属性为 private Date tjny; 而在数据库中存储的是年和月两个字段. 需要将前端传递的时间参数分别获取年和月并对数据库中的数据进行筛选查询. 注: 博客: https ...
- mybatis plug 只查id_Mybatis一对多/多对多查询时只查出了一条数据
问题描述: 如果三表(包括了关系表)级联查询,主表和明细表的主键都是id的话,明细表的多条数据只能查询出来第一条/最后一条数据. 三个表,权限表(Permission),权限组表(Permission ...
- gorm一对一 一对多 多对多查询案例
Student -- IDCard -- Class -- Teacher
- mybatis 中针对指定区间内的时间的查询
https://blog.csdn.net/qq_38061755/article/details/79826532
- MyBatis 自关联查询省市区地区数据,一对多自关联查询
效果 SQL DROP TABLE IF EXISTS `yxt_area_code`; CREATE TABLE `yxt_area_code` (`id` int(10) NOT NULL AUT ...
最新文章
- 编程入门:准备学Python入门编程 为什么前辈一直劝我不行?
- https、SSL与数字证书介绍
- node环境下express路由,
- Visual Studio 2008/2010中Xaml开发格式设置技巧
- html运用以及工具
- [物理学与PDEs]第1章第4节 电磁能量和电磁动量, 能量、动量守恒与转化定律 4.3 电磁能量 (动量) 密度, 电磁能量流 (动量流) 密度...
- 采集练习(五) php 获得chrome扩展 微度新标签页 下的云壁纸(主要是美女壁纸)
- HTML5 Geolocation用来定位用户的位置。
- 判断web app是否从主屏启动
- rabbitmqBat常用指令
- php教程phpmeng,李炎恢PHP培训视频教程
- office之自定义尾注样式:中括号的应用
- Chromium浏览器扩展JS对象方法
- python随手记自动记账_随手记 怎么实现自动记账
- c调python类_C调和弦及组成音
- Matlab优化函数linprog的使用
- 刘强东怼天猫,是在陈述事实还是另有深意?
- 云计算运维工程师前景怎么样?
- docker健康检查
- 全国计算机二级Python考试题型
热门文章
- Fatal error: Cannot use 'Object' as class name as it is reserved in xxx/Object.php on line 77
- 为何美团、抖音都潜入社群团购?毫无疑问社群团购是大趋势。
- 从零到一黑苹果教程(10.15Catalina)
- 分析样布/面料的七个口诀
- ref与$res的关系
- printJS打印多页时出现第一页空白问题
- vue.js实现单选框、复选框和下拉框
- 浏览器插件:脚本注入插件Tampermonkey(油猴)
- html的国际标准智商测试,国际标准智商测试30题(含答案)
- 词嵌入向量WordEmbedding的原理和生成方法