跟着狂神说的视频梳理一下自己学过的东西
动态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);
<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>
<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>
<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 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>
<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的查询中,可以在二级缓存中拿到数据
查出的数据会被默认放到一级缓存中,只有会话提交或关闭后,一级缓存的数据才会转到二级缓存中。