-  
为什么使用缓存?
首次访问时,查询数据库,并将数据存储到内存中;再次访问时直接访问缓存,减少io、硬盘读写次数、提高效率
 -  
mybatis中的一级缓存和二级缓存?
-  
一级缓存:
它指的是mybatis中的sqlsession对象的缓存。当我们执行完查询之后,查询的结果会同时存在在sqlsession为我们提供的一块区域中。当我们再次查询同样的数据,mybatis会先去sqlsession中查询是否有,有的话直接拿出来使用。当sqlsession对象消失时,mybatis的一级缓存也就消失了。
 -  

 -  
二级缓存:
它指的是mybatis中sqlsessionfactory对象的缓存,由同一个sqlsessiofactory对象创建的sqlsession共享其缓存。
 -  

 
 -  
 
1.一级缓存(默认开启)
(1) 首先在usermapper接口定义两个方法:
package com.by.mapper;
import com.by.pojo.user;
import org.apache.ibatis.annotations.param;
import org.junit.test;
import java.util.list;
/**
 * <p>project: mybatis - usermapper</p>
 * <p>powered by scl on 2023-12-22 15:52:05</p>
 * <p>描述:<p>
 *
 * @author 孙臣龙 [1846080280@qq.com]
 * @version 1.0
 * @since 17
 */
public interface usermapper {
    user getuserbyid(integer id);
    void deleteuserbyid(integer id);
}
 
(2)在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.by.mapper.usermapper">
    
    <select id="getuserbyid" parametertype="int" resulttype="user">
        select *
        from user
        where id = #{id}
    </select>
    <delete id="deleteuserbyid" parametertype="int">
        delete
        from user
        where id = #{id};
    </delete>
</mapper> 
(3)测试类:
/*
 * copyright (c) 2020, 2023,  all rights reserved.
 *
 */
package com.by;
import com.by.mapper.usermapper;
import com.by.pojo.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.ioexception;
import java.io.inputstream;
import java.util.arraylist;
import java.util.list;
/**
 * <p>project: mybatis - mybatistest</p>
 * <p>powered by scl on 2023-12-18 11:44:53</p>
 * <p>描述:<p>
 *
 * @author 孙臣龙 [1846080280@qq.com]
 * @version 1.0
 * @since 17
 */
public class mybatistestcache {
    private inputstream inputstream;
    private sqlsession sqlsession;
    @before
    public void init() throws ioexception {
         加载配置文件
        //string resource = "mybatis-config.xml";
        //inputstream = resources.getresourceasstream(resource);
        //
         创建sqlsessionfactory
        //sqlsessionfactory sessionfactory = new sqlsessionfactorybuilder().build(inputstream);
        //
         获得数据的绘画实例
        //sqlsession = sessionfactory.opensession();
    }
    /**
     * 一级缓存
     *
     * @throws ioexception
     */
    @test
    public void testfirstgocache() {
        usermapper usermapper1 = sqlsession.getmapper(usermapper.class);
        usermapper usermapper2 = sqlsession.getmapper(usermapper.class);
        system.out.println("=========one===========");
        user user1 = usermapper1.getuserbyid(42); // 执行sql语句
        system.out.println(user1);
        system.out.println("=========two===========");
        user user2 = usermapper2.getuserbyid(42); // 不执行sql语句,走缓存
        system.out.println(user2);
    }
    /**
     * 一级缓存,不走缓存,同一个sqlsession,中间执行了增删改
     *
     * @throws ioexception
     */
    @test
    public void testfirstnocache() {
        usermapper usermapper1 = sqlsession.getmapper(usermapper.class);
        usermapper usermapper2 = sqlsession.getmapper(usermapper.class);
        system.out.println("=========one===========");
        user user1 = usermapper1.getuserbyid(42); // 执行sql语句
        system.out.println(user1);
        system.out.println("========同一个sqlsession之间执行增删改========");
        usermapper1.deleteuserbyid(41);
        sqlsession.commit();
        system.out.println("=========two===========");
        user user2 = usermapper2.getuserbyid(42); // 执行sql语句
        system.out.println(user2);
    }
    /**
     * 一级缓存,不走缓存,不同的sqlsession
     *
     * @throws ioexception
     */
    @test
    public void testfirstnocache2() throws ioexception {
        string resource = "mybatis-config.xml";
        inputstream inputstream = resources.getresourceasstream(resource);
        // 创建sqlsessionfactory
        sqlsessionfactory sessionfactory = new sqlsessionfactorybuilder().build(inputstream);
        sqlsession sqlsession1 = sessionfactory.opensession();
        usermapper usermapper1 = sqlsession1.getmapper(usermapper.class);
        // 获得数据的绘画实例
        sqlsession sqlsession2 = sessionfactory.opensession();
        usermapper usermapper2 = sqlsession2.getmapper(usermapper.class);
        system.out.println("=========one===========");
        user user1 = usermapper1.getuserbyid(42); // 执行sql语句
        system.out.println(user1);
        system.out.println("=========two===========");
        user user2 = usermapper2.getuserbyid(42); // 执行sql语句
        system.out.println(user2);
    }
    @after
    public void close() throws ioexception {
        //inputstream.close();
        //sqlsession.close();
    }
} 
2.二级缓存(需要手动开启)
(1)在usermapper接口中创建两个方法:同上
(2)在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.by.mapper.usermapper">
    <!--局部开启二级缓存-->
    <cache></cache>
    <select id="getuserbyid" parametertype="int" resulttype="user">
        select *
        from user
        where id = #{id}
    </select>
    <delete id="deleteuserbyid" parametertype="int">
        delete
        from user
        where id = #{id};
    </delete>
