06_一对多联表查询

1 需求

  • 一个班级中有多个学生
  • 根据classId查询对应的班级信息,包括学生信息和老师信息

2 创建表和数据

  1. CREATE TABLE student(
  2. s_id INT PRIMARY KEY AUTO_INCREMENT,
  3. s_name VARCHAR(20),
  4. class_id INT
  5. );
  6. INSERT INTO student(s_name, class_id) VALUES(‘xs_A‘, 1);
  7. INSERT INTO student(s_name, class_id) VALUES(‘xs_B‘, 1);
  8. INSERT INTO student(s_name, class_id) VALUES(‘xs_C‘, 1);
  9. INSERT INTO student(s_name, class_id) VALUES(‘xs_D‘, 2);
  10. INSERT INTO student(s_name, class_id) VALUES(‘xs_E‘, 2);
  11. INSERT INTO student(s_name, class_id) VALUES(‘xs_F‘, 2);

3 定义实体类

  • Student
  1. public class Student {
  2. private int id;
  3. private String name;
  4. }
  • 修改Classes类,添加一个学生集合属性
  1. public class Classes {
  2. private int id;
  3. private String name;
  4. private Teacher teacher;
  5. private List<Student> students;
  6. }

4 定义SQL映射文件classMapper.xml

4.1 方式一:嵌套结果,也就是连表查询

  • xml
  1. <!-- 方式一:嵌套结果 ,连表查询
  2. SELECT * FROM class c, teacher t,student s WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND c.c_id=1
  3. -->
  4. <resultMap type="Classes" id="ClassResultMap3">
  5. <id property="id" column="c_id"/>
  6. <result property="name" column="c_name"/>
  7. <association property="teacher" column="teacher_id" javaType="Teacher">
  8. <id property="id" column="t_id"/>
  9. <result property="name" column="t_name"/>
  10. </association>
  11. <!-- ofType指定students集合中的对象类型 -->
  12. <collection property="students" ofType="Student">
  13. <id property="id" column="s_id"/>
  14. <result property="name" column="s_name"/>
  15. </collection>
  16. </resultMap>
  17. <select id="getClass3" parameterType="int" resultMap="ClassResultMap3">
  18. select * from class c, teacher t,student s where c.teacher_id=t.t_id and c.C_id=s.class_id and c.c_id=#{id}
  19. </select>
  • 测试
  1. @Test
  2. public void testOM() {
  3. SqlSessionFactory factory = MybatisUtils.getFactory();
  4. SqlSession sqlSession = factory.openSession();
  5. Classes c = sqlSession.selectOne("cn.imentors.mybatis.test6.classMapper.getClass3", 1);
  6. System.out.println(c);
  7. }

4.2 方式二,嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型

  • xml
  1. <!--
  2. 方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
  3. SELECT * FROM class WHERE c_id=1;
  4. SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值
  5. SELECT * FROM student WHERE class_id=1 //1是第一个查询得到的c_id字段的值
  6. -->
  7. <select id="getClass4" parameterType="int" resultMap="ClassResultMap4">
  8. select * from class where c_id=#{id}
  9. </select>
  10. <resultMap type="Classes" id="ClassResultMap4">
  11. <id property="id" column="c_id"/>
  12. <result property="name" column="c_name"/>
  13. <association property="teacher" column="teacher_id" javaType="Teacher" select="getTeacher2"></association>
  14. <collection property="students" ofType="Student" column="c_id" select="getStudent"></collection>
  15. </resultMap>
  16. <select id="getTeacher2" parameterType="int" resultType="Teacher">
  17. SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
  18. </select>
  19. <select id="getStudent" parameterType="int" resultType="Student">
  20. SELECT s_id id, s_name name FROM student WHERE class_id=#{id}
  21. </select>

测试

  1. @Test
  2. public void testOM2() {
  3. SqlSessionFactory factory = MybatisUtils.getFactory();
  4. SqlSession sqlSession = factory.openSession();
  5. Classes c = sqlSession.selectOne("cn.imentors.mybatis.test6.classMapper.getClass4", 1);
  6. System.out.println(c);
  7. }

5 属性说明

  • collection:做一对多关联查询
  • ofType:指定集合中元素对象的类型

