栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis学习之 一级缓存与二级缓存

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis学习之 一级缓存与二级缓存

首先创建项目,这里就不使用Spring框架了,直接用mybatis原生:

文章目录
  • 准备工作
  • 一级缓存:
  • 二级缓存

准备工作

首先创建maven项目,引入依赖:

        
            org.mybatis
            mybatis
            3.5.7
        

        
        
            mysql
            mysql-connector-java
            8.0.26
        

创建我们的实体类:

public class Blog  {
    private String name;
    private Integer id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Blog{" +
                "name='" + name + ''' +
                ", id=" + id +
                '}';
    }
}

配置我们的mybtais 的配置文件 mybatis-config.xml:




    
        
        
        
        
        
    
    
        
            
            
                
                
                
                
            
        
    
    
        
    

我们要在数据库里面有配置好该实体类对应的表:

创建Mapper类 BlogMapper:

public interface BlogMapper {
    public Blog selectBlog(Integer id);
}

创建其对应的mapper文件:





    
    select * from Blog where id = #{id}
  
    

如上,使用 开启二级缓存,然后还要给实体类实现序列化接口:

public class Blog  implements Serializable {

    private static final long serialVersionUID = -7946444982033976955L;
    。。。
    }

执行如下代码:

 public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = MyBatisConfig.getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        Blog blog1 = mapper.selectBlog(1);
        System.out.println(blog1);
        System.out.println("第二次执行");
        Blog blog2 = mapper.selectBlog(1);
        System.out.println(blog2);
        session.commit();
        System.out.println("二级缓存观测点");
        SqlSession session2 = sqlSessionFactory.openSession();
        BlogMapper mapper2 = session2.getMapper(BlogMapper.class);
        Blog blog3 = mapper2.selectBlog(1);
        System.out.println(blog3);
        System.out.println("第二次执行");
        Blog blog4 = mapper2.selectBlog(1);
        System.out.println(blog4);
        session2.commit();
        System.out.println(blog1==blog2);
    }

使用debug方式执行:

发现blog1和blog2 的引用相同,但是blog3和blog4的引用并不同。
原因: 因为blog2是从一级缓存中取出的,所以和blog1 的值相同,在sqlsession1 使用了commit()方法之后,该对象被序列化到二级缓存中了,blog3是从二级缓存中反序列化得到的对象,blog4也是反序列化得到的对象,得到的不是原实例,而是原实例的拷贝
而且观察控制台可以发现,我们的select语句只查询了一次:

所以二级缓存产生了效果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/287876.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号