动态 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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!