MyBatis入门——day4
一 . 动态SQL
动态SQL的意义在于,在 SQL语句的部分考虑各种参数情况后直接写死固定,用户只需要 改动 java的部分 即可
1 . 搭建环境
1 . 实体类:
2 . 接口:
二 . if
上面的 where 1=1不规范,应将 where 关键字 去掉后加入 where 标签
三 . choose(类似于switch语句)+ when
PS: 类似于上面这样先套一个where标签,可以解决当第一个匹配条件失效时,因为第二个条件开头是 and 而出现的语法错误
所以若语句开头为 “and” 和 “or” 时,where 会自动去除,以保证语句没有语法错误
四 . set + if
1 . 此处的逗号和上面 choose_when 中的 and一样,如果第一个条件不成立,则语句会出现错误
set 标签可以避免这种情况,自动将开头位置的逗号删除
五 . SQL片段
将一段通用的SQL语句作为一个片段模板,避免重复书写,直接使用
1 . 抽取公共部分
2 . 在别处使用 include标签 的 refid 进行引用
PS:1 . 最好基于单表
2 . 不要包含 where标签,否则拼接可能出错
六 . foreach
1 . 传递一个万能的 map 进去,map中包含一个 id
总结:最好是先将SQL写出来,再用动态SQL的思路去改写
七 . 缓存
1 . 什么是缓存:存在内存中的临时数据
2 . 为什么使用缓存:减少与数据库的交互次数,减少系统开销,提高效率
3 . 什么样的数据适合使用缓存:经常查询且不经常改变
4 . MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存
默认情况下,只有一级缓存开启,称为本地缓存(SqlSession级别的缓存)
二级缓存需要手动开启和配置(基于namespace级别的缓存)
为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
5 . 一级缓存
从下图可知,SQL语句只查询了一次,输出第二行时没有进入数据库查询
True 表示使用的是同一种对象
6 . 缓存失效的情况:
1 . 查询不同的东西
2 . 增删改查操作会改变原来的数据,所以会刷新缓存
7 . 二级缓存
因为一级缓存的作用域太低,所以诞生了二级缓存
二级缓存也叫全局缓存,基于namespace级别
一个namespace对应一个二级缓存
1.开启全局缓存
2 . 使用或自定义
总结:
1 . 查询到对的数据默认先放在一级缓存中
2 . 当会话提交和关闭时,一级缓存中的的数据才能转到二级缓存中
8 . 缓存原理
用户
查找数据的顺序:
1 . 先看二级缓存
2 . 再看一级缓存
3 . 如果二级一级缓存都没有,最后再走数据库