18-一级缓存

一级缓存

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

测试:

1.开启日志

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

2.测试在一个session中查询两次相同的日志

3.查看日志输出

代码演示

核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心配置环境-->
<configuration>
<!--  引入外部配置文件  优先使用  -->
    <properties resource="db.properties" />
<settings>

    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

<!--可以给实体类取别名-->
    <typeAliases>
        <typeAlias type="com.tian.pojo.User" alias="User"/>

    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
<!--每一个Mapper.xml都需要在mybatis核心配置文件中注册!-->
<mappers>
    <mapper class="com.tian.dao.UserMapper"/>
</mappers>

</configuration>

UserMapper

//根据id查询
    User queryUserById(@Param("id") int id);

UserMapper.xml

<select id="queryUserById" resultType="User">
    select * from user where id=#{id}
</select>

测试类

   @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user1 = userMapper.queryUserById(1);
        System.out.println(user1);
        System.out.println("--------------");
        User user2 = userMapper.queryUserById(1);
        System.out.println(user2);
        System.out.println(user1==user2);
        sqlSession.close();
    }

运行结果

Opening JDBC Connection
Created connection 1026055550.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3d285d7e]
==>  Preparing: select * from user where id=? 
==> Parameters: 1(Integer)
<==    Columns: id, name, pwd
<==        Row: 1, 狂神, 123456
<==      Total: 1
User(id=1, name=狂神, pwd=123456)
--------------
User(id=1, name=狂神, pwd=123456)
true
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3d285d7e]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3d285d7e]
Returned connection 1026055550 to pool.

缓存失效的情况

1.查询不同的东西

   @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user1 = userMapper.queryUserById(1);
        System.out.println(user1);
        System.out.println("--------------");
        User user2 = userMapper.queryUserById(2);
        System.out.println(user2);
        System.out.println(user1==user2);
        sqlSession.close();
    }

⒉.增删改操作,可能会改变原来的数据,所以必定会刷新缓存!

   @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user1 = userMapper.queryUserById(1);
        System.out.println(user1);
        
        userMapper.updateUser(new User(1,"haha","123123"));
        
        System.out.println("--------------");
        User user2 = userMapper.queryUserById(1);
        System.out.println(user2);
        System.out.println(user1==user2);
        sqlSession.close();
    }

3.查询不同的Mapper.xml

4.手动清理缓存!

sqlSession.clearCache();//手动清理缓存
小结:
  • 一级缓存默认是开启的,只在一次SqlSession中有效,也就是拿到连接到关闭连接这个区间段!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值