【ssm入门#4-MyBatis】延迟加载(一对一、一对多)+缓存机制(一级缓存、二级缓存)+注解开发(CRUD、属性映射、一对一、一对多、接口中注解开启二级缓存)+IDEA:找不到主类错误

本文详细介绍了MyBatis中的一对一延迟加载,一级缓存和二级缓存的工作原理及配置,包括如何开启二级缓存和注解开发中的缓存应用。此外,还解决了在IDEA中出现的找不到主类错误问题,提供了相应解决方案。
摘要由CSDN通过智能技术生成

本文基于下述教程编写:【B站】ssm教程

延迟加载


一对一

在MyBatis中,一对一的实现是靠<association>标签实现的,设置第二步查询的入口属性column赋予参数,传递给select此属性指向的从表实体类的操作方法,即可实现。还要注意延迟加载<configuration><environments>标签前设置延迟加载开关:

<settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
</settings>

实质上延迟加载需要到用到主表从表两个Dao配置文件,主表配置文件中只需要写查询自己的SQL语句,并把参数传过去调用从表属性的配置文件实现封装。
在这里插入图片描述
在这里插入图片描述
当测试方法只是单纯调用延迟加载方法时,并未对查询得到的结果操作,这时只是会执行主表配置文件的查询语句,而后续对从表实体类的查询并未进行。当然主表实体类一经操作,自然调用所有查询,即从表实体类也会立即查询得到结果并封装。
第一步查询进行时

缓存机制


一级缓存
myBatis中, dao操作类接口是由 sqlSession代理实现的,所以多个不同的 dao可以由同一个 sqlSession实现,此时不同的 dao拥有同样的一级缓存,进行同样的查询操作不会重新执行,即一级缓存中拥有同一的缓存对象。当 sqlSession关闭或者清除缓存之后,两个 dao将会执行两次同样的查询。

 sqlSession.clearCache();//清除
 sqlSession.close();//关闭

值得注意,一级缓存是 SqlSession 范围的缓存,当调用 SqlSession修改添加删除commit()close()等方法时,就会清空一级缓存。

二级缓存
myBatis中,二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个 SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。 由于SqlSessionFactory中开启的SqlSession,二级缓存是在SqlSessionFactory对象的缓存区上。当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化 方式来保存对象。

在一级缓存关闭的情况下,即使二级缓存正确开启使用,所取出的缓存对象也是不一致的,主要是二级缓存是通过存储序列化信息方式保存的对象内容,反序列化就重新实例化了新对象。但是SQL语句确实只是执行了一遍。

开启步骤:
第一步:在 主配置文件SqlMapConfig.xml 开启二级缓存

<settings> 
 <!-- 开启二级缓存的支持 -->  <setting name="cacheEnabled" value="true"/> 
 </settings> 
因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。为 true 代表开启二级缓存;为 false 代表不开启二级缓存。 

第二步:配置相关的 Mapper 映射文件

<cache>标签表示当前这个 mapper 映射将使用二级缓存,区分的标准就看 mapper 的 namespace 值。 
<?xml version="1.0" encoding="UTF-8"?> 
<<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值