关联映射概述
在实际的开发中,对数据库的操作常常会涉及多张表,这在面向对象中就涉及了对象与对象之间的关联关系 针对多表之间的操作, MyBatis 提供了关联映射,通过关联映射就可以很好地处理对象与对象间的关联关系

这3中关系怎么关联起来呢?

  • 一对一 :在任意一方引入对方主键作为外键
  • 一对多 :在"多"的一方,添加"一"的一方的主键作为外键
  • 多对多 :产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新
    的宇段作为主键

在Java当中,通多随想也可以进行关系描述:如下图所示

三种关联的描述如下

  • 一对一的关系:就是在本类中定义对方类型的对象,如A类中定义B类类型的属性b, B类中定义A类类型的属性a。
  • 一对多的关系:就是一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a。
  • 多对多的关系:在A类中定义B类类型的集合,在B类中定义A类类型的集合。

一对一关联映射

resultMap元素下包含一个association的子元素,在MyBatis当中就是通过这一子元素来处理一对一关联映射的。MyBatis映射文件Mapper.xml详解 单击前往

在association元素中通常会要配置到以下元素

  • property:指定映射到的实体类对象属性,与表字段一一对应
  • javaType:指定映射到实体对象属性的类型(一个类的类型)
  • column:指定表中对应的字段
  • select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询
  • fetchType:指定在关联查询时是否启用延迟加载 fetchType 属性有 lazy eager 两个属性值,默认值为 lazy (即默认关联映射延迟加载)

MyBatis 在映射文件中加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果,嵌套查询是指通过执行另外一条 SQL 映射语句来返回预期的复杂类型;嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。
以下案例通过一个人只有一个身份证号码的案例来说明这个一对一的关系:
首先在数据库当中建立一个身份信息表,和个人信息表:其中把身份表的id列引入到个人表当中作为外键。建表后插入俩条数据用于测试

CREATE TABLE tb_idcard(
id INT PRIMARY KEY AUTO_INCREMENT,
CODE VARCHAR (18));INSERT INTO tb_idcard (CODE) VALUES('430481200001011111')
INSERT INTO tb_idcard (CODE) VALUES('430481200001012222')CREATE TABLE tb_person(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(32),
age INT,
sex VARCHAR(8),
card_id INT UNIQUE,
FOREIGN KEY (card_id) REFERENCES tb_idcard(id)
)INSERT INTO tb_person(NAME,age,sex,card_id)VALUES('汤姆',20,'男',1);
INSERT INTO tb_person(NAME,age,sex,card_id)VALUES('李红',20,'女',2);SELECT * FROM tb_person
SELECT * FROM tb_idcard

所有该项目文件的层次如下图:所需要的的包也就是MyBatis的包和数据库驱动包:第一个MyBatis程序,单击前往:

随后建立其对应的java类:对每一列的列名进行getset封装以及重写toString方法:
IdCard类

package com.lzq.po;
public class IdCard {private Integer id;private String code;
//getset方法省略@Overridepublic String toString() {return "IdCard [id =" + id + ",code=" + code + "]";}
}

Person类

package com.lzq.po;
public class Person {private Integer id;private String name;private Integer age;private String sex;private IdCard card;@Overridepublic String toString() {return "Person [id =" + id + ",name=" + name + ",age=" + age + ",sex= " + sex + ",card=" + card + "]";}
}

嵌套查询

随后在mapper包下进行配置mapper文件:
使用了MyBatis 中的嵌套查询方式进行了个人及其关联的证件信息查询,因为返回的个人对象中除了基本属性外还有一个关联的card属性,所以需要手动编写结果映射。从映射文件PersonMapper.xml中可以看出,嵌套查询的方法是先执行一-个简单的SQL语句,然后在进行结果映射时,将关联对象在<association>元素中使用select属性执行另一条SQL语句(即ldCardMapper.xml中的SQL )。

IdCardMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lzq.mapper.IdCardMapper"><select id="findCodeById" parameterType="Integer" resultType="IdCard">SELECT * from tb_idcard where id=#{id}</select>
</mapper>

PersonMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lzq.mapper.PersonMapper"><select id="findPersonById" parameterType="Integer"resultMap="IdCardWithPersonResult">select * from tb_person where id =#{id}</select><resultMap type="Person" id="IdCardWithPersonResult"><id property="id" column="id" /><result property="name" column="name" /><result property="age" column="age" /><result property="sex" column="sex" /><association property="card" column="card_id"javaType="IdCard" select="com.lzq.mapper.IdCardMapper.findCodeById" /></resultMap>
</mapper>

以及在mybatis-config.xml文件当中进行配置mapper文件:

<mapper resource="com/lzq/mapper/PersonMapper.xml" />
<mapper resource="com/lzq/mapper/IdCardMapper.xml" />

最后在测试类当中编写方法进行测试:
在这里面是将获取session对象的代码进行封装了:参考:核心对象
在这一篇文章最后的就是封装的代码,在编写是导入这个类即可调用MybatisUtils.getSession()

public void findPersonByIdCardTest() {SqlSession session = MybatisUtils.getSession();Person person = session.selectOne("com.lzq.mapper"+".PersonMapper.findPersonById",1);System.out.println(person);session.close();}

可以看到结果如下所示:

嵌套结果

虽然使用嵌套查询的方式比较简单,但是从图9中可以看出,MyBatis嵌套查询的方式要执行多条SQL语句,这对于大型数据集合和列表展示不是很好,因为这样可能会导致成百上千条关联的SQL语句被执行,从而极大地消耗数据库性能并且会降低查询效率。为此,我们可以使用MyBatis提供的嵌套结果方式来进行关联查询。
在PersonMapper.xml文件当中添加以下查询方式:使用多表联接查询
MyBatis 嵌套结果的方式只编写了一条复杂的多表关联的 SOL 语句,并且在<association> 元素中继续使用相关子元素进行数据库表字段和实体类属性的一一映射

<select id="findPersonById2" parameterType="Integer"resultMap="IdCardWithPersonResult2">select p.* ,idcard.code from tb_person p,tb_idcard idcardwhere p.card_id =idcard.id and p.id= #{id}</select><resultMap type="Person" id="IdCardWithPersonResult2"><id property="id" column="id" /><result property="name" column="name" /><result property="age" column="age" /><result property="sex" column="sex" /><association property="card" javaType="IdCard"><id property="id" column="card_id" /><result property="code" column="code" /></association></resultMap>

使用同样的测试方法测试:如下图所示:在使用嵌套结果的方式进行查询的时候只会执行一条SQL语句,

延迟加载
在使用 MyBatis 换套查询方式进行 MyBatis 关联查询映射时,使用 MyBatis 的延迟加载在一定程度上可以降低运行消耗并提高查询效率 MyBatis 默认没有开启延迅加载,需要在核心配直文件 mybatis-config.xml 中的<settings>元素内进行配直,具体配直方式如下:

<settings>
<!--打开延迟加载的开关-->
<setting name="lazyLoadingEnabled" value="true" />
<!--将积极加载改为消息加载,即按需加载-->
<setting ame="aggressiveLazyLoading" value="false"/>
</settings>

在映射文件中, MyBatis 关联映射的 <association>元索和<collection>元素中都已默认配置了延迟加载属性 即默认属性 fetchType=“lazy” (属性 fetchType="eager"表示立即力口载),

下一篇 :MyBatis的关联映射之 一对多 和 多对多

