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

目录/Contents

  • 第4章 MyBatis的关联映射和缓存机制
    • 学习目标
      • 了解数据表之间的三种关联关系
      • 了解对象之间的三种关系
      • 熟悉关联关系中的嵌套查询和嵌套结果
      • 掌握一对一关联映射
      • 掌握一对多关联映射
      • 掌握多对多关联映射
      • 熟悉Mybatis的缓存机制
    • 学习内容
      • 1 关联映射概述
        • 1.1 关联映射关系
          • 1.1.1 一对一关系
          • 1.1.2 一对多关系
          • 1.1.3 多对多关系
        • 1.2 Java对象如何描述事物之间的关系
        • 1.3 Java对象关联映射关系
          • 1.3.1 一对一
          • 1.3.2 一对多
          • 1.3.3 多对多
      • 2 一对一查询
        • 2.1 \元素
        • 2.2 \元素属性
        • 2.3 \元素的配置方式
        • 2.4 一对一查询案例
          • 2.4.1 创建数据表
          • 2.4.2 持久化类IDCard类
          • 2.4.3 持久化类Person类
          • 2.4.4 编写IdCardMapper.xml文件
          • 2.4.5 编写PersonMapper.xml文件
          • 2.4.6 引入映射文件
          • 2.4.7 编写测试类
        • 2.5 多学一招:MyBatis延迟加载的配置
      • 3 一对多查询
        • 3.1 用户与订单关联关系图
        • 3.2 \元素
        • 3.3 \元素的配置方式
          • 3.3.1 a.嵌套查询方式
          • 3.3.2 b.嵌套查询方式
        • 3.4 一对多查询案例
          • 3.4.1 创建数据库
          • 3.4.2 创建持久化类Orders
          • 3.4.3 创建持久化类Users
          • 3.4.4 创建用户实体映射文件UsersMapper.xml
          • 3.4.5 在核心配置文件mybatis-config.xml中
          • 3.4.6 在测试类MyBatisTest中
      • 4 多对多查询
        • 4.1 订单和商品多对多关系图
        • 4.2 多对多查询案例
          • 4.2.1 STEP 01
          • 4.2.2 STEP 02
          • 4.2.3 STEP 03
          • 4.2.4 STEP 04
          • 4.2.5 STEP 05
          • 4.2.6 STEP 06
          • 4.2.7 STEP 07
      • 5 MyBatis缓存机制
        • 5.1 一级缓存
          • 5.1.1 MyBatis的一级缓存级别
          • 5.1.2 举例说明MyBatis的一级缓存级别
          • 5.1.3 案例的查询过程
          • 5.1.4 建立数据库
          • 5.1.5 创建持久化类Book
          • 5.1.6 创建图书映射文件BookMapper.xml
          • 5.1.7 在核心配置文件mybatis-config.xml中的标签下
          • 5.1.8 由于需要通过log4j日志组件查看一级缓存的工作状态
          • 5.1.9 创建log4j.properties文件
          • 5.1.10 在测试类MyBatisTest中
        • 5.2 二级缓存
        • 5.2.1使用二级缓存的好处
        • 5.2.2 MyBatis二级缓存的执行过程
        • 5.2.3 MyBatis二级缓存的执行过程图解
        • 5.2.4 二级缓存与一级缓存的不同点
          • 5.2.4.1 a.开启二级缓存的全局配置
          • 5.2.4.1 b.开启当前Mapper的namespace下的二级缓存
        • 5.2.5 默认状态的二级缓存可实现的功能
        • 5.2.6 \元素的属性
        • 5.2.7 修改映射文件BookMapper.xml
        • 5.2.8 在测试类MyBatisTest中
        • 5.2.9 执行MyBatisTest测试类的findBookByIdTest3()方法
        • 5.2.10 对MyBatis二级缓存的应用案例的运行结果分析
        • 5.2.11 多个SqlSession在同一个Mapper中执行
        • 5.2.12 多学一招:Cache Hit Ratio(缓存命中率)
      • 6 案例:商品的类别
        • 6.1 商品表(product)商品类别表(category)详情
        • 6.2 案例具体要求
        • 6.3 项目搭建
        • 6.4 数据库准备
        • 6.5 POJO类准备1
        • 6.6 POJO类准备2
        • 6.7 编写映射文件
        • 6.8 修改mybatis-config.xml核心配置文件
        • 6.9 编写测试方法
        • 6.10 查看运行结果

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

学习目标

了解数据表之间的三种关联关系

了解对象之间的三种关系

熟悉关联关系中的嵌套查询和嵌套结果

掌握一对一关联映射

掌握一对多关联映射

掌握多对多关联映射

熟悉Mybatis的缓存机制

学习内容

1 关联映射概述

1.1 关联映射关系

在关系型数据库中,表与表之间存在着三种关联映射关系,分别为一对一关系、一对多关系和多对多关系。

1.1.1 一对一关系

一个数据表中的一条记录最多可以和另一个数据表中的一条记录相关。例如,现实生活中学生与校园卡就属于一对一的关系,一个学生只能拥有一张校园卡,一张校园卡只能属于一个学生。

1.1.2 一对多关系

主键数据表中的一条记录可以和另外一个数据表的多条记录相关。但另外一个数据表中的记录只能与主键数据表中的某一条记录相关。例如,现实中班级与学生的关系就属于一对多的关系,一个班级可以有很多学生,但一个学生只能属于一个班级。

