首頁  >  文章  >  Java  >  Java之Mybatis的二級快取怎麼使用

Java之Mybatis的二級快取怎麼使用

PHPz
PHPz轉載
2023-05-24 18:16:061836瀏覽

    快取的概述與分類

    概述

    #快取就是一個記憶體空間.保存臨時資料

    為什麼要使用快取

    將資料來源(資料庫或檔案)中的資料讀取出來存放到快取中,再次取得的時候,直接從快取中獲取,可以減少和資料庫互動的次數,這樣可以提升程式的效能!

    快取的適用情況

    適用於快取的:經常查詢但不經常修改的(eg: 省市,類別資料),資料的正確與否對最終結果影響不大的

    不適用快取的:經常改變的資料, 敏感資料(例如:股市的牌價,銀行的匯率,銀行卡裡面的錢)等等

    MyBatis快取類別

    一級快取:它是sqlSession物件的緩存,自帶的(不需要配置)不可卸載的(不想使用還不行).一級快取的生命週期與sqlSession一致。

    二級快取:它是SqlSessionFactory的快取。只要是同一個SqlSessionFactory創建的SqlSession就共享二級快取的內容,可以操作二級快取。二級快取如果要使用的話,需要我們自己手動開啟(需要配置的)。

    二級快取的使用

    1.在mybatis的核心設定檔中開啟二級快取

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

    2.在Dao映射檔中設定使用二級快取

    <?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>

     3.要進行二級快取的Pojo類別必須實作Serializable介面

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

    4.測試使用二級快取

    測試程式碼

    @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();
          }

    -測試結果:

    Java之Mybatis的二級快取怎麼使用

    - 經過上面的測試,我們發現執行了兩次查詢,並且在執行第一次查詢後,我們關閉了一級緩存,再去執行第二次查詢時,我們發現並沒有對資料庫發出sql 語句,所以此時的資料就只能是來自於我們所說的二級快取。

    5.測試關閉二級快取

    - 測試程式碼

       @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();
          }

    - 測試結果

    Java之Mybatis的二級快取怎麼使用

    經過上面的測試,我們發現執行了兩次查詢,並且在執行第一次查詢後,我們關閉了一級緩存,關閉二級緩存,再去執行第二次查詢時,我們發現對數據庫發出了sql 語句,所以此時的資料是來自資料庫,不是快取。

    以上是Java之Mybatis的二級快取怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除