</mapper> 
(3)测试类:
/*
 * copyright (c) 2020, 2023,  all rights reserved.
 *
 */
package com.by;
import com.by.mapper.usermapper;
import com.by.pojo.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.ioexception;
import java.io.inputstream;
/**
 * <p>project: mybatis - mybatistest</p>
 * <p>powered by scl on 2023-12-18 11:44:53</p>
 * <p>描述:<p>
 *
 * @author 孙臣龙 [1846080280@qq.com]
 * @version 1.0
 * @since 17
 */
public class mybatistestcache2 {
    private inputstream inputstream;
    private sqlsession sqlsession;
    @before
    public void init() throws ioexception {
         加载配置文件
        //string resource = "mybatis-config.xml";
        //inputstream = resources.getresourceasstream(resource);
        //
         创建sqlsessionfactory
        //sqlsessionfactory sessionfactory = new sqlsessionfactorybuilder().build(inputstream);
        //
         获得数据的绘画实例
        //sqlsession = sessionfactory.opensession();
    }
    /**
     * 二级缓存
     *
     * @throws ioexception
     */
    @test
    public void testsecondgocache() {
        usermapper usermapper1 = sqlsession.getmapper(usermapper.class);
        usermapper usermapper2 = sqlsession.getmapper(usermapper.class);
        system.out.println("=========one===========");
        user user1 = usermapper1.getuserbyid(42); // 执行sql语句
        system.out.println(user1);
        sqlsession.commit();
        system.out.println("=========two===========");
        user user2 = usermapper2.getuserbyid(42); // 不执行sql语句,走缓存
        system.out.println(user2);
    }
    /**
     * 二级缓存,不走缓存,两个sql之间执行增删改
     *
     * @throws ioexception
     */
    @test
    public void testsecondnocache() {
        usermapper usermapper1 = sqlsession.getmapper(usermapper.class);
        usermapper usermapper2 = sqlsession.getmapper(usermapper.class);
        system.out.println("=========one===========");
        user user1 = usermapper1.getuserbyid(42); // 执行sql语句
        system.out.println(user1);
        sqlsession.commit();
        system.out.println("************增删改**************");
        usermapper1.deleteuserbyid(41);
        sqlsession.commit();
        system.out.println("=========two===========");
        user user2 = usermapper2.getuserbyid(42); // 执行sql语句
        system.out.println(user2);
    }
    /**
     * 二级缓存,不走缓存,不同的sqlsessionfactory
     *
     * @throws ioexception
     */
    @test
    public void testsecondnocache2() throws ioexception {
        string resource = "mybatis-config.xml";
        inputstream inputstream1 = resources.getresourceasstream(resource);
        inputstream inputstream2 = resources.getresourceasstream(resource);
        //工厂1
        sqlsessionfactory sessionfactory1 = new sqlsessionfactorybuilder().build(inputstream1);
        sqlsession sqlsession1 = sessionfactory1.opensession();
        usermapper usermapper1 = sqlsession1.getmapper(usermapper.class);
        //工厂2
        sqlsessionfactory sessionfactory2 = new sqlsessionfactorybuilder().build(inputstream2);
        sqlsession sqlsession2 = sessionfactory2.opensession();
        usermapper usermapper2 = sqlsession2.getmapper(usermapper.class);
        system.out.println("=========one===========");
        user user1 = usermapper1.getuserbyid(42); // 执行sql语句
        system.out.println(user1);
        sqlsession1.commit();
        system.out.println("=========two===========");
        user user2 = usermapper2.getuserbyid(42); // 执行sql语句
        system.out.println(user2);
    }
    @after
    public void close() throws ioexception {
        //inputstream.close();
        //sqlsession.close();
    }
} 
开启缓存:
1.在sqlmapconfig.xml 文件开启二级缓存,默认开启,可以省略
<settings>
    <!-- 开启二级缓存的支持 -->
    <setting name="cacheenabled" value="true"/>
</settings> 
2.配置相关的mapper映射文件 开启局部缓存(必须有)
 <!-- 开启二级缓存的支持 -->
    <cache></cache> 
            
                                            
                                            
发表评论