mybatis 缓存
通过Mybatis缓存可有效减少Java程序和数据库之间的交互次数
mybatis 提供两种缓存机制:一级缓存 和 二级缓存
一级缓存
mybatis 自带一级缓存无需另外开启(无法关闭),数据存储在Sqlsession中,作用范围在同一个Sqlsessi,当使用Sqlsession对象第一次执行sql语句时,数据会自动存入Sqlsession对象,第二次使用直接从Sqlsession对象中获取
Java代码
InputStream inputStream = Test1.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = build.openSession();
BorrowsMapper mapper = sqlSession.getMapper(BorrowsMapper.class);
Borrows borrows1 = mapper.findById("1100011");
Borrows borrows2 = mapper.findById("1100011");
System.out.println(borrows1);
System.out.println(borrows2);
执行结果
二级缓存
二级缓存默认关闭需要手动开启,作用域范围比一级缓存要大,为Mapper级别,只要是来自同一个Mapper.xml/Mapper接口,无论是否通过同一个SqlSession对象,都可以共用缓存
开启方法:
- 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="logImpl" value="STDOUT_LOGGING" />
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="cacheEnabled" value="true"/>
</settings>
- Mapper.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.eleven.mapper.CardMapper">
<select id="findById" parameterType="java.lang.String" resultType="Card">
select * from Card where CNO = #{CNO}
</select>
<cache></cache>
</mapper>
- 实体类实现序列化接口
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Card implements Serializable {
private String CNO;
private String NAME;
private String CLASS;
}
Java代码
InputStream inputStream = Test1.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession1 = build.openSession();
SqlSession sqlSession2 = build.openSession();
CardMapper mapper1 = sqlSession1.getMapper(CardMapper.class);
CardMapper mapper2 = sqlSession2.getMapper(CardMapper.class);
System.out.println(mapper1.findById("sx001"));
sqlSession1.close();
System.out.println(mapper2.findById("sx001"));
执行结果