当前位置: 代码网 > it编程>编程语言>Java > MyBatis的缓存!!!!

MyBatis的缓存!!!!

2024年08月06日 Java 我要评论
走缓存:同一个sqlSessionFactrory,sqlsession执行commit或close。不走缓存:不同sqlSessionFactrory 或 两次查询之间执行了增删改。不走缓存:不同sqlSession 或 两次查询之间执行了增删改。范围:二级缓存范围是sqlSessionFactory。走缓存:同一个sqlsession执行同一条sql。范围:一级缓存范围是sqlSession。(1)在UserMapper接口中创建两个方法:同上。配置:
  • 为什么使用缓存?

    首次访问时,查询数据库,并将数据存储到内存中;再次访问时直接访问缓存,减少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>

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com