zoukankan      html  css  js  c++  java
  • MyBatis学习(十一)--关系映射

    前言

      在数据库中,常见的关系有一对一关系,一对多关系,多对一关系,多对多关系。在这里,博主将简要说明在MyBatis中如何实现数据库之间关系的对应。

      在本篇博客中,将会用到三张数据库表,表结构如下:

      作者(author)表:               博客(blog)表:               文章(post)表:

             

    关系模型:

      关联关系:对象之间的对应关系才叫关联关系;

        如:author(作者表)和blog表,每创建一个blog对象,该对象就会包含一个author对象;

      关联关系又分为单向关联和双向关联;

        单向关联:当主表更新时,从表也会跟着进行更新;而从表更新时,主表不会更新;

        双向关联:当主表更新时,从表也会跟着进行更新;当从表更新时,主表也会跟着进行更新;

      一对一关联关系:如blog表和author表

      

      创建类的代码如下:

        

      一对多的关联关系:如blog表和post表

      

      创建类的代码如下:

        

    一对一查询

      需求:查询某个博客的详细信息及其作者的名字:Blog中携带Author的全部信息

      resultType:可以对应到创建blog对象,blog对象中的Author对象属性是不能赋值成功的

      

      resultMap:列和属性关系建立,列(author表的三列)--属性(author对象)

      第一种实现方式:使用association

      

      注:尽量不使用select * ,可能会出现列名冲突的问题,通过列别名来避免冲突,本来resultMap就是做属性和列的对应关系

      第二种实现方式:两个resultMap

      

      第三种方式:使用嵌套结果集映射,select指向另一个配置映射文件

      

      步骤:

        执行findBlogById查询blog表中的信息;

        找到需要对应的结果集resultMap

        关联Author表中的属性

        Author表中的属性通过findAuthorById找到,通过column传递author_id给到Author表的查询

      缺点:这种方式会产生N+1的问题,影响性能; N指的是第一次查询出的N条记录

    一对多查询

      需求:查询blog的时候,得到该blog的文章列表

      第一种方式:使用collection

      

      第二种方式:使用两个select

      

      步骤:

        执行findBlogByAndPost查询blog表中的信息;

        找到需要对应的结果集resultMap

        关联Post表中的属性

        Post表中的属性通过findPostBuBlog找到,通过column传递blog_id给到Post表的查询

      缺点:这种方式会产生N+1的问题,影响性能; N指的是第一次查询出的N条记录

      第三种方式:使用构造器(constructor),直接使用有参构造函数,将列的值赋给属性

      

      注意:要在实体类中添加相应的构造函数

      

    一对一、一对多实现

      需求:查询一个blog对应的author及其post;

      方法:可以使用继承的关系来实现;这里用一对多的resultMap继承一对一的resultMap

      

      注:谁继承谁没有影响,都可以实现查询;

    resultType和resultMap的区别

      resultType:

        实现简单,只需要对到pojo简单Java对象,如果需要联查,可以通过构建VO对象实现映射;

        如果没有特殊要求,不需要关系映射,推荐使用resultType;

        不能实现懒加载

      resultMap:

        需要单独定义,属性和列的对应关系;

        如果对查询有特殊要求,有关系映射,选用resultMap;

        可以实现懒加载(延迟加载);

    PS:因作者能力有限,如有误还请谅解

  • 相关阅读:
    undefined vs. null
    Callback()
    python基础----元类metaclass
    python基础----__next__和__iter__实现迭代器协议
    python基础----析构函数__del__
    python基础----__slots__方法、__call__方法
    python基础----实现上下文管理协议__enter__和__exit__
    python基础----__setitem__,__getitem,__delitem__
    python基础----isinstance(obj,cls)和issubclass(sub,super)、反射、__setattr__,__delattr__,__getattr__、二次加工标准类型(包装)
    python基础----特性(property)、静态方法(staticmethod)、类方法(classmethod)、__str__的用法
  • 原文地址:https://www.cnblogs.com/WHL5/p/8743391.html
Copyright © 2011-2022 走看看