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