-
为什么使用缓存?
首次访问时,查询数据库,并将数据存储到内存中;再次访问时直接访问缓存,减少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>
发表评论