6、mybatis实现关联表查询
6.1. 一对一关联
1). 提出需求
根据班级id查询班级信息(带老师的信息)
2). 创建表和数据
CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VARCHAR(20), teacher_id INT ); ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);
INSERT INTO teacher(t_name) VALUES('LS1'); INSERT INTO teacher(t_name) VALUES('LS2');
INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1); INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2); |
3). 定义实体类:
public class Teacher { private int id; private String name; } public class Classes { private int id; private String name; private Teacher teacher; } |
4). 定义sql映射文件ClassMapper.xml
<!-- 方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集 封装联表查询的数据(去除重复的数据) select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=1 --> <select id="getClass" parameterType="int" resultMap="ClassResultMap"> select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id} </select> <resultMap type="_Classes" id="ClassResultMap"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" javaType="_Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> </resultMap>
<!-- 方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型 SELECT * FROM class WHERE c_id=1; SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值 -->
<select id="getClass2" parameterType="int" resultMap="ClassResultMap2"> select * from class where c_id=#{id} </select> <resultMap type="_Classes" id="ClassResultMap2"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" column="teacher_id" select="getTeacher"> </association> </resultMap>
<select id="getTeacher" parameterType="int" resultType="_Teacher"> SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id} </select> |
5). 测试
@Test public void testOO() { SqlSession sqlSession = factory.openSession(); Classes c = sqlSession.selectOne("com.atguigu.day03_mybatis.test5.OOMapper.getClass", 1); System.out.println(c); }
@Test public void testOO2() { SqlSession sqlSession = factory.openSession(); Classes c = sqlSession.selectOne("com.atguigu.day03_mybatis.test5.OOMapper.getClass2", 1); System.out.println(c); } |
一对多关联
1). 提出需求
根据classId查询对应的班级信息,包括学生,老师
2). 创建表和数据:
CREATE TABLE student( s_id INT PRIMARY KEY AUTO_INCREMENT, s_name VARCHAR(20), class_id INT ); INSERT INTO student(s_name, class_id) VALUES('xs_A', 1); INSERT INTO student(s_name, class_id) VALUES('xs_B', 1); INSERT INTO student(s_name, class_id) VALUES('xs_C', 1); INSERT INTO student(s_name, class_id) VALUES('xs_D', 2); INSERT INTO student(s_name, class_id) VALUES('xs_E', 2); INSERT INTO student(s_name, class_id) VALUES('xs_F', 2);
|
3). 定义实体类:
public class Student { private int id; private String name; }
public class Classes { private int id; private String name; private Teacher teacher; private List<Student> students; } |
4). 定义sql映射文件ClassMapper.xml
<!-- 方式一: 嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集 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 --> <select id="getClass3" parameterType="int" resultMap="ClassResultMap3"> 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} </select> <resultMap type="_Classes" id="ClassResultMap3"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" column="teacher_id" javaType="_Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> <!-- ofType指定students集合中的对象类型 --> <collection property="students" ofType="_Student"> <id property="id" column="s_id"/> <result property="name" column="s_name"/> </collection> </resultMap>
<!-- 方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型 SELECT * FROM class WHERE c_id=1; SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值 SELECT * FROM student WHERE class_id=1 //1是第一个查询得到的c_id字段的值 --> <select id="getClass4" parameterType="int" resultMap="ClassResultMap4"> select * from class where c_id=#{id} </select> <resultMap type="_Classes" id="ClassResultMap4"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" column="teacher_id" javaType="_Teacher" select="getTeacher2"></association> <collection property="students" ofType="_Student" column="c_id" select="getStudent"></collection> </resultMap>
<select id="getTeacher2" parameterType="int" resultType="_Teacher"> SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id} </select>
<select id="getStudent" parameterType="int" resultType="_Student"> SELECT s_id id, s_name name FROM student WHERE class_id=#{id} </select> |
5). 测试:
@Test public void testOM() { SqlSession sqlSession = factory.openSession(); Classes c = sqlSession.selectOne("com.atguigu.day03_mybatis.test5.OOMapper.getClass3", 1); System.out.println(c); }
@Test public void testOM2() { SqlSession sqlSession = factory.openSession(); Classes c = sqlSession.selectOne("com.atguigu.day03_mybatis.test5.OOMapper.getClass4", 1); System.out.println(c); }
|
相关推荐
使用 MyBatis 实现关联查询非常简单,只需要在 Mapper 接口中使用 @Results 注解指定关联关系。例如,在 UserMapper 接口中,使用 @Results 注解指定了用户的公司信息和账户信息。 ```java public interface ...
本篇文章将重点讲解 MyBatis 中的自关联查询,以“新闻栏目”为例,探讨如何实现一对多的关系。 在新闻系统中,栏目(Category)与新闻(News)通常存在一对多的关系:一个栏目可以包含多个新闻,而一个新闻则属于...
Mybatis实现多表联合查询和批量插入 Mybatis是一款流行的持久层框架,它可以帮助开发者快速、高效地访问数据库。在实际开发中,经常需要对多个表进行联合查询,或者对大量数据进行批量插入。本文将详细介绍如何使用...
Mybatis基于注解实现多表查询功能 Mybatis基于注解实现多表查询功能是指使用Mybatis框架中的注解来实现多表查询的功能。这种方法可以简化配置,提高开发效率。下面我们将详细介绍如何使用Mybatis基于注解实现多表...
Mybatis实现关联查询一对一和一对多实现,具体效果看博文 http://blog.csdn.net/evankaka/article/details/45674101
"Spring 多数据源处理_Mybatis 实现跨库查询" 本文主要讨论了 Spring 框架中多数据源的处理方法,特别是使用 Mybatis 实现跨库查询。在大型应用中,为了提高系统的水平伸缩性,需要对数据进行切分,并且采用多个...
本篇将详细讲解如何在Mybatis中实现一对多关联映射的查询操作。 首先,我们要明确一对多关联映射的基本概念。在这个例子中,User表(用户表)和Order_form表(订单表)之间存在1-N的关系,意味着一个用户可以有多个...
通过以上步骤,我们可以使用MyBatis实现多对多关联映射查询,理解这个过程对于掌握MyBatis框架以及数据库设计原则至关重要。在实际应用中,根据业务需求进行适当调整,确保数据的一致性和完整性。通过这个示例,初学...
了解数据表之间以及对象之间的三种关联关系 2.熟悉关联关系中的嵌套查询和 嵌套结果 3.掌握一对一,一对多,和多对多关联映射作用
本文主要围绕"用MyBatis实现表的一对多关联查询"这一主题,详细阐述如何在实际项目中实现这种关联关系。 一、MyBatis一对多映射基础 MyBatis的一对多映射是指一个表(父表)中的多条记录可以与另一个表(子表)中...
本篇文章将详细探讨MyBatis在关联查询中的一对一和一对多关系映射,以及如何通过ResultMap配置来实现这些复杂的查询。 在数据库设计中,一对一和一对多的关系非常常见。一对一关系通常出现在两个表之间,其中一个表...
在本文中,我们将详细介绍 Springboot 中 MyBatis 表关联映射关系的实现机制,特别是针对一对一关联关系的实现。 一对一关联关系是一种非常常见的关联关系,例如,一个学生只有一个学生证,同时一个学生证也只对应...
在MyBatis中,可以通过`<join>`、`<association>`等标签来实现多表连接查询。以示例中的`Website`和`Visitor`两个实体类为例,如果它们之间存在一对一的关系,我们可以在`Website`的映射文件中定义一个`...
以上就是Mybatis实现一对一关联查询的详细步骤。在实际项目中,我们可能还需要考虑性能优化,如使用延迟加载(Lazy Loading)避免不必要的查询,或者根据业务需求选择是否在同一个查询中获取关联数据。总之,正确...
在本文中,我们将深入探讨如何在SpringBoot项目中整合MyBatis-Plus,实现多表分页查询。MyBatis-Plus是一个强大的MyBatis扩展,简化了对数据库的操作,包括CRUD操作以及复杂的关联查询。它提供了丰富的API,使得开发...
在本场景中,我们探讨的是如何利用MyBatis的`collection`标签来实现帖子评论的多级回复以及与用户信息的关联查询。MyBatis是一个强大的Java持久层框架,它简化了数据库操作,使得开发者能更专注于SQL语句本身,而...
本文将详细解析两种实现Mybatis一对多关联查询的方法,并结合提供的文件来阐述其实现过程。 首先,我们来看一下标题中的两种方法: 1. 映射器XML配置文件方式 在Mybatis中,可以通过在Mapper XML文件中定义一对一...
2. **嵌套结果**(Nested Results):MyBatis通过`<resultMap>`的`<association>`和`<collection>`标签,直接在一条SQL查询中获取关联数据,然后在内存中进行组装。这种方式减少数据库交互次数,提高性能,但SQL语句...
这次我们将深入探讨 MyBatis 如何实现这种高级关联查询,并通过源码分析来理解其工作原理。 “一对多”关联通常指的是一个实体(如用户)可以拥有多个关联实体(如订单)。在 MyBatis 中,我们可以使用 `...