`
wx1568908808
  • 浏览: 31566 次
文章分类
社区版块
存档分类
最新评论

MyBatis05-关联关系、延迟加载和缓存

 
阅读更多

@[toc]

关联关系

1对1关系

对象与对象1对1

部门对象

private Integer deptno;

	private String dname;

	private String loc;

员工对象

private Integer empno;
	
	private String ename;
	
	//private Integer deptno;
	
	//员工和部门的关联关系是1VS1
	
	private Dept dept;
映射文件中处理
<mapper namespace="com.sxt.dao.IEmpDao">
	<resultMap type="Emp" id="baseResultMap">
			<id column="empno" property="empno"/>
			<result column="ename" property="ename"/>
		<!-- 配置1对1的关联关系  property对应的是emp中部门成员变量的名称-->
		<association property="dept" javaType="Dept">
			<id column="deptno" property="deptno"/>
			<result column="dname" property="dname"/>
			<result column="loc" property="loc"/>
		</association>
	</resultMap>
	
	<select id="query" resultMap="baseResultMap">
		SELECT
			e.empno
			,e.ename
			,d.deptno
			,d.dname
			,d.loc
		FROM emp e
		LEFT JOIN
			dept d
		ON e.deptno=d.deptno
	</select>
</mapper>

在这里插入图片描述

1对多关系

查询出所有的部门信息及该部门下所有员工的信息

部门类

private Integer deptno;

	private String dname;

	private String loc;

	private List<Emp> emps;

映射文件
<mapper namespace="com.sxt.dao.IDeptDao">
	<resultMap type="Dept" id="baseResultMap">
		<id column="deptno" property="deptno" />
		<result column="dname" property="dname" />
		<result column="loc" property="loc" />
		<!-- 配置1对多的关联关系  ofType集合中泛型的类型-->
		<collection property="emps" ofType="Emp">
			<id column="empno" property="empno" />
			<result column="ename" property="ename" />
		</collection>
	</resultMap>

	<select id="query" resultMap="baseResultMap">
		SELECT
		d.deptno
		,d.dname
		,d.loc
		,e.empno
		,e.ename
		FROM dept d
		LEFT JOIN emp e
		ON d.deptno=e.deptno
	</select>
</mapper>

在这里插入图片描述

多对多关系

==双向的1对多既是多对多关系==

延迟加载

延迟查询是一对一和一对多查询的延续。   在默认的一对一和一对多中,一条SQL就能够查询到所有数据,但是,有的数据有时候一时半会用不上,例如查询员工,捎带获取员工的部门数据,但是部门数据使用的频率很低,这种时候可以使用延迟查询,首先获取到所有的员工数据,然后在需要的时候再去获取部门数据。==当需要使用数据的时候才去加载==既是延迟加载

开启延迟加载

全局配置文件中配置

<settings>
		<!-- 开启延迟加载 -->
		<setting name="lazyLoadingEnabled" value="true" />
		<setting name="aggressiveLazyLoading" value="false" />
	</settings>
<mapper namespace="com.sxt.dao.IEmpDao">
	<resultMap type="Emp" id="baseResultMap">
			<id column="empno" property="empno"/>
			<result column="ename" property="ename"/>
		<!-- 配置1对1的关联关系  property对应的是emp中部门成员变量的名称-->
		<association property="dept" javaType="Dept"
			column="deptno" select="queryDeptId">
			<id column="deptno" property="deptno"/>
			<result column="dname" property="dname"/>
			<result column="loc" property="loc"/>
		</association>
	</resultMap>
	
	<select id="queryDeptId" parameterType="int" resultType="Dept">
		SELECT * from dept where deptno=#{deptno}
	</select>
	
	<select id="query" resultMap="baseResultMap">
		SELECT
			e.empno
			,e.ename
			,e.deptno
		FROM emp e
	</select>
	
</mapper>

测试 只查询emp表的 在这里插入图片描述在这里插入图片描述在这里插入图片描述 查询emp表员工信息和所在的部门名称 在这里插入图片描述在这里插入图片描述在这里插入图片描述

1对多

<mapper namespace="com.sxt.dao.IDeptDao">
	<resultMap type="Dept" id="baseResultMap">
		<id column="deptno" property="deptno" />
		<result column="dname" property="dname" />
		<result column="loc" property="loc" />
		
		<!-- 配置1对多的关联关系  ofType集合中泛型的类型-->
		<collection property="emps" ofType="Emp" column="deptno" select="queryEmpById">
			<id column="empno" property="empno" />
			<result column="ename" property="ename" />
		</collection>
	</resultMap>
	<select id="queryEmpById" parameterType="int" resultType="Emp">
		select * from emp where deptno=#{deptno}
	</select>

	<select id="query" resultMap="baseResultMap">
		SELECT
		d.deptno
		,d.dname
		,d.loc
		FROM dept d
		
	</select>
</mapper>

在这里插入图片描述

缓存

 缓存(Cache )是计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是==降低==应用程序直接读写永久性数据存储源的==频率==,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝,应用程序在运行时直接读写缓存中的数据,只在某些特定时刻按照缓存中的数据来同步更新数据存储源。 缓存的物理介质通常是内存,而永久性数据存储源的物理介质通常是硬盘或磁盘,应用程序读写内在的速度显然比读写硬盘的速度快,如果缓存中存放的数据量非常大,也会用硬盘作为缓存的物理介质。缓存的实现不仅需要作为物理介质的硬件,同时还需要用于管理缓存的并发访问和过期等策略的软件。因此,缓存是通过软件和硬件共同实现的 作用:降低访问数据源【数据库】频率

缓存分类

类别 说明
一级缓存 事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。
二级缓存 进程范围:缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存、存的生命周期依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据,所以存放的介质可以是内存或硬盘
三级缓存 集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式

MyBatis支持1级缓存和2级缓存,在实际开发中,实际上很少使用到MyBatis自带的缓存,大部分情况下,缓存都是使用EHCache,MemoryCache、Redis等等来实现缓存。

以及缓存

MyBatis中1级缓存是基于SqlSession的

IDeptDao dao = session.getMapper(IDeptDao.class);
		Dept dept = dao.query(10);
		System.out.println(dept);
		System.out.println("----------");
		dept=dao.query(10);
		System.out.println(dept);
		

在这里插入图片描述

二级缓存

二级缓存基于SqlSessionFactory,一级缓存的作用域只是SqlSession,范围比较下,用到的不多。二级缓存是进程级别的缓存,用的比较普遍,二级缓存mybatis本身没有提供,常用的主键有Ehcache和Redis,本文主要讲解Ehcache

导包
<dependency>
	<groupId>net.sf.ehcache</groupId>
	<artifactId>ehcache</artifactId>
	<version>1.5.0</version>
</dependency>

<dependency>
	<groupId>org.mybatis.caches</groupId>
	<artifactId>mybatis-ehcache</artifactId>
	<version>1.1.0</version>
</dependency>

<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
IDeptDao dao = session.getMapper(IDeptDao.class);
		//先从1级缓存中查询看是是否有10的数据,如果没有去数据库中查询,并将查询的结果保存到1级缓存中
		Dept dept = dao.query(10);
		System.out.println(dept);
		//清空1级缓存
		session.close();
		session=factory.openSession();
		dao=session.getMapper(IDeptDao.class);
		System.out.println("----------");
		dept=dao.query(10);
		System.out.println(dept);
		

在这里插入图片描述

转载于:https://my.oschina.net/u/4116634/blog/3047227

分享到:
评论

相关推荐

    mybatis3--延迟加载,缓存

    在 MyBatis 中,延迟加载(Lazy Loading)和缓存是两个非常重要的特性,它们对于提升应用程序性能和减少数据库访问有着显著作用。 **延迟加载(Lazy Loading)** 延迟加载是一种设计模式,它在对象被首次请求时才...

    Mybatis延迟加载和缓存

    本篇将深入探讨 Mybatis 的两个重要特性:延迟加载(Lazy Loading)和缓存机制。 ### 延迟加载(Lazy Loading) 延迟加载是一种优化策略,它的核心思想是不立即加载所有数据,而是在实际需要时才进行加载。在 ...

    mybatis-3.2.7.zip

    - 对于一对一和一对多的关系映射,MyBatis提供了延迟加载功能,只有在真正需要子对象时才会执行关联的SQL查询。 12. **绑定Java对象与表**: - MyBatis可以自动将Java对象与数据库表进行绑定,通过`@TableId`, `@...

    mybatis配置dtd文件

    3. `&lt;settings&gt;`:设置MyBatis的运行时行为,如缓存、延迟加载等。 4. `&lt;typeAliases&gt;`:定义类型别名,简化Java类型在XML中的引用。 5. `&lt;plugins&gt;`:配置拦截器,用于增强MyBatis的功能。 6. `&lt;mappers&gt;`:定义...

    Mybatis延迟加载和缓存(基于XML配置).zip

    本知识点主要探讨Mybatis中的两个重要特性:延迟加载和缓存,以及如何在XML配置文件中进行相关设置。 **一、延迟加载(Lazy Loading)** 延迟加载是一种优化策略,它的核心思想是“按需加载”。在Mybatis中,延迟...

    MyBatis懒加载(延迟加载)

    3. **association标签**:在描述中提到的"association延迟加载",`&lt;association&gt;`是MyBatis映射文件中用来处理一对一关联关系的标签。当你配置了`fetchType="lazy"`,MyBatis会在你首次访问该关联对象的属性时执行...

    mybatis-3-mybatis-3.4.5.rar

    11. **延迟加载(Lazy Loading)**:MyBatis提供了延迟加载机制,当需要关联的对象时,才真正去数据库加载数据,提高性能。 12. **缓存(Cache)**:MyBatis内置了两级缓存,一级缓存是SqlSession级别的,二级缓存...

    MyBatis3--开发指南(附JavaDB实例)

    - **settings元素**:用来改变MyBatis的行为,比如启用或禁用缓存、延迟加载等。 ```xml ``` - **typeAliases元素**:为了减少重复的全限定类名,可以定义别名。 ```xml ``` - **typeHandlers...

    mybatis-3-config.zip

    3. `&lt;settings&gt;` 元素:用于设置 MyBatis 的全局配置参数,比如开启二级缓存、延迟加载等。例如,`lazyLoadingEnabled` 可以控制对象是否启用延迟加载,`aggressiveLazyLoading` 控制是否所有关联对象都进行延迟加载...

    Mybatis-3完整版源代码java-source-code

    5. **延迟加载(Lazy Loading)**:当需要提高性能时,可以配置 Mybatis 使用延迟加载策略,只在真正需要时才加载关联的对象。 通过对这些源代码的学习,开发者不仅可以提升 Mybatis 的使用技巧,还能深入理解 ORM ...

    MyBatis-3-User-Guide.rar_english_mybatis

    同时,通过延迟加载(Lazy Loading)可以在需要时才加载关联的对象,提高性能。 10. **Spring整合** MyBatis可以方便地与Spring框架集成,通过Spring的DataSourceTransactionManager进行事务管理,使用Spring的@...

    mybatis-超详细文档-文档

    - **懒加载**:延迟加载关联对象,减少不必要的数据库查询。 #### 五、MyBatis 与 Hibernate 的比较 **1. Hibernate 的特点** Hibernate 是一个全 ORM(对象关系映射)框架,它允许将 Java 对象直接映射到数据库...

    mybatis关联映射源码

    除了基本的配置,MyBatis还支持延迟加载(Lazy Loading)和缓存机制,以优化性能。延迟加载意味着在真正需要关联数据时才进行查询,而缓存则可以减少数据库的访问次数。通过合理的配置,可以有效地管理关联映射的...

    mybatis的config和mapper-dtd

    - **`settings`**: 这个元素包含了许多可调整的MyBatis全局设置,如缓存策略、延迟加载等。 - **`typeAliases`**: 定义类型别名,使得在映射文件中可以使用简短的类名代替全限定类名。 - **`environments`**: 定义...

    MyBatis的关联映射-资料.rar

    4. **延迟加载**:MyBatis提供了延迟加载功能,当首次访问关联对象时才执行SQL查询,而不是在主对象加载时一次性加载所有关联数据。这可以避免内存占用过多,但需要开启MyBatis的二级缓存和懒加载特性。 5. **联合...

    mybatis-3-master(1)_java_excitingwbh_数据库稳定_

    例如,它可以实现延迟加载(Lazy Loading),当真正需要关联数据时才执行查询,减少不必要的数据库交互。此外,MyBatis 支持结果集映射,能自动将查询结果转换为 Java 对象,避免了手动遍历结果集的繁琐工作。结合...

    mybatis-demo6-settings标签.zip

    如果设置为`true`,MyBatis将使用CGLIB或JDK动态代理对Mapper接口进行增强,以实现方法级别的缓存和延迟加载等功能。 4. **safeRowBoundsEnabled**:此属性控制是否启用安全的行边界。当设置为`true`时,MyBatis会...

    mybatis 的高级关联查询源码

    - 使用 `lazyLoadingEnabled` 属性可实现延迟加载,只有当访问到关联对象时才执行子查询,提高初次加载速度。 - `fetchSize` 设置可以控制每次从数据库读取的数据量,避免一次性加载大量数据导致内存溢出。 - `...

    mybatis-第三天.doc.pdf

    - MyBatis 是一个优秀的持久层框架,它简化了 JDBC 的操作,同时提供了强大的 SQL 映射功能和对象关系映射(ORM)能力。 - MyBatis 主要解决了传统 JDBC 编程中的繁琐工作,如手动管理 SQL 语句、结果集映射等,...

Global site tag (gtag.js) - Google Analytics