• 07 MyBatis之高级映射 + 懒加载(延迟加载)+缓存


    1. 分页

    1.1 用pageHepler进行分页

    先添加依赖

    <dependency>
        <groupId>com.github.pagehelpergroupId>
        <artifactId>pagehelper-spring-boot-starterartifactId>
        <version>1.2.5version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    其次, 配置文件

    # PageHelper 分页插件配置
    pagehelper: 
    	helperDialect: mysql
    	reasonable=true
    	supportMethodsArguments: true
    	params=count: countSql
    	#pagehelper.params=count=countSql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.1.1 实际代码

    每一个service(或mapper)方法执行查询前,调用一次 PageHelper.startPage(pageNum,pageSize) 来设置分页查询参数即可,其中pageNum 为记录页数,pageSize 为单页记录数量。此时service(或mapper)方法的查询结果就是分页后的结果了。

    如果要获得相关的分页信息,还可以将查询结果封装到PageInfo对象中,以获得总页数、总记录数、当前页数等相关分页信息

    @ResponseBody
    @RequestMapping("/findPage")
    public List<Student> findPage(@RequestParam int pageNum, @RequestParam int pageSize) {
        // 设置分页查询参数
        PageHelper.startPage(pageNum,pageSize);
        List<Student> studentList = studentService.findList();
    
        for(Student student : studentList) {
            System.out.println("element : " + student);
        }
    
        // 封装分页查询结果到 PageInfo 对象中以获取相关分页信息
        PageInfo pageInfo = new PageInfo( studentList );
        System.out.println("总页数: " + pageInfo.getPages());
        System.out.println("总记录数: " + pageInfo.getTotal());
        System.out.println("当前页数: " + pageInfo.getPageNum());
        System.out.println("当前页面记录数量: " + pageInfo.getSize());
    
        return pageInfo.getList();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2. 缓存

    缓存的作用: 通过减少IO的方式,来提高程序的执行效率

    常用的缓存技术有: 字符串常量池 , 整型数常量池 , 线程池 , 连接池

    mybats的缓存存:将select语的查询结果放到到缓存(内存)
    下次还是这条select的话,直接从缓存(内存)中取,不再从外存中查.

    mybatis缓存包括:

    • 一级缓存:将查询到的数据存储到SqlSession中。
    • 二级缓存:将查询到的数据存储到SqlSessionFactory中 , 缓存空间更大
    • 或者集成其它第三方的缓存: 比如EhCache[Java语言开发的]、Memcache[C语言开发的]

    缓存只针对于DQL语句,也就是说缓存机制只对应select语句.

    2.1 一级缓存

    一级缓存默认是开启的。不需要做任何配置

    2.1.1 一级缓存生效

    原理:只要使用同一个SqlSession对象执行同一条SQL语句,就会走缓存

    可以看到 ,当使用同一个sqlSession对象执行相同的SQL语句时, 后台实际只执行了一次, 却输出了两条结果
    在这里插入图片描述
    在这里插入图片描述

    2.1.1 一级缓存失效

    • sqlSession对象不是同一个肯定不走缓存
    • 查询条件不一样肯定不走缓存
    • 即使上述同时两个条件, 如果在第一次DQL和第二次DQL之间发生以下两件事情的任意一件, 会令缓存清空
      a. 执行了sqlSession的clearCache()方法 , 这会手动清空一级缓存
      b. 执行了INSERT/DELETE/UPDATE任意一个语句时 , 不管是操作哪张表 都会直接清空一级缓存(思想是避免修改了数据后 , 输出缓存中的假数据)

    2.2 二级缓存

    二级缓存的范围是SqlSessionFactory。

    2.2.1 二级缓存生效

    使用二级缓存必须同时具备以下条件

    • 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。默认就是true,无需设置。
    • 在需要使用二级缓存的SqlMapper.xml文件中添加配置:
    • 使用二级缓存的实体类对象必须是可序列化的,也就是必须实现java.io.Serializable接口
    • SqlSession对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中。此时二级缓存才可用。

    2.2.1 二级缓存失效

    只要两次查询之间出现了增删改操作。二级缓存就会失效。【一级缓存也会失效】

    2.2.2 二级缓存相关配置

    在这里插入图片描述

    1. eviction:指定从缓存中移除某个对象的淘汰算法。默认采用LRU策略。
      a. LRU:Least Recently Used。最近最少使用。优先淘汰在间隔时间内使用频率最低的对象。(其实还有一种淘汰算法LFU,最不常用。)
      b. FIFO:First In First Out。一种先进先出的数据缓存器。先进入二级缓存的对象最先被淘汰。
      c. SOFT:软引用。淘汰软引用指向的对象。具体算法和JVM的垃圾回收算法有关。
      d. WEAK:弱引用。淘汰弱引用指向的对象。具体算法和JVM的垃圾回收算法有关。
    2. flushInterval:
      a. 二级缓存的刷新时间间隔。单位毫秒。如果没有设置。就代表不刷新缓存,只要内存足够大,一直会向二级缓存中缓存数据。除非执行了增删改。
    3. readOnly:
      a. true:多条相同的sql语句执行之后返回的对象是共享的同一个。性能好。但是多线程并发可能会存在安全问题。
      b. false:多条相同的sql语句执行之后返回的对象是副本,调用了clone方法。性能一般。但安全。
    4. size:
      a. 设置二级缓存中最多可存储的java对象数量。默认值1024。
  • 相关阅读:
    常见分布式事务解决方案
    python Never是什么?
    模块化
    MySQL高可用
    10.cuBLAS开发指南中文版--cuBLAS中的logger配置
    二叉搜索树——C++
    mybatis-plus 操作json字段
    宏观视角下的浏览器
    IQ Products CMV Brite Turbo试剂盒的原理
    C#知识|通过ADO.NET实现应用程序对数据库的增、删、改操作。
  • 原文地址:https://blog.csdn.net/m0_46671240/article/details/136239867