Mybatis中一级缓存的使用

User类:

package com.qublog.domain;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class User implements Serializable {
    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

//    @Override
//    public String toString() {
//        return "User{" +
//                "id=" + id +
//                ", username='" + username + '\'' +
//                ", address='" + address + '\'' +
//                ", sex='" + sex + '\'' +
//                ", birthday=" + birthday +
//                '}';
//    }
}

UserDao接口:

package com.qublog.dao;


import com.qublog.domain.User;

import java.util.List;

//用户的持久层接口
public interface UserDao {

    //查询所有用户,同时获取到用户下所有账户的信息
    List<User> findAll();

    User findById(Integer id);
}

UserDao.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.qublog.dao.UserDao">

    <!-- 配置查询所有 -->
    <select id="findAll" resultType="user">
        select * from user;
    </select>

    <select id="findById" parameterType="Integer" resultType="user">
        select * from user where id=#{id};
    </select>
</mapper>

SqlMapConfig.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">
<!-- mybatis的主配置文件 -->
<configuration>
    <!-- 配置properties -->
    <properties resource="jdbcConfig.properties"></properties>

    <!-- 使用typeAliases配置别名,它只能配置domain中类的别名 -->
    <typeAliases>
        <!-- typeAlias用于配置别名,type属性指定的是实体类全限定类名,alias指定别名,当指定了别名就不再区分大小写 -->
        <!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写 -->
        <package name="com.qublog.domain"></package>
    </typeAliases>

    <!-- 配置环境 -->
    <environments default="mysql">
        <!-- 配置mysql的环境 -->
        <environment id="mysql">
            <!-- 配置事务类型 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置连接池 -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的基本信息 -->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 用注解时使用class属性指定被注解的dao全限定类名 -->
    <mappers>
        <!-- package标签是用于指定dao接口所在的包,当指定了之后就不需要再写mapper以及resource或者class了 -->
        <package name="com.qublog.dao"></package>
    </mappers>
</configuration>

UserTest类:

package com.qublog.test;

import com.qublog.dao.UserDao;
import com.qublog.domain.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class UserTest {
    private InputStream in = null;
    private SqlSession sqlSession = null;
    UserDao userDao = null;

    @Before //用于在测试方法执行之前执行
    public void init() throws Exception {
        //读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //获取SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //获取SqlSession对象
        sqlSession = factory.openSession();
        //获取dao代理对象
        userDao = sqlSession.getMapper(UserDao.class);
    }

    @After //用于在测试方法执行之后执行
    public void destroy() throws Exception {
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
        in.close();
    }

    @Test
    public void testFirstLevelCache() throws Exception {
        User user1 =  userDao.findById(41);
        System.out.println(user1);
        User user2 =  userDao.findById(41);
        System.out.println(user2);
        System.out.println(user1==user2);
    }

}

输出结果:
在这里插入图片描述
从结果可以看出,这两个结果返回的是同一对象,并且只进行了一次查询,说明第一次进行查询,第二次是从缓存中获取数据。
继续修改代码:
UserTest类:

package com.qublog.test;

import com.qublog.dao.UserDao;
import com.qublog.domain.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class UserTest {
    private InputStream in = null;
    private SqlSession sqlSession = null;
    private SqlSessionFactory factory = null;
    UserDao userDao = null;

    @Before //用于在测试方法执行之前执行
    public void init() throws Exception {
        //读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //获取SqlSessionFactory对象
        factory = new SqlSessionFactoryBuilder().build(in);
        //获取SqlSession对象
        sqlSession = factory.openSession();
        //获取dao代理对象
        userDao = sqlSession.getMapper(UserDao.class);
    }

    @After //用于在测试方法执行之后执行
    public void destroy() throws Exception {
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
        in.close();
    }

    @Test
    public void testFirstLevelCache() throws Exception {
        User user1 =  userDao.findById(41);
        System.out.println(user1);

        sqlSession.close();
        sqlSession = factory.openSession();
        userDao = sqlSession.getMapper(UserDao.class);

        User user2 =  userDao.findById(41);
        System.out.println(user2);
        System.out.println(user1==user2);
    }

}

输出结果:
在这里插入图片描述
可以看出不同的SqlSession执行了查询。
SqlSession的clearCache()也可以清空缓存:

    @Test
    public void testFirstLevelCache() throws Exception {
        User user1 =  userDao.findById(41);
        System.out.println(user1);

        sqlSession.clearCache();
        //userDao = sqlSession.getMapper(UserDao.class);

        User user2 =  userDao.findById(41);
        System.out.println(user2);
        System.out.println(user1==user2);
    }

输出结果:
在这里插入图片描述

发布了56 篇原创文章 · 获赞 0 · 访问量 547

猜你喜欢

转载自blog.csdn.net/qq_41242680/article/details/105390943