@[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);
相关推荐
在 MyBatis 中,延迟加载(Lazy Loading)和缓存是两个非常重要的特性,它们对于提升应用程序性能和减少数据库访问有着显著作用。 **延迟加载(Lazy Loading)** 延迟加载是一种设计模式,它在对象被首次请求时才...
本篇将深入探讨 Mybatis 的两个重要特性:延迟加载(Lazy Loading)和缓存机制。 ### 延迟加载(Lazy Loading) 延迟加载是一种优化策略,它的核心思想是不立即加载所有数据,而是在实际需要时才进行加载。在 ...
- 对于一对一和一对多的关系映射,MyBatis提供了延迟加载功能,只有在真正需要子对象时才会执行关联的SQL查询。 12. **绑定Java对象与表**: - MyBatis可以自动将Java对象与数据库表进行绑定,通过`@TableId`, `@...
3. `<settings>`:设置MyBatis的运行时行为,如缓存、延迟加载等。 4. `<typeAliases>`:定义类型别名,简化Java类型在XML中的引用。 5. `<plugins>`:配置拦截器,用于增强MyBatis的功能。 6. `<mappers>`:定义...
本知识点主要探讨Mybatis中的两个重要特性:延迟加载和缓存,以及如何在XML配置文件中进行相关设置。 **一、延迟加载(Lazy Loading)** 延迟加载是一种优化策略,它的核心思想是“按需加载”。在Mybatis中,延迟...
3. **association标签**:在描述中提到的"association延迟加载",`<association>`是MyBatis映射文件中用来处理一对一关联关系的标签。当你配置了`fetchType="lazy"`,MyBatis会在你首次访问该关联对象的属性时执行...
11. **延迟加载(Lazy Loading)**:MyBatis提供了延迟加载机制,当需要关联的对象时,才真正去数据库加载数据,提高性能。 12. **缓存(Cache)**:MyBatis内置了两级缓存,一级缓存是SqlSession级别的,二级缓存...
- **settings元素**:用来改变MyBatis的行为,比如启用或禁用缓存、延迟加载等。 ```xml ``` - **typeAliases元素**:为了减少重复的全限定类名,可以定义别名。 ```xml ``` - **typeHandlers...
3. `<settings>` 元素:用于设置 MyBatis 的全局配置参数,比如开启二级缓存、延迟加载等。例如,`lazyLoadingEnabled` 可以控制对象是否启用延迟加载,`aggressiveLazyLoading` 控制是否所有关联对象都进行延迟加载...
5. **延迟加载(Lazy Loading)**:当需要提高性能时,可以配置 Mybatis 使用延迟加载策略,只在真正需要时才加载关联的对象。 通过对这些源代码的学习,开发者不仅可以提升 Mybatis 的使用技巧,还能深入理解 ORM ...
同时,通过延迟加载(Lazy Loading)可以在需要时才加载关联的对象,提高性能。 10. **Spring整合** MyBatis可以方便地与Spring框架集成,通过Spring的DataSourceTransactionManager进行事务管理,使用Spring的@...
- **懒加载**:延迟加载关联对象,减少不必要的数据库查询。 #### 五、MyBatis 与 Hibernate 的比较 **1. Hibernate 的特点** Hibernate 是一个全 ORM(对象关系映射)框架,它允许将 Java 对象直接映射到数据库...
除了基本的配置,MyBatis还支持延迟加载(Lazy Loading)和缓存机制,以优化性能。延迟加载意味着在真正需要关联数据时才进行查询,而缓存则可以减少数据库的访问次数。通过合理的配置,可以有效地管理关联映射的...
- **`settings`**: 这个元素包含了许多可调整的MyBatis全局设置,如缓存策略、延迟加载等。 - **`typeAliases`**: 定义类型别名,使得在映射文件中可以使用简短的类名代替全限定类名。 - **`environments`**: 定义...
4. **延迟加载**:MyBatis提供了延迟加载功能,当首次访问关联对象时才执行SQL查询,而不是在主对象加载时一次性加载所有关联数据。这可以避免内存占用过多,但需要开启MyBatis的二级缓存和懒加载特性。 5. **联合...
例如,它可以实现延迟加载(Lazy Loading),当真正需要关联数据时才执行查询,减少不必要的数据库交互。此外,MyBatis 支持结果集映射,能自动将查询结果转换为 Java 对象,避免了手动遍历结果集的繁琐工作。结合...
如果设置为`true`,MyBatis将使用CGLIB或JDK动态代理对Mapper接口进行增强,以实现方法级别的缓存和延迟加载等功能。 4. **safeRowBoundsEnabled**:此属性控制是否启用安全的行边界。当设置为`true`时,MyBatis会...
- 使用 `lazyLoadingEnabled` 属性可实现延迟加载,只有当访问到关联对象时才执行子查询,提高初次加载速度。 - `fetchSize` 设置可以控制每次从数据库读取的数据量,避免一次性加载大量数据导致内存溢出。 - `...
- MyBatis 是一个优秀的持久层框架,它简化了 JDBC 的操作,同时提供了强大的 SQL 映射功能和对象关系映射(ORM)能力。 - MyBatis 主要解决了传统 JDBC 编程中的繁琐工作,如手动管理 SQL 语句、结果集映射等,...