动态 SQL 和缓存机制
动态SQL
所谓动态SQL就是可以在SQL中自定义修改和添加逻辑。原本的SQL语句是写死的,当需要进行区分时,需要再次写SQL语句,所以动态SQL可以通过自定义逻辑来处理。
List<Student> getStudentBy(Map<String,Integer> map);
<!--动态SQL-->
<select id="getStudentBy" resultType="Student">
select * from student
<where>
<if test="sid != null">
id = #{sid}
</if>
<if test="sname != null">
and name = #{sname}
</if>
</where>
</select>
<select id="getStudentBy2" resultType="Student">
select * from student
<where>
<choose>
<when test="sid != null">
id = #{sid}
</when>
<when test="sname != null">
and name = #{sname}
</when>
<otherwise>
and tid = #{tid}
</otherwise>
</choose>
</where>
</select>
//测试类
@Test
public void test8() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
HashMap map = new HashMap();
map.put("sid",1);
List<Student> students = mapper.getStudentBy(map);
for (Student student : students) {
System.out.println(student);
}
sqlSession.close();
}
其它更多动态SQL,看官方文档
MyBatis缓存机制
什么是缓存[ Cache ]?
- 存在内存中的临时数据。
- 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
为什么使用缓存?
- 减少和数据库的交互次数,减少系统开销,提高系统效率。
什么样的数据能使用缓存?
- 经常查询并且不经常改变的数据。
MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。
MyBatis系统中默认定义了两级缓存: 一级缓存和二级缓存
默认情况下,只有一级缓存开启。(SqISession级别的缓存,也称为本地缓存)
二级缓存需要手动开启和配置, 他是基于namespace级别的缓存。
为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
一级缓存默认是开启的,只在一-次SqISession中有效,也就是拿到连接到关闭连接这个区间段!一级缓存相当于马Map集合
缓存失效的情况:
- 1.查询不同的东西
- 2.增删改操作,可能会改变原来的数据,所以必定会刷新缓存!
- 3.查询不同的Mapper.xm|
- 4.手动清理缓存!(sqlSession.clearCache())
开启二级缓存
<!--在mybatis-config.xml的setting中配置--> <!--显示的开启全局缓存--> <setting name="cacheEnabled" value="true"/>
<!--在Mapper.xml文件中配置--> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
FIFO缓存,每隔60秒刷新,最多可以存储结果对象或列表的512个引用,而且返回的对象被认为是只读的
工作机制
- 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中:
- 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
- 新的会话查询信息,就可以从二级缓存中获取内容;
- 不同的mapper查出的数据会放在自己对应的缓存(map) 中;
- 缓存顺序
- 先看二级缓存有没有
- 在看一级缓存有没有
- 再查询数据库
本作品采用《CC 协议》,转载必须注明作者和本文链接