美文网首页MyBatis
关联关系查询(第一讲)

关联关系查询(第一讲)

作者: 辽A丶孙悟空 | 来源:发表于2020-07-27 17:26 被阅读0次
关联查询

当查询内容涉及到具有关联关系的多个表时,就需要使用关联查询。根据表与表之间的关联关系的不同,关联查询分为四种:
(1)一对一关联查询
(2)一对多关联查询
(3)多对一关联查询
(4)多对多关联查询
由于日常生活中最常见的关联关系是一对多、多对一与多对多,所以这里就不专门只讲一对一关联查询了,其解决方案与多对一解决方案是相同的。

  • 一对多关联查询
    项目:MyBatis_One2Many,在上一个项目基础上修改即可。
    这里的一对多关联查询是指,在查询一方对象的时候,同时将其所关联的多个对象也都查询出来。
    以下是国家 Country 与部长 Minister 之间的一对多关系进行演示。
    (1)定义实体类
    在定义实体时,若定义的是双向关联,即双方的属性中均有对方对象作为域属性出现,那么它们在定义各自的 toString() 方法时需要注意,只让某一方可以输出另一方即可,不要让双方的 toString() 方法均可输出对方。这样会形成递归调用,程序出错。




    (2)定义数据库表




    (3)定义 Dao 层接口

    (4)定义测试类

    (5)定义映射文件
    A、多表连接查询方式

    注意,此时即使字段名与属性名相同,在<resultMap/>中也要写出他们的映射关系。因为框架是依据<resultMap/>封装对象的。
    另外,在映射文件中使用<collection/>标签体现出两个实体对象间的关联关系。其两个属性的意义为:
    ① property:指定关联属性,即 Country 类中的集合属性。
    ② ofType:集合属性的泛型类型。
    B、多表单独查询方式
    项目:MyBatis_One2Many_2,在项目MyBatis_One2Many上进行修改。
    多表连接查询方式是将多张表进行连接,连接为一张表后进行查询。其查询的本质是一张表。而多表单独查询方式是多张表各自查询各自的相关内容,需要多张表的联合数据了,则将主表的查询结果联合其他表的查询结果,封装为一个对象。
    当然,这多个查询是可以跨多个映射文件的,即是可以跨多个 namespace 即可。



    关联属性<collection/>的数据来自于另一个查询<selectMinisterByCountry/>。而该查询<selectMinisterByCountry/>的动态参数 country = #{ooo} 的值来自于查询<selectCountryById/>的查询结果字段 cid。
  • 多对一关联查询
    项目:MyBatis_Many2One,在项目 MyBatis_One2Many 基础上修改。
    这里的多对一关联查询是指,在查询多方对象的时候,同时将其所关联的一方对象也查询出来。
    由于在查询多方对象时也是一个一个查询,所以多对一关联查询,其实就是一对一关联查询。即一对一关联查询的实现方式与多对一的实现方式是相同的。
    下,下面以部长 Minister 与国家 Country 之间的多对一关系演示。
    (1)定义实体类




    (2)定义数据库表




    (3)定义 Dao 层接口

    (4)定义测试类

    (5)定义映射文件
    A、多表连接查询方式

    注意,在映射文件中使用<association/>标签体现出两个实体对象间的关联关系。
    ① property:指定关联属性,即 Minister 类中的 country 属性。
    ② javaType:关联属性的类型。
    B、多表单独查询方式
    项目:MyBatis_Many2One_2,在项目 MyBatis_Many2One 基础上修改。


  • 自关联查询
    所谓自关联是指,自己即充当一方,又充当多方,是 1:n 或 n:1 的变型。例如,对于新闻栏目 NewsColumn,可以充当一方,即父栏目,也可以充当多方,即子栏目。而反映到 DB 表中,只有一张表,这张表中具有一个外键,用于表示该栏目的父栏目。一级栏目没有父栏目,所以可以将其外键值设为0,而子栏目则具有外键值。
    为了便于理解,将自关联分为两种情况来讲解。一种是当作 1:n 讲解,即当前类作为一方,其包含多方的集合域属性。一种是当作 n:1 讲解,即当前类作为多方,其包含一方的域属性。
    下面以新闻栏目为例进行讲解。由于 Column 是 DBMS 中的关键字,为了避免误解,将新闻栏目实体类定义为 NewsLabel 。
    (1)自关联的 DB 表



    (2)以一对多方式处理
    以一对多方式处理,即一方可以看到多方。该处理方式的应用场景比较多,例如在页面上点击文栏目,显示出其子栏目。再如,将鼠标定位在窗口中的某菜单项上会显示其所有子菜单项等。
    根据查询需求的不同,又可以分为两种情况:一种是查询出指定栏目的所有子孙栏目,一种是查询出指定栏目及其所有子孙栏目。
    项目:MyBatis_Oneself_One2Many,在项目 MyBatis_One2Many 基础上修改。
    A、查询指定栏目的所有子孙栏目
    根据指定的 id ,仅查询出其所有子栏目。当然,包括其所有辈分的孙子栏目。即,给出的查询 id 实际为父栏目 id。
    ① 定义实体类



    ② 定义 Dao 接口

    ③ 定义 mapper 映射
    这里通过 select 语句的递归调用实现查询所有下级栏目的功能。查询结果的集合数据
    <collection/>来自于递归调用的 selectChildrenByParentld 查询。与第一次进行该查询不同的是,第一次的 pid 动态参数值来自于调用方法传递来的实参,而<collection/>中查询语句的 pid 动态参数值来自于上一次的查询结果的 id 值。

    ④ 定义测试类



    B、查询指定栏目及其所有子栏目
    这里的查询结果,既要包含指定 id 的当前栏目,还要包含其所有辈分的孙子栏目。即给出的 id 实际为当前要查询的栏目的 id 。
    项目:MyBatis_Oneself_One2Many_2,在项目MyBatis_Oneself_One2Many 基础上修改。
    ① 修改 Dao 接口

    ② 修改 mapper 映射

    ③ 修改测试类

    (3)以多对一方式处理
    以多对一方式处理,即多方可以看到一方。该处理方式的应用场景,例如在网页上显示当前页面的站内位置。
    项目:MyBatis_Oneself_Many2One,在项目MyBatis_Oneself_One2Many 基础上进行修改。
    A、定义实体类

    B、定义 Dao 接口

    C、定义 mapper 映射

    D、定义测试类
  • 多对多关联查询
    什么是多对多关联关系?一个学生可以选多门课程,而一门课程可以由多个学生选。这就是典型的多对多关系关系。所以,所谓多对多关系,其实是由两个互反的一-对多关系组成。一般情况下,多对多关系都会通过一一个中间表来建立,例如选课表。
    项目:MyBatis_Many2Many,在项目 MyBatis_One2Many 基础上进行修改。
    (1)定义实体类
    在定义双向关联(双方均可看到对方的关联关系)的实体的toString()方法时,只让一方的 toString() 方法中可以输出对方,不要让双方均可输出对方。否则将会出现输出时的递归现象,程序报错。




    (2)定义数据库表


    student
    course
    middle
    (3)定义 Dao 层接口

    (4)定义 mapper 映射
    多对多关联关系也是通过映射文件<resultMap/>的<collection/>体现的。但是,需要注意的是 SQL 语句中是对三张表的连接查询。

    (5)定义测试类


