• Mybatis 11


    11.1 <sql> 和


    • <sql> 标签 是 把 mybatis 的 xml 文件中,sql 拼接的 代码段,给 进行 一个 封装。然后 来回 的 去 应用。
    • <foreach> 可以对 一个 常见的 业务需求 进行一个 很好的方案解决。比如说 多选 对象时,进行 查询。

    11.1.1 <sql> 标签

    在这里插入图片描述
    这两个 代码片段 就是 最 经典的 冗余。那么 我们就要去处理 掉它。
    在这里插入图片描述

    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    sql 片段 一般 都不写 <set> 、 <trim> 和 <where> ,都是 直接 写 if 片段的。


    11.2.1 <foreach> 标签

    当你 多选 对象 进行 遍历 查询的时候,我们可以 直接 用 该 标签 进行 配置。而不需要 在 java 里面 写 拼接的 SQL。

    • open:整体 拼接 SQL 的前缀
    • close: 整体 拼接 SQL 的后缀
    • separator:每个 元素 的 分隔符
    • collection:要遍历 的 集合 的 Java 代码中的 名称,直接 写就行。
        <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

        @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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    11.3.1 缓存

    • 存到 内存中的 临时数据 叫 缓存。

    • 将用户 经常查询的 数据放在 缓存(内存)中,用户去查询的数据就不用放到硬盘上 然后再去查询了。我们可以 直接 通过 缓存 进行 查询,从而 提高 查询的效率。这样 也能 解决 高并发 系统的 性能问题!
      在这里插入图片描述
      读写分离:比如 我们加了 索引,那么 读的速度就会提高,但是 写的速度 又会下降,那么 我们 就 可以 用一台服务器 专门 去 读,另一台 服务器 专门 去写。这样就可以 大大提高 数据库读写的效率!!!

    • 为什么 要 使用缓存?
      答:当然是 减少 与 数据库的 交互次数,交互的 次数越少,系统的额外开销 也就越少,也就 提高了 系统的效率。

    • 什么样的数据能使用 缓存呢?
      答:如果 一些数据 经常的 去查询,那就 可以 使用 缓存。最近这阵子,我就用 wordpress 自己 搭建了 一个 官网,官网里面的数据库 总要进行 查询,我就弄了个 缓存插件。然后 访问的 速度 大大提高了不少。


    11.3.2 Mybatis 缓存

    • MyBatis 系统中 默认 定义了 两级缓存:一级缓存二级缓存
    1. 默认情况下,只有 一级缓存开启了。(SqlSession 级别的缓存,也称为 本地缓存。
    2. 二级缓存 则需要 手动去开启,它 是基于 namespace 级别的缓存。
    3. 为了 提高扩展性,Mybatis 还定义了 缓存的接口 Cache。即 我们可以通过 实现 Cache 接口,来自定义 二级缓存

    在这里插入图片描述
    一级缓存 如下:(只要 使用了 SqlSession 一级缓存 就自动开启了。)
    在这里插入图片描述
    查询 相同的 记录,肯定 就不需要 再去走一遍SQL 语句 去 查询了。直接 拿缓存 就行。你看下面的图:
    在这里插入图片描述

    在这里插入图片描述

    1. 如果同时 查询 不一样的 记录,那么 肯定 要再次 执行 一遍 SQL
      在这里插入图片描述
      你看,不同的 记录查询,它 肯定 还要 再去执行 一遍 SQL 的,就不能从 缓存 中直接拿了。
      在这里插入图片描述
    2. 数据变动后,缓存 也会刷新,即缓存失效。(因为 数据以及变动了,所以 可能会改变 现有缓存的 数据 与 现在的数据 不一致的问题,那么就肯定 要刷新缓存,重新获取。
    3. 不同的 Mapper.xml 在 进行 查询 记录的时候,是单独 算的,不会 直接 从 缓存 中去拿。
    4. 手动清理缓存!就可以把 缓存 干掉。
      @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();
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述
    一级缓存 底层是一个 map,就是 我们 存入一个 键值对,把 之前查过的 记录 存到 这个 map 里面,然后 再去 执行 这个 sql 的时候,就 直接拿 对应的 值 就可以了。

  • 相关阅读:
    JAVA小游戏 “拼图”
    数智亚运刷屏,优化赛事管理的神器我们也有!
    【每日一题Day347】LC136只出现一次的数字 | 位运算
    如何在线批量将PDF转换成JPG格式
    深度学习-神经网络原理2
    Graph RAG: 知识图谱结合 LLM 的检索增强
    Golang:将日志以Json格式输出到Kafka
    Linux环境变量之shell中export定义全局变量和echo 变量的区别
    现代C++(Modern C++)基本用法实践:N、其他零散的常用特性
    shiro回话管理
  • 原文地址:https://blog.csdn.net/qq_52606908/article/details/125542463