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:因作者能力有限,如有误还请谅解

原文地址:https://www.cnblogs.com/WHL5/p/8743391.html