捐赠我们
    良师益友工作室一直在致力于帮助编程爱好更加快速方便地学习编程,如果您对我们的成果表示认同并且觉得对你有所帮助,欢迎您对我们捐赠^_^。

时间: 2024-11-09 09:21:32

06_一对多联表查询的相关文章

mybatis一对多联表查询的两种常见方式

1.嵌套结果查询(部分代码如下) sql语句接上: 注释:class表(c别名),student表teacher(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为两者有主键关联的原因,c_id为class表的字段.根据c_id查询._classes为classes实体类(既是表class对应的实体类)前两个property为class表对应实体类的属性,column对应class表的字段,association中teacher为classes实体类属性,co

SQL 一对多联表查询最大值

有两个数据表City表和Price表,CIty表的结构如下: Price表的结构如下: 查询每个城市最大的销售价格,并以最大价格进行降序排列,SQL语句的代码如下: select top 5 * from (select ROW_NUMBER() over(order by TmpTable.AdultyPrice desc) NID, City.*, TmpTable.AdultyPrice from City,(select MAX(Price.AdultyPrice) as AdultyP

随一笔:数据库一对多的联表查询

旧知识:纯属温习旧功课了 有两数据表,表 a 和表 b, 表 b 在后来的拓展需求,在表中添加了字段,所以之前的记录中,这个字段为null值. 现在需要 a.b 表联表查询 ,以表 a 为主,表 b 只需要查出和表 a 对应的记录总条数. 在试探简单实用 GROUP BY 和 GROUP_CONCAT 的时候,遇到了不能对字段都为null值的记录分组的问题,这个也是难点,解决这个问题的关键点. 根据本项目的需求特点, 我换了个思路,貌似这个解决方式还是挺不错的 上图:

自动化运维Python系列之ForeignKey、relationship联表查询

一对多和多对多 数据库表结构设计是程序项目开发前的重要环节,后期数据库操作都是围绕着这个已经设计好的表结构进行,如果表结构设计有问题,整个程序项目就有存在需要整个推翻重构的风险... 数据库表结构除了简单的单表操作以外,还有一对多.多对多等. 一对多 基于SQLAlchemy我们可以先创建如下结构的2张表,然后来看看具体怎样通过外键ForeignKey或者relationship联表操作 创建表 from sqlalchemy.ext.declarative import declarative

ORM::联表查询

按顺序来一步一步走: 第一先建立好数据库:我的数据库是mysql数据库,数据库共分为以下几个表: users  用户表(刚开始的时候我用的是user表名,由于kohana有喜欢建立model时在后面加复数的习惯,但是估计 user这个名字已经被占用了,指定$_table_name="user"也不行) posts 帖子 数据库导出代码如下: -- phpMyAdmin SQL Dump -- version 3.4.10.1deb1 -- http://www.phpmyadmin.n

mybatis 联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TABLE class( 6 c_id INT PRIMARY KEY AUTO_INCREMEN

单表多表操作 联表查询

目录 一.单表操作 1. 分组--> group by 2. 排序--> order by 3. 分页--> limit 4. 总结(很重要) 二.多表操作 1. 外键 2. 一对多(很常见类型) 3. 多对多(常见类型) 4. 一对一(不常见类型) 三.多表联查 1. 左连接-->left join...on 2. 右连接-->right join...on 3. 内连接-->inner join...on 一.单表操作 1. 分组--> group by 分组

SQL联表查询

数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(table)按照(where)一定的条件(expression)查找(select)我要的数据(column); 但是在实际工作中用到的比较多的往往还是多联表查询,所以在这里记下自己学习多联表查询的心得. 首先聊一聊笛卡尔积,这是几乎所有数据库书籍在讲多联表查询时第一个要讲的东西,我等P民也只能是把笛卡尔

mybatis之联表查询

今天碰到了一个问题,就是要在三张表里面各取一部分数据然后组成一个list传到前台页面显示.但是并不想在后台做太多判断,(因为涉及到for循环)会拉慢运行速度.正好用的框架是spring+springMVC+mybatis,所以很自然的就想到了联表查询. 一开始认为mybatis编写语句很简单,但是在编写的时候遇到了一些细节问题,所以发文记录一下. 先说一下背景: 框架:spring+springMVC+mybatis 表结构: 1.主表 2.从表 从表的uid对应主表的id,并将主表的id设为主