[SSM]MyBatis的缓存与逆向工程

目录

十三、MyBatis的缓存

13.1一级缓存

13.2二级缓存

13.3MyBatis集成EhCache

十四、MyBatis的逆向工程

14.1逆向工程配置与生成

14.2测试


十三、MyBatis的缓存

[SSM]MyBatis的缓存与逆向工程_第1张图片

  • 缓存:cache

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

  • mybatis的缓存:将select语句的查询结果放到缓存(内存)当中,下一次还是执行这条select语句的话,直接从缓存中取,不再查数据库。

    • 减少了IO

    • 不再执行繁琐的查找算法,效率大大提升。

  • mybatis的缓存包括:

    • 一级缓存:将查询的数据存储到SqlSession中。

    • 二级缓存:将查询到的数据存储到SqlSessionFactory中。

    • 或者集成其它第三方的缓存:比如EhCache[Java语言开发的]、Memcache[C语言开发的]等。

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

13.1一级缓存

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

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

  • 什么情况下不走缓存:

    • 第一种:不同的SqlSession对象。

    • 第二种:查询条件变化了。

  • 一级缓存失效情况包括两种:

    • 第一种:第一次查询和第二次查询之间,手动清空了一级缓存。

     @Test
        public void testSelectById(){
            SqlSession sqlSession = SqlSessionUtil.openSession();
    ​
            CarMapper mapper1 = sqlSession.getMapper(CarMapper.class);
            Car car1 = mapper1.selectById(164L);
            System.out.println(car1);
    ​
            // 手动清空一级缓存
            sqlSession.clearCache();
    ​
            CarMapper mapper2 = sqlSession.getMapper(CarMapper.class);
            Car car2 = mapper2.selectById(164L);
            System.out.println(car2);
    ​
            sqlSession.commit();
            sqlSession.close();
    • 第二种:第一次查询和第二次查询之间,执行力增删改操作。【这个增删改和哪张表没有关系,只有insert delete update操作,一级缓存就失效】

    @Test
        public void testSelectById(){
            SqlSession sqlSession = SqlSessionUtil.openSession();
    ​
            CarMapper mapper1 = sqlSession.getMapper(CarMapper.class);
            Car car1 = mapper1.selectById(164L);
            System.out.println(car1);
    ​
            // 在这里执行了INSERT DELETE UPDATE中的任意一个语句。并且和表没有关系。
            CarMapper mapper = sqlSession.getMapper(CarMapper.class);
            mapper.insertClazz(2000, "高三三班");
    ​
            CarMapper mapper2 = sqlSession.getMapper(CarMapper.class);
            Car car2 = mapper2.selectById(164L);
            System.out.println(car2);
    ​
            sqlSession.commit();
            sqlSession.close();

13.2二级缓存

  • 二级缓存的范围是SqlSessionFactory。

  • 使用二级缓存需要具备以下几个条件:

    • 在mybatis核心配置文件中全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。默认是true,无需设置。

    [SSM]MyBatis的缓存与逆向工程_第2张图片

    • 在需要使用二级缓存的SqlMapper.xml文件中添加配置:

    
    
    
    ​
        
    ​
        
    • 使用二级缓存的实体类对象必须是可序列化的,也就是必须实现java.io.Serializable接口。

    • SqlSession对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中,此时二级缓存才可用。

     @Test
        public void testSelectById() throws IOException {
            //这里只有一个SqlSessionFactory对象,二级缓存对应的就是SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
            SqlSession sqlSession1 = sqlSessionFactory.openSession();
            SqlSession sqlSession2 = sqlSessionFactory.openSession();
            CarMapper mapper1 = sqlSession1.getMapper(CarMapper.class);
            CarMapper mapper2 = sqlSession2.getMapper(CarMapper.class);
    ​
            //这段代码执行之后,实际上数据是缓存到一级缓存当中了。(sqlSession1是一级缓存)
            Car car1 = mapper1.selectById(40L);
            System.out.println(car1);
            //如果这里不关闭SqlSession1对象的话,二级缓存中是没有数据的。
            //程序执行到这里的时候,会将sqlSession1这个一级缓存中的数据写入到二级缓存中。
            sqlSession1.close();
    ​
            //这段代码执行之后,实际上数据是缓存到一级缓存当中了。(sqlSession2是一级缓存)
            Car car2 = mapper2.selectById(40L);
            System.out.println(car2);
    ​
            sqlSession2.close();
        }
  • 二级缓存的失效:只要查询两次之间出现了增删改操作,二级缓存就会失效。【一级缓存也会失效】

  • 二级缓存的相关配置:

[SSM]MyBatis的缓存与逆向工程_第3张图片

  • eviction(驱逐):指定从缓存中移除某个对象的淘汰算法。默认使用LRU策略。

    • LRU:Least Recently User。最近最少使用。优先淘汰在间隔时间内使用频率最低的对象。(其实还有一种淘汰算法LFU,最不常用。)

    • FIFO:First In First Out。一种先进先出的数据缓存器。先进入二级缓存的对象最先被淘汰。

    • SOFT:软引用。

    • WEAK:弱引用。

  • flushInterval:

    • 二级缓存的刷新时间间隔。单位毫秒。如果没有配置,就代表不刷新缓存,只要内存足够大,一直会向二级缓存中缓存数据,除非执行力增删改。

  • readOnly:

    • true:多条相同的sql语句执⾏之后返回的对象是共享的同⼀个。性能好。但是多线程并发可能会存在安全问题。

    • false:多条相同的sql语句执⾏之后返回的对象是副本,调⽤了clone⽅法。性能⼀般。但安全。

  • size:

    • 设置二级缓存中最多可存储的java对象数量,默认值是1024.

13.3MyBatis集成EhCache

  • 集成EhCache是为了代替mybatis自带的二级缓存,一级缓存是无法替代的。

  • mybatis对外提供了接口,也可以集成第三方的缓存组件。比如EhCache、Memcache等都可以。

  • EhCache是Java写的,Memcache是C语言写的,所以mybatis集成EhCache较为常见。

第一步:在pom.xml文件中引入mybatis整合ehcache的依赖。



 org.mybatis.caches
 mybatis-ehcache
 1.2.2



 ch.qos.logback
 logback-classic
 1.2.11
 test

第二步:在类的根路径下新建echcache.xml⽂件,并提供以下配置信息。



 
 
 
 
 
 
 
 
 
 
 
 
 
 

第三步:修改CarMapper.xml文件中的标签,添加type属性。

十四、MyBatis的逆向工程

  • 所谓的逆向工程是:根据数据库表逆向生成Java的pojo类,SqlMapper.xml文件,以及Mapper接口类等。

  • 要想完成这个工作,需要借助别人写好的逆向工程插件。

  • 使用这个插件,需要给这个插件配置哪些信息?

    • pojo类名、包名以及生成位置。

    • SqlMapper.xml文件名以及生成位置。

    • Mapper接口名以及生成位置。

    • 连接数据库的信息。

    • 指定哪些表参与逆向工程。

    • ...

14.1逆向工程配置与生成

第一步:基础环境准备

  • 新建模块:mybatis012-generator1

  • 打包⽅式:jar

第二步:在pom.xml中添加逆向工程插件



 
 
 
 
 
 org.mybatis.generator
 mybatis-generator-maven-plugin
 1.4.1
 
 
 true
 
 
 
 
 
 mysql
 mysql-connector-java
 8.0.31
 
 
 
 

第三步:配置generatorConfig.xml

  • 该文件名必须叫做:generatorConfig.xml

  • 该文件必须放在类的根路径下。


    
    
        
        
​
        
            
            
            
            
        
​
        
        
        
​
        
        
            
            
            
            
        
​
        
        
            
            
        
​
        
        
            
        
​
        
        
​
    
  • MyBatis3Simple:生成的是基础班,只有基本的增删改查。

  • MyBatis3:生成的是增强版,除了基本的增删改查之外还有复杂的增删改查。

第四步:运行插件

[SSM]MyBatis的缓存与逆向工程_第4张图片

14.2测试

 //CarExample类负责封装查询条件
    @Test
    public void testSelect() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        //执行查询
        //1.查询一个
        Car car = mapper.selectByPrimaryKey(39L);
        System.out.println(car);
        //2.查询所有(selectByExample,根据条件查询,如果条件是null表示没有条件)
        List cars = mapper.selectByExample(null);
        cars.forEach(car1 -> System.out.println(car1));
        //3.按条件查询
        //QBC风格:Query By Criteria 一种查询方式,比较面向对象,看不到sql语句。
        //封装条件:通过CarExample对象来封装查询条件
        CarExample carExample = new CarExample();
        //调用carExample.createCriteria()方法来创建查询条件
        carExample.createCriteria().andBrandLike("比亚迪秦").andGuidePriceGreaterThan(new BigDecimal(20.00));
        //添加or
        carExample.or().andCarTypeEqualTo("燃油车");
        //执行查询
        List cars2 =mapper.selectByExample(carExample);
        cars2.forEach(car2 -> System.out.println(car2));
        sqlSession.close();
    }

你可能感兴趣的:(mybatis,缓存,java)