1.1.3 多对多关系

一个数据表中的一条记录可以与另外一个数据表任意数量的记录相关,另外一个数据表中的一条记录也可以与本数据表中任意数量的记录相关。例如,现实中学生与教师属于多对多的关系,一名学生可以由多名教师授课,一名教师可以为多名学生授课。

1.2 Java对象如何描述事物之间的关系

第4章 MyBatis的关联映射和缓存机制_第1张图片

1.3 Java对象关联映射关系

Java对象描述数据之间的关联映射关系有三种,分别是一对一、一对多和多对多。

1.3.1 一对一

就是在本类中定义与之关联的类的对象作为属性,例如,A类中定义B类对象b作为属性,在B类中定义A类对象a作为属性。

1.3.2 一对多

就是一个A类对象对应多个B类对象的情况,例如,定义在A类中,定义一个B类对象的集合作为A类的属性;在B类中,定义A类对象a作为B类的属性。

1.3.3 多对多

在两个相互关联的类中,都可以定义多个与之关联的类的对象。例如,在A类中定义B类类型的集合作为属性,在B类中定义A类类型的集合作为属性。

2 一对一查询

2.1 元素

在现实生活中,一对一关联关系是十分常见的。例如,一个人只能有一个身份证,同时一个身份证也只会对应一个人。人与身份证之间的关联关系如图。
第4章 MyBatis的关联映射和缓存机制_第2张图片
在MyBatis中,通过 元素来处理一对一关联关系元素提供了一系列属性用于维护数据表之间的关系。

2.2 元素属性

第4章 MyBatis的关联映射和缓存机制_第3张图片

2.3 元素的配置方式

元素是元素的子元素,它有两种配置方式,嵌套查询方式和嵌套结果方式,下面对这两种配置方式分别进行介绍。

a.嵌套查询方式
嵌套查询是指通过执行另外一条SQL映射语句来返回预期的复杂类型。

<association property="card" column="card_id" 
  javaType="com.itheima.pojo.IdCard"	     
  select="com.itheima.mapper.IdCardMapper.findCodeById" />

b.嵌套结果方式
嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。

<association property="card" 	javaType="com.itheima.pojo.IdCard">
    <id property="id" column="card_id" />
    <result property="code" column="code" />
</association>
2.4 一对一查询案例
2.4.1 创建数据表

在mybatis数据库中分别创建名为tb_idcard的身份证数据表和名称为tb_person的个人数据表,同时预先插入几条数据。

USE mybatis;
# 创建一个名称为tb_idcard的表
CREATE TABLE  tb_idcard( 
     id INT PRIMARY KEY AUTO_INCREMENT,
     CODE VARCHAR(18)	);
# 插入2条数据
INSERT INTO tb_idcard(CODE) VALUES('152221198711020624');
# 创建一个名称为tb_person的表,同理
2.4.2 持久化类IDCard类

创建持久化类IdCard,用于封装身份证属性。

public class IdCard {
   
	private Integer id;                 // 主键id
	private String code;              // 身份证号码
	// 省略getter/setter方法
	@Override
	public String toString() {
   
		return "IdCard [id=" + id + ", code=" + code + "]";
	}
}
2.4.3 持久化类Person类

创建持久化类Person,用于封装个人属性。

public class Person {
   
        private Integer id;             // 主键id
        private String name;         // 姓名
        private Integer age;          // 年龄
        private String sex;            // 性别
        private IdCard card;  	   // 人员关联的证件
        // 省略getter/setter方法,重写的toString()方法
}
2.4.4 编写IdCardMapper.xml文件
创建身份证映射文件IdCardMapper.xml,并在映射文件中编写一对一关联映射查询的配置信息。
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.IdCardMapper">
  <!-- 根据id查询证件信息 -->
  <select id="findCodeById" parameterType="Integer" resultType="IdCard">
	  SELECT * from tb_idcard where id=#{
   id}
  </select>
</mapper>
2.4.5 编写PersonMapper.xml文件

创建人员映射文件PersonMapper.xml,并在映射文件中编写一对一关联映射查询的配置信息。

<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.itheima.mapper.IdCardMapper.findCodeById" />
</resultMap>
2.4.6 引入映射文件

在核心配置文件mybatis-config.xml中,引入IdCardMapper.xml和PersonMapper.xml映射文件,并为com.itheima.pojo包下的所有实体类定义别名。

<!-- 只展示了定义别名和mapping文件中配置新添加的部分-- >
<!--使用扫描包的形式定义别名 -->
<typeAliases>
	<package name="com.itheima.pojo" />
</typeAliases>
<mappers>
	<mapper resource="com/itheima/mapper/IdCardMapper.xml" />
	<mapper resource="com/itheima/mapper/PersonMapper.xml" />
</mappers>
2.4.7 编写测试类

在测试类MyBatisTest中,编写测试方法findPersonByIdTest()。

public void findPersonByIdTest() {
   
        // 1、通过工具类获取SqlSession对象
        SqlSession session = MyBatisUtils.getSession();
        // 2.使用MyBatis嵌套查询的方式查询id为1的人的信息
        Person person = session.selectOne

你可能感兴趣的:(mybatis,缓存,java)