相关文章

  • 关联关系查询(第一讲)

    关联查询 当查询内容涉及到具有关联关系的多个表时,就需要使用关联查询。根据表与表之间的关联关系的不同,关联查询分为...

  • 关联查询、子查询与分页查询

    关联查询 关联关系分为一对一,一对多,多对多关系关联查询就是从多张表中查询数据,当我们使用n张表使用关联查询,至少...

  • laravel几个关联,经常用到的解析,关联查询

    查询存在的关联关系 比如我查询站点和接口关系, hasOne执行的SQL语句site模型关联 查询最少有一个接口对...

  • mongo数据结构设计

    两种关系设计方式 内嵌:只做查询使用,避免返回数据时关联查询或多次查询 引用:关联的集合涉及到附加信息(被引用的文...

  • Hibernate12-Hibernate 关联关系

    建立关联关系,hibernate可以快速的查询出我们想要的信息,例如 员工表与部门表创建了关联关系,那我我们可以通...

  • python面试题01

    1、什么是多表关联查询,有几种多表关联的查询方式,分别是什么? 多表关联查询概念: 多表关联查询分类:1.1内连接...

  • 关于关联查询的处理

    mybatis关联查询配置有2种:关联嵌套结果,关联嵌套查询关联的查询过程中如果关联的表可能查到很多数据,应该考虑...

  • Hibernate 一对多,多对一关系维护,双向还是单向关联

    一般不用双向关联:1、双向关联使数据关系变得负责,难于维护。2、使数据查询效率变低。例如:学校,学生如果双向关联。...

  • MySQL的多表关联查询

    一、多表关联查询 多表关联查询是使用一条SQL语句,将关联的多张表的数据查询出来。 1.1 交叉查询 交叉查询就是...

  • 写一个“特殊”的查询构造器 - (六、关联)

    关联查询是关系型数据库典型的查询语句,根据两个或多个表中的列之间的关系,从这些表中查询数据。在 SQL 标准中使用...

网友评论

    本文标题:关联关系查询(第一讲)

    本文链接:https://www.haomeiwen.com/subject/jfkhlktx.html