MyBatis 中如何使用缓存

这篇具有很好参考价值的文章主要介绍了MyBatis 中如何使用缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MyBatis 中如何使用缓存

MyBatis 是一个基于 Java 的持久层框架,它提供了多种方式来使用缓存,包括一级缓存和二级缓存。本文将介绍 MyBatis 中常见的缓存使用方式及其使用方法。

MyBatis 中如何使用缓存,Java 教程,mybatis,缓存,java

1. 一级缓存

MyBatis 中的一级缓存是指 SqlSession 的缓存,它默认是开启的。在同一个 SqlSession 中,如果执行了相同的 SQL 语句,那么 MyBatis 会从缓存中读取结果,而不是再次向数据库发起请求。下面是一个简单的示例:

public class MyBatisTest {
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 第一次查询,从数据库中获取数据
            User user1 = userMapper.getUserById(1);
            System.out.println(user1);

            // 第二次查询,从一级缓存中获取数据
            User user2 = userMapper.getUserById(1);
            System.out.println(user2);

            // 更新数据,清空一级缓存
            user1.setName("Tom");
            userMapper.updateUser(user1);
            sqlSession.commit();

            // 第三次查询,从数据库中获取数据
            User user3 = userMapper.getUserById(1);
            System.out.println(user3);

            // 第四次查询,从一级缓存中获取数据
            User user4 = userMapper.getUserById(1);
            System.out.println(user4);
        } finally {
            sqlSession.close();
        }
    }
}

在上面的示例代码中,首先读取了配置文件 mybatis-config.xml,然后通过 SqlSessionFactoryBuilder 将配置文件解析为 SqlSessionFactory 对象,最后通过 SqlSessionFactory 创建 SqlSession 对象。在 SqlSession 中,通过 getMapper 方法获取映射器接口的实例,然后就可以直接调用映射器接口中的方法执行 SQL 语句了。在第一次查询时,会从数据库中获取数据,并将结果存储在一级缓存中。在第二次查询时,会直接从一级缓存中获取数据。在更新数据后,需要清空一级缓存,否则会出现数据不一致的情况。

2. 二级缓存

除了一级缓存外,MyBatis 还提供了二级缓存,它是 SqlSessionFactory 的缓存。在多个 SqlSession 中共享同一个二级缓存,如果执行了相同的 SQL 语句,那么 MyBatis 会从缓存中读取结果,而不是再次向数据库发起请求。下面是一个简单的示例:

public class MyBatisTest {
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        try {
            UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
            UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
            // 第一次查询,从数据库中获取数据,并存储到二级缓存中
            User user1 = userMapper1.getUserById(1);
            System.out.println(user1);

            // 第二次查询,从二级缓存中获取数据
            User user2 = userMapper2.getUserById(1);
            System.out.println(user2);

            // 更新数据,清空二级缓存
            user1.setName("Tom");
            userMapper1.updateUser(user1);
            sqlSession1.commit();

            // 第三次查询,从数据库中获取数据,并存储到二级缓存中
            User user3 = userMapper2.getUserById(1);
            System.out.println(user3);

            // 第四次查询,从二级缓存中获取数据
            User user4 = userMapper1.getUserById(1);
            System.out.println(user4);
        } finally {
            sqlSession1.close();
            sqlSession2.close();
        }
    }
}

在上面的示例代码中,首先读取了配置文件 mybatis-config.xml,然后通过 SqlSessionFactoryBuilder 将配置文件解析为 SqlSessionFactory 对象,最后通过 SqlSessionFactory 创建 SqlSession 对象。在 SqlSession 中,通过 getMapper 方法获取映射器接口的实例,在多个 SqlSession 中共享同一个二级缓存。在第一次查询时,会从数据库中获取数据,并将结果存储在二级缓存中。在第二次查询时,会直接从二级缓存中获取数据。在更新数据后,需要清空二级缓存,否则会出现数据不一致的情况。

要启用二级缓存,需要在配置文件 mybatis-config.xml 中进行配置。下面是一个简单的配置示例:

<configuration>
  <settings>
    <setting name="cacheEnabled" value="true"/>
  </settings>
  <typeAliases>
    <typeAlias type="com.example.User" alias="User"/>
  </typeAliases>
  <mappers>
    <mapper resource="com/example/UserMapper.xml"/>
  </mappers>
  <cache type="org.apache.ibatis.cache.impl.PerpetualCache"/>
</configuration>

在上面的配置文件中,首先开启了缓存功能,然后定义了一个类型别名 User,最后定义了一个缓存实现类 org.apache.ibatis.cache.impl.PerpetualCache。

3. 自定义缓存

除了使用 MyBatis 提供的缓存实现类以外,还可以自定义缓存实现类。下面是一个简单的自定义缓存实现类示例:

public class MyCache implements Cache {
    private final String id;
    private final Map<Object, Object> cache = new HashMap<>();

