Mybatis一级缓存和二级缓存证明过程

一、Mybatis一级缓存

Mybatis的一级缓存是存在session上,只要通过session查过的数据,都会放在当前的session上,下一次再查询相同的数据,就直接去缓存中取出来,而不用到数据库里去查询。当session不是同一个session时,就算时条件相同,也要重新从数据库进行第二次查询。

下面进行验证一级缓存的存在,且只存在于当前session中

目录结构

这里写图片描述

1、准备简单的数据表和所需要的jar包

  • log4j-1.2.17.jar
  • mybatis-3.4.2.jar
  • mysql-connector-java-5.0.8-bin.jar

这里写图片描述

2、新建一个java项目就可以进行测试,创建一个lib目录存放jar包

3、实体类User.java

package com.rainy.entity;

public class User {

    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
    }

}

4、实体类的映射UserMapper.xml

<?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.rainy.entity">
    <insert id="addUser" parameterType="User">
        insert into user ( name ) values (#{name})
    </insert>

    <delete id="deleteUser" parameterType="User">
        delete from user where id= #{id}
    </delete>

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

    <update id="updateUser" parameterType="User">
        update user set name=#{name} where id=#{id}
    </update>

</mapper>

5、日志文件log4j.properties

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.rainy=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

6、mybatis的配置文件mybatis-config.xml

<?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>
    <settings>  
            <!-- 打开延迟加载的开关 -->  
            <setting name="lazyLoadingEnabled" value="true" />  
            <!-- 将积极加载改为消息加载即按需加载 -->  
            <setting name="aggressiveLazyLoading" value="false"/>  
        </settings>    
    <typeAliases>
      <package name="com.rainy.entity"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/rainy/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

7、测试类TestMybatis.java

package com.rainy;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.rainy.entity.User;

public class TestMybatis {

    public static void main(String[] args) throws IOException {

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 第一个session使用两次
        SqlSession session = sqlSessionFactory.openSession();
        User user = session.selectOne("getUser", 1);
        System.out.println(user);
        User user2 = session.selectOne("getUser", 1);
        System.out.println(user2);
        session.commit();
        session.close();

        // 第二个session
        SqlSession session2 = sqlSessionFactory.openSession();
        User user3 = session2.selectOne("getUser", 1);
        System.out.println(user3);
        session2.commit();
        session2.close();

    }
}

8、测试结果

这里写图片描述

  • 结果证明了mybatis一级缓存的存在,且只存在于当前session中,当换了一个session时,需要重新到数据库加载数据。

二、Mybatis二级缓存

Mybatis二级缓存是SessionFactory,如果两次查询是在同一个SessionFactory中进行的,那么就从二级缓存中取数据,而不用到数据库里去查询数据。

修改一级缓存的几个地方,便可以验证二级缓存的作用

1、启用二级缓存,配置文件中设置二级缓存为启用

<setting name="cacheEnabled" value="true"/>

这里写图片描述

2、实体类Mapper添加缓存

<cache/>

这里写图片描述
3、bean需要进行序列化

这里写图片描述

4、运行测试类的结果

这里写图片描述

再次运行TestMybatis,可以看出,在同一个SessionFactory下查询id=1的数据,只有第一次需要执行sql语句,以后都是从缓存中取出,这样就证实了二级缓存。

Mybatis一级缓存和二级缓存的基本讲解就到这里

猜你喜欢

转载自blog.csdn.net/qq_38762237/article/details/81155731