mybatis缓存之一级缓存

 

 

 一级缓存:与数据库同一次会话期间查询到的数据会放在本地缓存中,以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库。

package com.gong.mybatis.test;

import java.io.IOException;
 java.io.InputStream;
 java.util.ArrayList;
 java.util.Arrays;
 java.util.HashMap;
 java.util.List;
 java.util.Map;

 org.apache.ibatis.io.Resources;
 org.apache.ibatis.session.SqlSession;
 org.apache.ibatis.session.SqlSessionFactory;
 org.apache.ibatis.session.SqlSessionFactoryBuilder;
 org.junit.Test;

 com.gong.mybatis.bean.Department;
 com.gong.mybatis.bean.Employee;
 com.gong.mybatis.dao.EmployeeMapper;
 com.gong.mybatis.mapper.EmployeeMapperDynamicSql;

public class TestMybatis4 {
    
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(is);
    }

    @Test
    void test()  IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.);
            Employee em = mapper.getEmpById(1);
            System.out.println(em);
            Employee em2 = mapper.getEmpById(1);
            System.out.println(em2);
            System.out.println(em == em2);
            openSession.commit();
        } finally {
            // TODO: handle finally clause
            openSession.close();
        }
        
        
    }
    
}

输出结果:

DEBUG 01-22 10:18:00,037 ==>  Preparing: select id,last_name lastName,email,gender from tbl_employee where id = ?   (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:18:00,108 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:18:00,175 <==      Total: 1  (BaseJdbcLogger.java:145) 
Employee [id=1,lastName=dema,1)">genderemail=dema@qq.com,1)">dept=null]
Employee [idtrue

说明:一级缓存的作用:在一次会话中,使用了相同的查询方法,所以系统只会发送一次sql请求,同时可以看到,em和em2是同一个对象,说明em2并不是重新发送sql请求得到的,而是直接从缓存中获得的。

一级缓存失效的四种情况:

1、使用不同的SqlSession对象

);
            Employee em = mapper.getEmpById(1);
            System.out.println(em);
            
            SqlSession openSession2 = sqlSessionFactory.openSession();
            EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);
            Employee em2 = mapper2.getEmpById(1);
            System.out.println(em2);
            
            System.out.println(em == em2);
            openSession.commit();
        }             openSession.close();
        }
        
        
        
    }
    
}

结果:

DEBUG 01-22 10:23:05,279 ==>  Preparing: select id,gender from tbl_employee where id = ?   (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:23:05,323 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:23:05,367 ==>  Preparing: select id,gender from tbl_employee where id = ?   (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:23:05,388 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:23:05,393 <==      Total: 1  (BaseJdbcLogger.java:145) 
Employee [idfalse

2、同一个SqlSession对象,但查询条件不一样:

);
            System.out.println(em);
            
            SqlSession openSession2 = sqlSessionFactory.openSession();
            EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);
            Employee em2 = mapper.getEmpById(3            openSession.close();
        }
        
        
        
    }
    
}

输出:

DEBUG 01-22 10:25:29,976 ==>  Preparing: select id,gender from tbl_employee where id = ?   (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:25:30,021 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:25:30,086 DEBUG 01-22 10:25:30,088 (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:25:30,093 Parameters: 3(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:25:30,096 <=3,1)">=小红,1)">=0,1)">=xiaohong@qq.com,1)">false

3、同一个SqlSession,但在两次查询之间执行了增删改操作

            EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);
            mapper.deleteEmp(5);
            Employee em2 = mapper.getEmpById(1DEBUG 01-22 10:27:54,536 ==>  Preparing: select id,gender from tbl_employee where id = ?   (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:27:54,586 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:27:54,636 Preparing: delete from tbl_employee where id=?   (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:27:54,640 Parameters: 5(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:27:54,700 <==    Updates: 1  (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:27:54,702 Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:27:54,712 <false

4、同一个SqlSession,但手动清除了一级缓存

即在两次查询之间使用了:

openSession.clearCache();

相关文章

1.pom.xml引入依赖 &lt;dependency&gt; &lt;gro...
&lt;?xml version=&quot;1.0&quot; encoding=&a...
准备工作 ① 创建数据库&amp;数据表 ## 创建数据库 CREA...
MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、...
MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串...
resultMap作用是处理数据表中字段与java实体类中属性的映射关...