0%

MyBatis基础3

跟着狂神说的视频梳理一下自己学过的东西

动态SQL

动态SQL是根据不同的查询条件,生成不同的SQL语句

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//接口:根据作者名和博客名来查询博客!如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名来查询
List<Blog> queryBlogIf(Map map);
//BlogMapper.xml

//if and where
<select id="queryBlogIf" parameterType="map" resultType="blog">
select * from blog
<where>
<if test="title != null">
title = #{title}
</if>
<if test="author != null">
and author = #{author}
</if>
</where>
</select>
//这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。

//set
<update id="updateBlog" parameterType="map">
update blog
<set>
<if test="title != null">
title = #{title},
</if>
<if test="author != null">
author = #{author}
</if>
</set>
where id = #{id};
</update>

//choose只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句
<select id="queryBlogChoose" parameterType="map" resultType="blog">
select * from blog
<where>
<choose>
<when test="title != null">
title = #{title}
</when>
<when test="author != null">
and author = #{author}
</when>
<otherwise>
and views = #{views}
</otherwise>
</choose>
</where>
</select>

//SQL片段:最好使用单表定义sql片段,在sql片段中不要包括where
<sql id="if-title-author">
<if test="title != null">
title = #{title}
</if>
<if test="author != null">
and author = #{author}
</if>
</sql>
<select id="queryBlogIf" parameterType="map" resultType="blog">
select * from blog
<where>
<!-- 引用 sql 片段,如果refid 指定的不在本文件中,那么需要在前面加上 namespace -->
<include refid="if-title-author"></include>
<!-- 在这里还可以引用其他的 sql 片段 -->
</where>
</select>

//foreach:List<Blog> queryBlogForeach(Map map);
<select id="queryBlogForeach" parameterType="map" resultType="blog">
select * from blog
<where>
<!--
collection:指定输入对象中的集合属性
item:每次遍历生成的对象
open:开始遍历时的拼接字符串
close:结束时拼接的字符串
separator:遍历对象之间需要拼接的字符串
select * from blog where 1=1 and (id=1 or id=2 or id=3)
-->
<foreach collection="ids" item="id" open="and (" close=")" separator="or">
id=#{id}
</foreach>
</where>
</select>

缓存

  • 一级缓存:SqlSession级别(本地缓存),默认开启
  • 二级缓存:namespace级别(全局缓存),手动开启和配置
一级缓存失效的情况
  • sqlSession不同,每个sqlSession中的缓存相互独立
  • sqlSession相同,查询条件不同
  • 两次查询期间进行了增删改操作
  • 手动清除一级缓存
二级缓存

一个sqlSession查询一条数据,关闭后,再开启新的会话,就可以从二级缓存中获取内容。不同的mapper查出的数据会放在自己对应的缓存中。

只要开启了二级缓存,我们在同一个mapper的查询中,可以在二级缓存中拿到数据

查出的数据会被默认放到一级缓存中,只有会话提交或关闭后,一级缓存的数据才会转到二级缓存中。