if 标签

<if test="Expression"></if>

其中 Expression 为加强版本的 if 表达式,就是 Java 里面的 if 表达式(指可以调用其他方法),并且可以使用 and or 代替 && || 符号。

choose、when、otherwise 标签

故名思意就是很常规的标签罢了。

trim、where、set 标签

这三个标签主要是为了拓展 if 标签存在的。

主要是比如 and , 这些符号在拼接的时候不是很可控,所以多了这些标签。

where

where 标签有两个作用:

  1. 在内部有 if 判断成立的时候添加 where 符号
  2. 去掉句子开头的 and or 符号

set

set 标签也有两个作用:

  1. 在内部有 if 判断成立的时候添加 set 符号
  2. 去掉句子结尾的逗号

trim

trim 其实就是自定义版本的前两者,拥有属性 prefix 和 suffix 来设置内部 if 成立之后添加的关键词,suffixOverrides preffixOverrides 用来去除 if 里面可能会多出来的前后缀 and 或者 , 这些。

代替 where 的 trim:

1
<trim prefix="where" prefixOverrides="and"></trim>

代替 set 的 trim:

1
<trim prefix="set" suffixOverrides=","></trim>

forEach

forEach 标签主要用来对 Collection 和 Map 进行遍历:

  1. collection 用来指明遍历的集合或者 Map
  2. item 单个元素的变量名
  3. open 遍历内容之前的东西,如 (
  4. close 遍历内容之后的东西,如 )
  5. separator 遍历内容之间的分隔符
  6. index 遍历内容的索引(Map 中是键)
1
2
3
<foreach collection="users" item="user" open="(" close=")" separator="," index="i">
#{user}
</foreach>

大概就这样啦!

sql include 标签

这两个标签是放在一起使用的,sql 标签用来抽取 SQL 语句, inlcude 标签用来引用被抽取的 SQL 语句。

OGNL 表达式

OGNL Object Graph Navigation Language 对象导航图语言,也就是 test 判断里面使用的语言。

内容有亿点点复杂,先不研究了!

缓存

在 MyBatis 里面缓存其实就是一个 Map,一个用 SQL 语句作为 Key,查询结果作为 Value 的一个 Map,缓存能减少数据库的压力,大大加快系统的运行速度。

一级缓存

MyBatis 的一级缓存就是 SqlSession 级别的缓存,是线程级别的缓存,是默认生效的。每个 SqlSession 的连接都有自己单独的一级缓存区域,不同连接的一级缓存不共享。

对于同一个 Session 连接来说,只要缓存不刷新,缓存就能一直用。当这个 Session 调用了 update delete create 方法之后,一级缓存就会被刷新(Map 清空)。

二级缓存

二级缓存是一个作用与所有 SqlSession 的共享缓存,二级缓存默认不使用。如果想要打开的话,需要开启全局配置 cacheEnabled 为 true,然后在 mapper.xml 文件里面加入 <cache></cache> 标签。

当一个 SqlSession 被 commit() 或者 close() 之后,它的一级缓存就会被放入二级缓存中。

二级缓存的刷新是需要设置的,SQL 标签里面有一个选项 flushCache,设置为 true 之后,执行语句会连着二级缓存一起刷新。

<cache></cache> 标签里面有一些属性,可以设置缓存回收策略(当缓存空间满了之后处理),返回的缓存是复制出来的还是直接给引用等等。

MyBatis 使用缓存的原则是先从二级缓存找数据,没有再去一级缓存。

不过以后我们都是使用第三方的缓存系统的比如 Redis,MyBatis 本身做的有点菜。