05_一对一关联表查询:有二种方式

1 需求

  • 一个老师对应一个班级
  • 一个班级只有一个老师
  • 根据班级id查询班级信息,这个班级信息中有老师的信息

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_INCREMENT,
  7. c_name VARCHAR(20),
  8. teacher_id INT
  9. );
  10. //在班级表中加一个外键,指向老师表的主键
  11. ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);
  12. INSERT INTO teacher(t_name) VALUES(‘LS1‘);
  13. INSERT INTO teacher(t_name) VALUES(‘LS2‘);
  14. INSERT INTO class(c_name, teacher_id) VALUES(‘bj_a‘, 1);
  15. INSERT INTO class(c_name, teacher_id) VALUES(‘bj_b‘, 2);

3 定义实体类

3.1 Teacher

  1. public class Teacher {
  2. private int id;
  3. private String name;
  4. }

3.2 Classes

  1. public class Classes {
  2. private int id;
  3. private String name;
  4. private Teacher teacher;
  5. }

4 定义映射文件 classMapper.xml

4.1方式一:嵌套结果,使用嵌套结果映射来处理重复的联合结果的子集, 封装联表查询的数据(去除重复的数据)

  • xml
  1. <!-- 方式一:嵌套结果 -->
  2. <resultMap type="Classes" id="ClassResultMap">
  3. <id property="id" column="c_id"/>
  4. <result property="name" column="c_name"/>
  5. <association property="teacher" javaType="Teacher">
  6. <id property="id" column="t_id"/>
  7. <result property="name" column="t_name"/>
  8. </association>
  9. </resultMap>
  10. <select id="getClass" parameterType="int" resultMap="ClassResultMap">
  11. select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
  12. </select>
  • 测试
  1. @Test
  2. public void test1(){
  3. SqlSessionFactory factory = MybatisUtils.getFactory();
  4. SqlSession session = factory.openSession();
  5. String statement = "cn.imentors.mybatis.test5.classMapper.getClass";
  6. Classes c = session.selectOne(statement , 2);
  7. System.out.println(c);
  8. session.close();
  9. }

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

  • xml
  1. <!-- 方式:嵌套查询:本质是二次查询 -->
  2. <select id="getClass2" parameterType="int" resultMap="ClassResultMap2">
  3. select * from class where c_id=#{id}
  4. </select>
  5. <resultMap type="Classes" id="ClassResultMap2">
  6. <id property="id" column="c_id"/>
  7. <result property="name" column="c_name"/>
  8. <!-- column:是classes表中外键字段 -->
  9. <association property="teacher" column="teacher_id" select="getTeacher">
  10. </association>
  11. </resultMap>
  12. <select id="getTeacher" parameterType="int" resultType="Teacher">
  13. SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
  14. </select>

测试

  1. @Test
  2. public void test2(){
  3. SqlSessionFactory factory = MybatisUtils.getFactory();
  4. SqlSession session = factory.openSession();
  5. String statement = "cn.imentors.mybatis.test5.classMapper.getClass2";
  6. Classes c = session.selectOne(statement , 2);
  7. System.out.println(c);
  8. session.close();
  9. }

5 属性值说明

  • association:用于一对一的关联查询
  • property:对象属性名称
  • javaType:对象属性的类型
  • column:表的字段名称
  • select:使用另一个查询封闭的结果

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

时间: 2024-10-13 22:04:22

05_一对一关联表查询:有二种方式的相关文章

mybatis一对一关联表查询

先创建一个表 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

SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)

 下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式.   首先我们先创建两个数据库表,分别是user用户表和account账户表     user表:  account表:  然后创建实体类        **第一种通过创建子类的方式查询                             需求:查询所有的用户基础信息以及其所属的账户中的金额     1.创建想要得到多表查询数据的实体类(子类)            

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! 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 TAB

MyBatis-----4.实现关联表查询

前面几节都是单表查询,但是实际中一定会用到多表关联查询,本节将介绍关联表查询的实现 1.一对一关联 1.1创建数据表和添加数据 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 TABL

MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

先来张在路上-- 此项目是用Maven创建的,没有使用Maven的,自己百度.谷歌去:直接用Junit测试就行,先执行里面的save方法,添加10000条测试数据提供各种聚合查询等. 废话不多说,上干货-- 一.MongoDB数据库的配置(mongodb.xml) 以下是我自己的配置,红色字体请改为自己本机的东东,你说不懂设置端口,不会创建数据库名称,不会配置用户名密码,那有请查阅本系列的第4节(MongoDB的使用学习之(四)权限设置--用户名.密码.端口==),你说懒得设置,那就@#¥%--

django获取单表数据的三种方式

django获取单表数据的三种方式 v1 = models.Business.objects.all() # QuerySet ,内部元素都是对象 v2 = models.Business.objects.all().values('id','caption') # QuerySet ,内部元素都是字典 v3 = models.Business.objects.all().values_list('id','caption') # QuerySet ,内部元素都是元组 def business(

创建多对多表关系的三种方式

创建多对多表关系的三种方式 在我们之前创建多对多表的时候,一直用的都是全自动的方式来创建第三张表的. 1.全自动(推荐使用**) 好处在于 django orm会自动帮你创建第三张关系表 但是它只会帮你创建两个表的关系字段 不会再额外添加字段 虽然方便 但是第三张表的扩展性较差 无法随意的添加额外的字段 class Book(models.Model): ... authors = models.ManyToManyField(to='Author') class Author(models.M

关于Mysql删除表数据的两种方式对比

1.delete from table_name 一行一行删除,只删除表数据,auto_increament仍停留在最后一天数据的下一个值. 2.truncate table_name 快捷删除表数据.先删除整个表,然后重新建表结构.auto_increament从1开始. 关于Mysql删除表数据的两种方式对比,布布扣,bubuko.com

UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现

UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现 测试数据 java代码 1 package com.hzf.spark.study; 2 3 import java.util.Map; 4 import java.util.Set; 5 6 import org.apache.spark.SparkConf; 7 import org.apache.spark.api.java.JavaPairRDD; 8 import org.apache.s