这两个 代码片段 就是 最 经典的 冗余。那么 我们就要去处理 掉它。
<sql id="if-title-author">
<if test="title != null">
title = #{title},
</if>
<if test="author != null">
author = #{author}
</if>
</sql>
<select id="queryBlogIF" parameterType="map" resultType="top.muquanyu.pojo.Blog">
select * from test.blog
<trim prefix="where" prefixOverrides="and || or">
<include refid="if-title-author"></include>
</trim>
</select>
sql 片段 一般 都不写 <set> 、 <trim> 和 <where> ,都是 直接 写 if 片段的。
当你 多选 对象 进行 遍历 查询的时候,我们可以 直接 用 该 标签 进行 配置。而不需要 在 java 里面 写 拼接的 SQL。
<select id="getListBymultiID" resultType="top.muquanyu.pojo.Blog" parameterType="map">
select * from test.blog
<where>
<foreach collection="ids" index="index" item="id" open="(" close=")" separator=",">
id = #{id}
</foreach>
</where>
</select>
@Test
public void getListBymultiIDTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
ArrayList<String> arr = new ArrayList<>();
arr.add("dc804c0110814455bdc1a6b3f7a9f8fa");
arr.add("095edf086896421cae70fee8eb4ad56f");
arr.add("23fae76722864d7d8b8582625378fbac");
HashMap<String, Object> map = new HashMap<>();
map.put("ids",arr);
List<Blog> listBymultiID = mapper.getListBymultiID(map);
for (Blog blog : listBymultiID) {
System.out.println(blog);
}
sqlSession.close();
}
存到 内存中的 临时数据 叫 缓存。
将用户 经常查询的 数据放在 缓存(内存)中,用户去查询的数据就不用放到硬盘上 然后再去查询了。我们可以 直接 通过 缓存 进行 查询,从而 提高 查询的效率。这样 也能 解决 高并发 系统的 性能问题!
读写分离:比如 我们加了 索引,那么 读的速度就会提高,但是 写的速度 又会下降,那么 我们 就 可以 用一台服务器 专门 去 读,另一台 服务器 专门 去写。这样就可以 大大提高 数据库读写的效率!!!
为什么 要 使用缓存?
答:当然是 减少 与 数据库的 交互次数,交互的 次数越少,系统的额外开销 也就越少,也就 提高了 系统的效率。
什么样的数据能使用 缓存呢?
答:如果 一些数据 经常的 去查询,那就 可以 使用 缓存。最近这阵子,我就用 wordpress 自己 搭建了 一个 官网,官网里面的数据库 总要进行 查询,我就弄了个 缓存插件。然后 访问的 速度 大大提高了不少。
二级缓存
。
一级缓存 如下:(只要 使用了 SqlSession 一级缓存 就自动开启了。)
查询 相同的 记录,肯定 就不需要 再去走一遍SQL 语句 去 查询了。直接 拿缓存 就行。你看下面的图:
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("title","aaaa");
List<Blog> blogs = mapper.queryBlogIF(map);
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession.clearCache();// 清理掉 缓存
System.out.println("-----------------------------------------");
List<Blog> blogsB = mapper.queryBlogIF(map);// 测试缓存
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession.close();
}
一级缓存 底层是一个 map,就是 我们 存入一个 键值对,把 之前查过的 记录 存到 这个 map 里面,然后 再去 执行 这个 sql 的时候,就 直接拿 对应的 值 就可以了。