mybatis分页、延迟加载、立即加载、一级缓存、二级缓存

这篇具有很好参考价值的文章主要介绍了mybatis分页、延迟加载、立即加载、一级缓存、二级缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分页

分类

  1. 使用Limit,来进行分页;物理分页
  2. 使用RowBounds集合来保存分页需要数据,来进行分页;逻辑分页;本质是全查,只是显示部分
  3. 使用分页插件来进行分页;物理分页

方式一:

//limit分页
	@Select("select * from student limit #{arg0},#{arg1}")
	public List<Student> selectStudentLimit(int sp,int cp);

//获取数据
List<Student> slist = sm.selectStudentLimit((1-1)*3,3);

方式二:

//RowBounders
	public List<Student> selectStudentRB(RowBounds rb);

//获取数据
List<Student> slist = sm.selectStudentRB(new RowBounds(2,3));

方式三:

首先导入两个jar包:

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存,MyBatis,mybatis,缓存

配置插件:

<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存,MyBatis,mybatis,缓存

//分页
	@Select("select * from student")
	public List<Student> selectStudentPageHelper();

调用:

Page<Object> page = PageHelper.startPage(1, 3);
List<Student> list = mapper.selectStudentPageHelper();
list.forEach(System.out::println);

//page对象可以获取
System.out.println(page);
//详细分页对象
PageInfo<Studnet> pageinfo = new PageInfo<Student>(list,3);
System.out.println(pageinfo);

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存,MyBatis,mybatis,缓存

字段 含义
pageNum 当前页的页码
pageSize 每页显示的条数
size 当前页显示的真实条数
total 总记录数
pages 总页数
prePage 上一页的页码
nextPage 下一页的页码
isFirstPage / isLastPage 是否为第一页/是否为最后一页
hasPrevivousPage / hasNextPage 是否存在上一页/是否存在下一页
navigatePages d导航分页的码数
navigatepageNums d导航分页的页码,[1,2,3,4…]

延迟加载和立即加载

立即加载:不管用不用信息,只要调用,马上发起查询并进行加载;通常,当 一对一或者多对一的时候需要立即加载

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

延迟加载:在真正使用数据时才发起查询,不用的时候不查询,按需加载(也叫 懒加载);通常, 一对多,或者多对多的是需要使用延迟加载

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

延迟加载的配置

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存,MyBatis,mybatis,缓存

如果设置 lazyLoadingEnabled = false,则禁用延迟加载,会级联加载所有关联对象的数据

如果设置 lazyLoadingEnabled = true,默认情况下mybatis 是按层级延时加载的。

aggressiveLazyLoading = true,mybatis 是按层级延时加载

aggressiveLazyLoading = false,mybatis 按需求加载。

sqlmapper中:

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存,MyBatis,mybatis,缓存

注解方式开启

//开启二级缓存
@CacheNamespace(blocking = true)
public interface StudentMapper {
    ...
}

缓存

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

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

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

命中、未命中:需要的数据在缓存中找到结果为命中;需要的数据在缓存中未找到,重新获取为未命中。

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

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

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

数据的正确与否对最终结果影响很大

比如商品的库存,股市的牌价等

一级缓存

一级缓存会话 session 级别的缓存,针对一次会话操作内,默认开启

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存,MyBatis,mybatis,缓存

public static void main(String[] args) {
		
		SqlSession sqlSession = DaoUtil.getSqlSession();
		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);
   		Student s = stuMapper.findStudentBySid(1);
    
    	//SqlSession sqlSession2 = DaoUtil.getSqlSession();
		//StudentMapper stuMapper2 = sqlSession2.getMapper(StudentMapper.class);
		Student s2 = stuMapper2.findStudentBySid(1);

		System.out.println(s == s2);//true
		
		//		DaoUtil.closeResource(sqlSession);
		
		// 1. 不同的SqlSession
		SqlSession sqlSession2 = DaoUtil.getSqlSession();
		StudentMapper stuMapper2 = sqlSession2.getMapper(StudentMapper.class);		
		
		Student s2 = stuMapper2.findStudentBySid(1);
		System.out.println(s2);

		System.out.println(s == s2);//false
		DaoUtil.closeResource(sqlSession2);
		
		// 2. 在同一个sqlSession中进行增删改操作
		int ret = stuMapper.addStudent(new Student());
		System.out.println(ret);
		
		// 3. 主动的清空缓存
		sqlSession.clearCache();
		
		// 4. sql语句不同
		Student s2 = stuMapper.findStudentBySid(1);
		System.out.println(s2);
		
		System.out.println(s == s2);
		DaoUtil.closeResource(sqlSession);	
	}