    public MyCache(String id) {
        this.id = id;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void putObject(Object key, Object value) {
        cache.put(key, value);
    }

    @Override
    public Object getObject(Object key) {
        return cache.get(key);
    }

    @Override
    public Object removeObject(Object key) {
        return cache.remove(key);
    }

    @Override
    public void clear() {
        cache.clear();
    }

    @Override
    public int getSize() {
        return cache.size();
    }

    @Override
    public ReadWriteLock getReadWriteLock() {
        return null;
    }
}

在上面的示例代码中,实现了 MyBatis 的 Cache 接口,使用了一个 HashMap 作为缓存实现。

要使用自定义缓存,需要在配置文件 mybatis-config.xml 中进行配置。下面是一个简单的配置示例:

<configuration>
  <settings>
    <setting name="cacheEnabled" value="true"/>
  </settings>
  <typeAliases>
    <typeAlias type="com.example.User" alias="User"/>
  </typeAliases>
  <mappers>
    <mapper resource="com/example/UserMapper.xml"/>
  </mappers>
  <cache type="com.example.MyCache">
    <property name="id" value="myCache"/>
  </cache>
</configuration>

在上面的配置文件中,首先开启了缓存功能,然后定义了一个类型别名 User,最后定义了一个缓存实现类 com.example.MyCache,并指定了缓存实现类的 id。如果没有指定 id,则默认使用缓存实现类的类名作为 id。

结论

MyBatis 提供了多种方式来使用缓存,包括一级缓存和二级缓存。一级缓存是 SqlSession 的缓存,它默认是开启的。二级缓存是 SqlSessionFactory 的缓存,需要在配置文件中进行配置。除了使用 MyBatis 提供的缓存实现类以外,还可以自定义缓存实现类。在使用缓存时,需要注意清空缓存,否则会出现数据不一致的情况。文章来源地址https://www.toymoban.com/news/detail-573921.html

到了这里,关于MyBatis 中如何使用缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Java系列】Mybatis-Plus 使用介绍二

    你只管努力,其他交给时间,时间会证明一切。 MyBatis-Plus 是 MyBatis 的增强工具,它简化了 MyBatis 的开发,并提供了许多实用的功能和工具类。下面是 MyBatis-Plus 的使用方法: 在 Maven 项目中,需要在 pom.xml 文件中添加如下依赖: 其中  mybatis-plus-boot-starter  是 MyBatis-Plus 的 S

    2024年02月08日
    浏览(40)
  • Mybatis的一级、二级缓存怎样使用?

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

    2024年02月16日
    浏览(32)
  • 【Java核心知识】spring boot整合Mybatis plus + Phoenix 访问Hbase与使用注意

    为什么Phoenix能让开发者通过SQL访问Hbase而不必使用原生的方式?引用Phoenix官网上的一句话:SQL is just a way of expressing what you want to get not how you want to get it . 即SQL不是一种数据操作技术,而是一种特殊的表达方式。只是表示你需要什么而不是你如何获得。 一个集成了Phoenix的Hb

    2024年02月15日
    浏览(37)
  • Mybatis学习|Mybatis缓存:一级缓存、二级缓存

    MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。 MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存) 二级缓存需要手动开启和配置,他是

    2024年02月09日
    浏览(27)
  • 解决使用Mybatis出现Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String

    前排提醒注意文章时限!本文写于2024.1.9 在springboot中使用Mybatis出现Invalid value type for attribute \\\'factoryBeanObjectType\\\': java.lang.String 通过多方查询,一般为Spring Framework(Springboot)、Mybatis-Spring、MyBatis三者版本管理冲突 相关版本兼容性请查询:  mybatis-spring官网 https://mybatis.org/sprin

    2024年02月20日
    浏览(34)
  • MyBatis第六讲:MyBatis缓存

    MyBatis 提供了一级缓存和二级缓存的支持。默认情况下,MyBatis 只开启一级缓存。 8、1MyBatis一级缓存 一级缓存是基于MyBatis自带的 HashMap 本地缓存,作用范围为 SqlSession 域内。当刷新或者关闭之后,该 SqlSession 中所有的缓存就会被清空。 在参数和 SQL 完全一样的情况下,我们使

    2024年02月11日
    浏览(36)
  • [Java安全]—Mybatis注入

    Mybatis注入留在了Spring后,因为感觉用Spring搭建web端后再进行注入比较贴合实际一些。 Mysql:5.7 Springboot:2.1 mybatis:3.5 创建了一个测试用的数据库Mybatis 这里用的Springboot环境,配置文件较多,先放出关键文件,最终项目放在后边 接口 配置 测试 执行语句是 select * from users wh

    2024年02月06日
    浏览(28)
  • Java框架 Mybatis入门

    Java框架Mybatis 1..框架介绍 2.Mybatis实战 1.框架介绍 补充MVC思想 为什么使用框架? 效率高,成本低 框架是别人写好的,可以直接调用 框架是基于MVC的思想 框架包中含有MVC思想的所有组成模块:控制层;模型层和视图层 2.框架简介 Spring框架 特点IOC(控制反转);AOP(面向切面

    2024年02月16日
    浏览(32)
  • Java Mybatis拓展03

    1. MyBatis当实体类和数据库字段名不对应 2. 多表查询 1.MyBatis当实体类和数据库字段名不对应 方法2 测试 多表查询 加入子标签association 模糊查询 加入Address 对象 三表联查 2.五表联查 测试

    2024年02月16日
    浏览(31)
  • 认识 MyBatis + MyBatis如何使用 (MyBatis操作数据库)

    本篇介绍了什么是MyBatis,MyBatis的前期配置,MyBatis操作数据库的两种方式:.xml文件 / 注释,使用MyBatis的一些注意,如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 MyBatis(ORM: 对象关系映射框架): 一个持久层框架,也是一个工具实现程序与数据库交互,

    2024年02月14日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包