mybatis-demo04-延迟和缓存
作者:互联网
一、Mybatis 延迟加载策略
理解:在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.
1.在 SqlMapConfig.xml 文件中添加延迟加载的配置
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!-- collection 是用于建立一对多中集合属性的对应关系
ofType 用于指定集合元素的数据类型
select 是用于指定查询账户的唯一标识(账户的 dao 全限定类名加上方法名称)
column 是用于指定使用哪个字段的值作为条件查询 -->
<collection property="accounts" ofType="account"
select="IAccountDao.findByUid" column="id"> </collection>
二、Mybatis 缓存
一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在。
配置xml文件可以省略
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
验证
/**
* 判断一级缓存是否存在
* @throws IOException
*/
@Test
public void OneLevelCache() throws IOException{
user users = iuserDao.FindById(41);
System.out.println(users);
user users1 = iuserDao.FindById(41);
System.out.println(users1);
System.out.println(users1==users);
//true
}
/**
* 把一级缓存关掉后,看看什么情况
* @throws IOException
*/
@Test
public void OneLevelCache1() throws IOException{
user users = iuserDao.FindById(41);
System.out.println(users);
/* sqlSession.close();//关掉建造的对象
sqlSession = factory.openSession();//重新打开
*/
sqlSession.clearCache();//清除掉缓存
iuserDao= sqlSession.getMapper(IuserDao.class);
user users1 = iuserDao.FindById(41);
System.out.println(users1);
System.out.println(users1==users);//false 与上面不一样
}
/**
* 更行后数据如何查找
* @throws IOException
*/
@Test
public void uptateCache1() throws IOException{
user user1 = iuserDao.FindById(41);
user1.setUsername("张三");
user1.setAddress("南京");
iuserDao.updateById(user1);
System.out.println(user1);
user users1 = iuserDao.FindById(41);
System.out.println(users1==user1);//false 与上面不一样
}
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个 SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的
<settings>
<!-- 开启二级缓存的支持 -->
<setting name="cacheEnabled" value="true"/> </settings>
因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。为 true 代表开启二级缓存;为 false 代表不开启二级缓存。
第二步:配置相关的 Mapper 映射文件 ,配置 statement 上面的 useCache 属性
<mapper namespace="dao.IuserDao">
<cache/>
<select id="FindById" resultType="user" parameterType="int" useCache="true">
SELECT *FROM USER where id = #{id};
</select>
</mapper>
将 UserDao.xml 映射文件中的标签中设置 useCache=”true”代表当前这个 statement 要使用 二级缓存,如果不使用二级缓存可以设置为 false。 注意:针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。
测试:
public class secendCache {
private IuserDao iuserDao =null;
private InputStream is=null;
private SqlSessionFactory factory=null;
@Before
public void init()
{
is = Resources.class.getResourceAsStream("/X1sqlMybatisConfig.xml");
//2.创建SqlSessionFactory工厂 mybatis使用了构建者模式(类似工厂)
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(is);
}
@After
public void destory() throws IOException {
is.close();
}
/**
* 判断er级缓存是否存在
* @throws IOException
*/
@Test
public void Cache() throws IOException{
SqlSession sqlSession = factory.openSession();
IuserDao iuserDao = sqlSession.getMapper(IuserDao.class);
user user = iuserDao.FindById(41);
System.out.println(user);
sqlSession.close();
SqlSession sqlSession1 = factory.openSession();
IuserDao iuserDao1= sqlSession1.getMapper(IuserDao.class);
damain.user user1 = iuserDao1.FindById(41);
System.out.println(user1);
sqlSession1.close();
System.out.println(user==user1);
}
}
标签:缓存,iuserDao,System,println,IOException,user,demo04,mybatis,out 来源: https://blog.csdn.net/weixin_46809332/article/details/115585225