`
changhongbao
  • 浏览: 123949 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

2、mybatis实现关联表查询

 
阅读更多

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);

}

 

 

分享到:
评论

相关推荐

    Spring boot2基于Mybatis实现多表关联查询

    使用 MyBatis 实现关联查询非常简单,只需要在 Mapper 接口中使用 @Results 注解指定关联关系。例如,在 UserMapper 接口中,使用 @Results 注解指定了用户的公司信息和账户信息。 ```java public interface ...

    mybatis自关联查询

    本篇文章将重点讲解 MyBatis 中的自关联查询,以“新闻栏目”为例,探讨如何实现一对多的关系。 在新闻系统中,栏目(Category)与新闻(News)通常存在一对多的关系:一个栏目可以包含多个新闻,而一个新闻则属于...

    Mybatis实现多表联合查询和批量插入

    Mybatis实现多表联合查询和批量插入 Mybatis是一款流行的持久层框架,它可以帮助开发者快速、高效地访问数据库。在实际开发中,经常需要对多个表进行联合查询,或者对大量数据进行批量插入。本文将详细介绍如何使用...

    Mybatis基于注解实现多表查询功能

    Mybatis基于注解实现多表查询功能 Mybatis基于注解实现多表查询功能是指使用Mybatis框架中的注解来实现多表查询的功能。这种方法可以简化配置,提高开发效率。下面我们将详细介绍如何使用Mybatis基于注解实现多表...

    Mybatis实现关联查询一对一和一对多实现

    Mybatis实现关联查询一对一和一对多实现,具体效果看博文 http://blog.csdn.net/evankaka/article/details/45674101

    spring多数据源的处理_mybatis实现跨库查询

    "Spring 多数据源处理_Mybatis 实现跨库查询" 本文主要讨论了 Spring 框架中多数据源的处理方法,特别是使用 Mybatis 实现跨库查询。在大型应用中,为了提高系统的水平伸缩性,需要对数据进行切分,并且采用多个...

    实现Mybatis框架中一对多关联映射的查询操作。

    本篇将详细讲解如何在Mybatis中实现一对多关联映射的查询操作。 首先,我们要明确一对多关联映射的基本概念。在这个例子中,User表(用户表)和Order_form表(订单表)之间存在1-N的关系,意味着一个用户可以有多个...

    使用MyBatis实现表的多对多关联映射查询

    通过以上步骤,我们可以使用MyBatis实现多对多关联映射查询,理解这个过程对于掌握MyBatis框架以及数据库设计原则至关重要。在实际应用中,根据业务需求进行适当调整,确保数据的一致性和完整性。通过这个示例,初学...

    MyBatis的关联映射实践报告

    了解数据表之间以及对象之间的三种关联关系 2.熟悉关联关系中的嵌套查询和 嵌套结果 3.掌握一对一,一对多,和多对多关联映射作用

    用MyBatis实现表的一对多关联查询

    本文主要围绕"用MyBatis实现表的一对多关联查询"这一主题,详细阐述如何在实际项目中实现这种关联关系。 一、MyBatis一对多映射基础 MyBatis的一对多映射是指一个表(父表)中的多条记录可以与另一个表(子表)中...

    mybatis 关联查询完整代码

    本篇文章将详细探讨MyBatis在关联查询中的一对一和一对多关系映射,以及如何通过ResultMap配置来实现这些复杂的查询。 在数据库设计中,一对一和一对多的关系非常常见。一对一关系通常出现在两个表之间,其中一个表...

    Springboot中mybatis表关联映射关系(一对一)

    在本文中,我们将详细介绍 Springboot 中 MyBatis 表关联映射关系的实现机制,特别是针对一对一关联关系的实现。 一对一关联关系是一种非常常见的关联关系,例如,一个学生只有一个学生证,同时一个学生证也只对应...

    Java的MyBatis框架中实现多表连接查询和查询结果分页

    在MyBatis中,可以通过`&lt;join&gt;`、`&lt;association&gt;`等标签来实现多表连接查询。以示例中的`Website`和`Visitor`两个实体类为例,如果它们之间存在一对一的关系,我们可以在`Website`的映射文件中定义一个`...

    Mybatis实现一对一关联查询(Mysql数据库)

    以上就是Mybatis实现一对一关联查询的详细步骤。在实际项目中,我们可能还需要考虑性能优化,如使用延迟加载(Lazy Loading)避免不必要的查询,或者根据业务需求选择是否在同一个查询中获取关联数据。总之,正确...

    springboot整合mybatis-plus实现多表分页查询

    在本文中,我们将深入探讨如何在SpringBoot项目中整合MyBatis-Plus,实现多表分页查询。MyBatis-Plus是一个强大的MyBatis扩展,简化了对数据库的操作,包括CRUD操作以及复杂的关联查询。它提供了丰富的API,使得开发...

    基于mybatis的collection标签实现帖子评论多级回复以及关联用户信息查询

    在本场景中,我们探讨的是如何利用MyBatis的`collection`标签来实现帖子评论的多级回复以及与用户信息的关联查询。MyBatis是一个强大的Java持久层框架,它简化了数据库操作,使得开发者能更专注于SQL语句本身,而...

    Mybatis 一对多关联查询(两种方法)

    本文将详细解析两种实现Mybatis一对多关联查询的方法,并结合提供的文件来阐述其实现过程。 首先,我们来看一下标题中的两种方法: 1. 映射器XML配置文件方式 在Mybatis中,可以通过在Mapper XML文件中定义一对一...

    MyBatis的关联映射

    2. **嵌套结果**(Nested Results):MyBatis通过`&lt;resultMap&gt;`的`&lt;association&gt;`和`&lt;collection&gt;`标签,直接在一条SQL查询中获取关联数据,然后在内存中进行组装。这种方式减少数据库交互次数,提高性能,但SQL语句...

    mybatis 的高级关联查询源码

    这次我们将深入探讨 MyBatis 如何实现这种高级关联查询,并通过源码分析来理解其工作原理。 “一对多”关联通常指的是一个实体(如用户)可以拥有多个关联实体(如订单)。在 MyBatis 中,我们可以使用 `...

Global site tag (gtag.js) - Google Analytics