一级缓存失效的四种情况

  1. 不同SqlSession对应不同的一级缓存
  2. 同一个SqlSession单查询条件不同
  3. 同一个SqlSession两次查询期间执行了任何一次增删改操作
  4. 同一个SqlSession两次查询期间手动清空了缓存

二级缓存

不会用的

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存,MyBatis,mybatis,缓存

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存,MyBatis,mybatis,缓存

特点:文章来源地址https://www.toymoban.com/news/detail-801829.html

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

到了这里,关于mybatis分页、延迟加载、立即加载、一级缓存、二级缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis 中的一级缓存与二级缓存

      缓存的意义是将用户经常查询的数据放入缓存(内存)中去,用户去查询数据的时候就不需要从磁盘(关系型数据库)中查询,直接从缓存中查询,从而提高了查询效率,解决了高并发中系统的性能问题。Mybatis中提供一级缓存与二级缓存。   Mybatis的一级缓存是一个

    2024年02月08日
    浏览(28)
  • Mybatis一级缓存和二级缓存(带测试方法)

    目录 相关导读 一、什么是缓存  二、Mabtis一级缓存 (1)测试一级缓存

    2023年04月08日
    浏览(65)
  • Mybatis的一级、二级缓存怎样使用?

    一级缓存基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。 二级缓存是基于namespace和mappe的作用域起作用的,不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储 当某一个作用域

    2024年02月16日
    浏览(29)
  • mybatis的一级二级缓存详解及源码解剖

    一级缓存是指在同一个SqlSession中,对于相同的查询语句和参数,第一次查询的结果会被缓存到内存中,后续的查询会直接从缓存中获取结果,而不会再次查询数据库。一级缓存是MyBatis默认开启的,可以通过在SqlSession中调用clearCache()方法来清空缓存。 二级缓存是指在多个Sq

    2024年02月05日
    浏览(36)
  • Mr. Cappuccino的第55杯咖啡——Mybatis一级缓存&二级缓存

    缓存越小,查询速度越快,缓存数据越少 缓存越大,查询速度越慢,缓存数据越多 在多级缓存中,一般常见的是先查询一级缓存,再查询二级缓存,但在Mybatis中是先查询二级缓存,再查询一级缓存。 在Mybatis中,BaseExecutor属于一级缓存执行器,CachingExecutor属于二级缓存执行

    2024年02月14日
    浏览(33)
  • MyBatis-Plus一级缓存和二级缓存-redis解决缓存的脏数据

    什么是缓存? 1.存在内存中的临时数据 2.将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库 数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。 为什么使用缓存 减少和数据库的交互次数,减少系统开

    2024年02月09日
    浏览(30)
  • Mybatis延迟加载(缓存)

    分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息: lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载 aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载 此时就

    2024年02月07日
    浏览(26)
  • 【MyBaits】4、延迟加载、MyBatis 的缓存

    🍃 关联对象( association 、 collection )可以实现延迟加载 🍃 实现延迟加载需设置如下属性 fetchType :设置为 lazy select :指定一个 select 标签的 id(用于查询需要延迟加载的记录) column :指定一个列的值(作为 select 查询时传入的参数值) 🍃 一般会给 collection 设置延迟加载

    2024年02月09日
    浏览(26)
  • MyBatis缓存-提高检索效率的利器--一级缓存

    😀前言 本篇博文是关于MyBatis一级缓存的介绍使用和缓存失效情况分析,希望能够帮助到您😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博

    2024年02月14日
    浏览(29)
  • 手敲Mybatis(16章)-一级缓存功能实现

    这一节的目的主要是实现SqlSession级别的缓存,也就是一级缓存,首先看下图一,用户可以通过设置来进行是否开启一级缓存,不设置的化默认开启一级缓存,localCacheScope=SESSION为要设置一级缓存,localCacheScope=STATEMENT为不要设置一级缓存,(所以后面在清理缓存时会进行判断,

    2024年02月01日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包