Home > Java > javaTutorial > body text

How to use the second-level cache of Mybatis in Java

PHPz
Release: 2023-05-24 18:16:06
forward
1847 people have browsed it

    Overview and classification of cache

    Overview

    Cache is a piece of memory space that saves temporary data

    Why use Cache

    Read the data from the data source (database or file) and store it in the cache. When retrieving it, obtain it directly from the cache, which can reduce the number of interactions with the database, which can improve the performance of the program. Performance!

    Applicability of cache

    Suitable for cache: frequently queried but not frequently modified (eg: provinces, cities, category data), the accuracy of the data has no impact on the final result Big

    Not suitable for caching: frequently changing data, sensitive data (for example: stock market prices, bank exchange rates, money in bank cards), etc.

    MyBatis Cache Category

    Level 1 cache: It is the cache of the sqlSession object. It comes with it (no configuration required) and cannot be uninstalled (if you don’t want to use it). The life cycle of the first level cache is consistent with sqlSession.

    Second level cache: It is the cache of SqlSessionFactory. As long as the SqlSession created by the same SqlSessionFactory shares the contents of the second-level cache, it can operate the second-level cache. If we want to use the second-level cache, we need to manually enable it ourselves (configuration is required).

    Use of second-level cache

    1. Enable the second-level cache in the core configuration file of mybatis

        <!--**因为 cacheEnabled 的取值默认就为 true**,所以这一步可以省略不配置。为 true 代表开启二级缓存;为 false 代表不开启二级缓存。  -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    Copy after login

    2. Configure the use of the second-level cache in the Dao mapping file

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.itheima.dao.UserDao">
        <!--配置二级缓存-->
        <cache/>
       
        <select id="findAll" resultType="user">
            select * from t_user
        </select>
     
        <delete id="deleteById" parameterType="int">
            delete from t_user where uid=#{id}
        </delete>
    </mapper>
    Copy after login

    3. The Pojo class for second-level caching must implement the Serializable interface

    public class User implements Serializable {
        private int uid;
        private String username;
        private String sex;
        private Date birthday;
        private String address;
        // 省略setter,getter,构造...等方法
    }
    Copy after login

    4. Test the use of second-level cache

    Test code

    @Test
          public void testFindAll() throws Exception{
              // 1.加载mybatis核心配置文件
              InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
     
              // 2.创建SqlSessionFactoryBuilder对象
              SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
     
              // 3.构建SqlSessionFactory对象
              SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
     
              // 4.获取SqlSession对象
              SqlSession sqlSession = sqlSessionFactory.openSession();
     
              // 5.获得dao接口的代理对象
              UserDao userDao = sqlSession.getMapper(UserDao.class);
     
              // 6.执行sql语句,得到结果
              List<User> list = userDao.findAll();
              for (User user : list) {
                  System.out.println("user = " + user);
              }
              sqlSession.close();//清除一级缓存
     
              System.out.println("分割线----------------------------------");
     
              SqlSession sqlSession2 = sqlSessionFactory.openSession();
              UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
              List<User> userList2 = userDao2.findAll();
              for (User user : userList2) {
                  System.out.println(user);
              }
              // 7.释放资源
              sqlSession2.close();
          }
    Copy after login

    - Test results:

    How to use the second-level cache of Mybatis in Java

    #- After the above test, we found that two queries were executed, and after executing the first query, we turned off the first-level cache and then went to When executing the second query, we found that no SQL statement was issued to the database, so the data at this time can only come from what we call the second-level cache.

    5. Test to turn off the second-level cache

    -Test code

       @Test
          public void testFindAll() throws Exception{
              // 1.加载mybatis核心配置文件
              InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
     
              // 2.创建SqlSessionFactoryBuilder对象
              SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
     
              // 3.构建SqlSessionFactory对象
              SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
     
              // 4.获取SqlSession对象
              SqlSession sqlSession = sqlSessionFactory.openSession();
     
              // 5.获得dao接口的代理对象
              UserDao userDao = sqlSession.getMapper(UserDao.class);
     
              // 6.执行sql语句,得到结果
              List<User> list = userDao.findAll();
              for (User user : list) {
                  System.out.println("user = " + user);
              }
              sqlSession.close();//清除一级缓存
     
              System.out.println("分割线----------------------------------");
     
              SqlSession sqlSession2 = sqlSessionFactory.openSession();
              UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
              userDao2.deleteById(5);// 关闭二级缓存
     
              List<User> userList2 = userDao2.findAll();
              for (User user : userList2) {
                  System.out.println(user);
              }
              // 7.释放资源
              sqlSession2.close();
          }
    Copy after login

    -Test result

    How to use the second-level cache of Mybatis in Java

    After the above Testing, we found that two queries were executed, and after executing the first query, we closed the first-level cache and the second-level cache. When we executed the second query, we found that a sql statement was issued to the database, so The data at this time comes from the database, not the cache.

    The above is the detailed content of How to use the second-level cache of Mybatis in Java. For more information, please follow other related articles on the PHP Chinese website!

    Related labels:
    source:yisu.com
    Statement of this Website
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
    Popular Tutorials
    More>
    Latest Downloads
    More>
    Web Effects
    Website Source Code
    Website Materials
    Front End Template