本文基于下述教程编写:【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"?>
<<