MyBatis缓存

一、分 页

1.方式一 :limit  物理分页

// 方式一 limit  物理分页
@Select("select * from student limit #{param1},#{param2}")
public List<Student> findStudentPagelimit(int wz, int bc);

2.方式二:RowBounds 逻辑分页

// 方式二 RowBounds 逻辑分页
@Select("select * from student")
public List<Student> findStudentPageRowBounds(RowBounds rb);

3.方式三:第三方插件 PageHelper

 步骤:

3.1 导入jar包

3.2 配置插件
<!-- 思想:面向切面 -->
	<plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>
3.3 调用方法
// 方式三 第三方插件 PageHelper

@Select("select * from student")

public List<Student> findStudentPageHelper();
package com.ztt.test;


public class Test {

	public static void main(String[] args) {
		

		SqlSession sqlSession = DaoUtil.getSqlSession();
		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);
//		List<Student> slist = stuMapper.findStudentPagelimit((1-1)*3, 3);
		
//		RowBounds rb = new RowBounds((2-1)*3,3);
//		
//		List<Student> slist = stuMapper.findStudentPageRowBounds(rb);
		
		Page<Object> startPage = PageHelper.startPage(8, 2);
		List<Student> slist = stuMapper.findStudentPageHelper();
		
//		PageInfo<Student> pageInfo = new PageInfo<Student>(slist);
		
		
		
//		slist.forEach(System.out::println);
		
//		System.out.println(startPage);
//		System.out.println(pageInfo);
		
		DaoUtil.closeResource(sqlSession);

	}

}

二、延 迟 加 载 和 立 即 加 载

1.什么是立即加载

        立即加载是: 不管用不用信息,只要调用,马上发起查询并进行加载 

比如: 当我们查询学生信息时,就需要知道学生在哪个班级中,所以就需要立马去查询班级的信息

通常:当 一对一或者 多对一的时候需要立即加载

2.什么是延迟加载

        延迟加载是: 在真正使用数据时才发起查询,不用的时候不查询,按需加载(也叫懒加载)

比如: 在查询班级信息,每个班级都会有很多的学生(假如每个班有100个学生),如果我们只是查看 班级信息,但是学生对象也会加载到内存中,会造成浪费。 所以我门需要进行懒加载,当确实需要查看班级中的学生信息,我门在进行加载班级中的学生信息。

通常: 一对多,或者多对多的是需要使用延迟加载 

3.延迟加载的配置

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

如果设置 lazyLoadingEnabled = false,则禁用延迟加载,会级联加载所有关联对象的数据 如果设置 lazyLoadingEnabled = true,默认情况下mybatis 是按层级延时加载的。 aggressiveLazyLoading = true,mybatis 是按层级延时加载 aggressiveLazyLoading = false,mybatis 按需求加载。 

三、一级缓存

1.什么是缓存

        缓存(cache),数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在 缓冲区中,应用程序从缓冲区读取数据。 

1.1 特点:

        数据库取出的数据保存在内存中,具备快速读取和 使用。

1.2 限制:

        读取时无需再从数据库获取,数据可能不是最新的;

2.缓存的术语

针对 缓存数据命中 需要的数据在缓存中找到结果。
未命中需要的数据在缓存中未找到,重新获取

3.什么是 MyBatis 缓存

功能: 减少 Java Application 与数 据库的交互次数,从而提升程 序的运行效率;

方式: 通过配置和定制。 

4.缓存的适用性

适合使用缓存: 经常查询并且不经常改变的 数据的正确与否对最终结果影响不大的 比如:一个公司的介绍,新闻等

不适合使用缓存: 经常改变的数据 数据的正确与否对最终结果影响很大 比如商品的库存,股市的牌价等

5.MyBatis 缓存分类

  • 一级缓存 会话 session 级别的缓存,针对一 次会话操作内;
  • 二级缓存 映射器级别的缓存,针对不同 Namespace 的映射器;
  • 自定义缓存 根据各类不同的缓存机制,自定义 缓存的实现方式。 

6.一级缓存 SqlSession

        SqlSession 默认开启,一级缓存只是相对同一个 SqlSession 对象而言。

Student stu1 = sm.findStudentBysid(1);
student stu2 = sm.findStudentBysid(1);
system.out.println(stu1 == stu2);

输出结果为true 

student stu1 = sm.findStudentBysid( 1);

sqlSession.close( );

sqlSession = DBUtil.getsqlSession( );

sm= sqlSession.getMapper( StudentMapper.class) ;
sqlSession.clearCache();|
student stu2 = sm.findStudentBysid(1);
system.out.print1n( stu1 == stu2);
DBUtil.sqlsessionClose(sqlSession) ;

输出结果为false 

关闭sqlsession 或者情况sqlsession缓存都可以实现

注意:当调用sqlsession的修改,添加,删除,commit(),close() 等方法是, 就会清空一级缓存

7.一级缓存失效情况

不同SqlSession对应不同的一级缓存

同一个SqlSession单查询条件不同

同一个SqlSession两次查询期间执行了任何一次增删改操作

同一个SqlSession两次查询期间手动清空了缓存 

四、二级缓存

 1.配置步骤:

1.1 在mybatis的mybatis-config.xml中配置

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

1.2 在mybatis的sqlmap中配置(mapper.xml中配置)

1.3 在使用的操作中配置(在select标签中配置)

 

2.二级缓存—注解

配置步骤:

2.1 在mybatis的sqlMapConfig.xml 中配置

2.2 在接口的定义上面直接使用@CacheNamespace 并将blocking设置为true,二级缓存就可以使用了 

 

2.3 二级缓存小结

  • Mybatis 的二级缓存相对于一级缓存来说, 实现了缓存数据的共享,可控性也更强;
  • 极大可能会出现错误数据,有设计上的缺陷,安全使用的条件比较苛刻;
  • 分布式环境下,必然会出现读取到错误 C 数据,所以不推荐使用。

五、自定义缓存

1.自定义缓存分类

  • 实现缓存接口 实现 org. apache. ibatis. cache. Cache 接口自定义缓存;
  • 引入第三方缓存 引入 Redis 等第三方内存库 作为 MyBatis 缓存。 

 

 

 

 

 

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值