MyBatis的关联映射之 一对一(嵌套查询/嵌套结果)相关推荐

  1. 第4章 MyBatis的关联映射和缓存机制

    目录/Contents 第4章 MyBatis的关联映射和缓存机制 学习目标 了解数据表之间的三种关联关系 了解对象之间的三种关系 熟悉关联关系中的嵌套查询和嵌套结果 掌握一对一关联映射 掌握一对多关 ...

  2. MyBatis 3(4)关联映射:一对一,一对多

    MyBatis 关联映射 MyBatis 中对一对一,一对多的关联映射关系的配置方式是比较简单的,只需要在 XML 实体映射文件中进行相应的简单配置即可: 以下完整示例代码地址:https://git ...

  3. MyBatis关联映射:一对一、一对多

    一.一对一 场景:生活中每一个人都有一个身份证,这是最简单的一对一的关系. (1)用户表 (2)身份证表 (3)用户实体对象,com.xuliugen.mybatis.demo.bean.User ( ...

  4. Mybatis(四) 高级映射,一对一,一对多,多对多映射

    天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种 ...

  5. MyBatis从入门到精通(九):MyBatis高级结果映射之一对一映射

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中实现查 ...

  6. 二、mybatis 多级关联映射配置

    一.目的 1.上一篇写了mybatis基本的CURD,接着上一篇实现一个 多级关联 获取一篇文章以及该文章的所有评论.评论的所有回复 二.三张表 news(文章表)comment(评论表)reply( ...

  7. java查询mongodb 嵌套,查询嵌套文件mongoDB

    这是我在文本模式下的示例MongoDB 我想检索每个用户的数据 . 我也想要_id因为在一个完整的文档中它有几个具有相似结构的_id . 我尝试使用unwind运算符,因为该对象包含嵌套数组,如下所示 ...

  8. 2.4.3 Mybatis 高级查询, 复杂映射, 返回主键, 动态SQL if, set, foreach, 核心配置文件深入,plugins标签, 多表查询, 嵌套查询

    目录 Mybatis 复杂映射&配置文件深入 一 Mybatis高级查询 1.1 ResutlMap属性 1.2 多条件查询(三种) 1.3 模糊查询 二 Mybatis映射文件深入 2.1 ...

  9. Mybatis关联映射;Mybatis注解

    Mybatis关联映射 Mybatis关联映射的用途: 在实际的开发过程中,对于数据库的操作除了单表外往往会涉及到多张表,这些操作在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,M ...

最新文章

  1. 零基础Java学习之成员方法
  2. python turtle画彩虹的代码_如何用python海龟库画彩虹
  3. 关于内存的一些基础知识
  4. php继承和重载区别,php继承中方法重载(覆盖)的应用场合
  5. FPGA设计中遇到的奇葩问题之“芯片也要看出身”
  6. 中小企业信息管理 巧用E-Cell
  7. 2006年博客之星(小废物点评版)
  8. paip.索引的种类以及实现attilax 总结
  9. 58同城峰会落幕 智能化平台和下沉市场能让继续神奇吗?
  10. 怎么用微信打开qq连接到服务器地址,微信上能打开的链接如何在qq上打?
  11. 衣带渐宽终不悔,为伊消得人憔悴
  12. MindManager模板百度云下载分享教程
  13. yy号,你以为你是QQ号么?
  14. 止汗 咒语_咒语机器学习平台上线
  15. 61-70作业关系符运算
  16. interface和abstract interface
  17. python猴子分桃问题_用python实现【五猴分桃】问题
  18. 【SVN】新旧服务器更替,完成svn服务器迁移
  19. 在PHP中通过POST方法实现文件上传功能
  20. linux——进程的概念与状态

热门文章

  1. 映射网络驱动器错误:无法找到网络名,该设备或资源未设置为接受端口,“文件和打印机共享(SMB)”上的连接。
  2. CSS 8 品优购项目
  3. 【TensorFlow】神经网络中间层截取、可视化中间层结果
  4. 记一次富途集团后台开发笔试
  5. 解决打开管家婆软件报表慢的问题
  6. 概率与数理统计——中心极限定律
  7. ath9k驱动内的数据发送过程
  8. JavaEE:使用Dubbo发布/调用服务(SpringBoot)
  9. Qt在ARM或者linux上多屏显示
  10. IE6/IE7 /IE8/Firefox/Chrome/Safa…