mybatis:动态sql【2】+转义符+缓存

news2024/9/28 9:26:58

目录

一、动态sql

1.set、if

2.foreach

二、转义符

三、缓存cache

1. 一级缓存

2. 二级缓存


一、动态sql

1.set、if

        在update语句中使用set标签,动态更新set后的sql语句,,if作为判断条件。

    <update id="updateStuent" parameterType="Student">
        update student
        <set>
            <if test="num!=0">num=#{num},</if>
            <if test="name!=null">name=#{name},</if>
            <if test="gender!=0">gender=#{gender}</if>
        </set>
        where id = #{id}
    </update>

2.foreach

foreach对集合进行遍历,尤其是in条件语句

    <delete id="deleteStudents" parameterType="list" >
        delete from student where id in
        <foreach collection="list" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </delete>

collection 是传入参数名,item为元素名,separator代表元素之间的间隔符。  

详细动态sql可查看官网 :mybatis – MyBatis 3 | 动态 SQL

二、转义符

1.在 mybatis 中的 xml 文件,一些特殊符号需要转译:

特殊字符转译字符
<&lt;
"&quot;
&apos;
&&amp;
>&gt;

2.使用<![CDATA[]]> 

通过<![CDATA[ 特殊字符 ]]>包裹特殊字符也可以

    <!--转义字符   " <" 号会报错,">" 号不会报错  -->
    <select id="findstuTurn" resultType="Student">
        select id,num,gender from student where num &lt; 1000
    </select>

    <select id="findstuTurn2" resultType="Student">
        select id,num,gender from student where num <![CDATA[ < ]]> 1000
    </select>

注意:

  1.  " <" 号会报错,">" 号不会报错;
  2.  如果<![CDATA[ ]]> 里有<if> </if> <where> </where><choose> </choose> <trim> </trim> 等这些标签都不会被解析,所以只把有特殊字符的语句放在 <![CDATA[ ]]> 尽量缩小<![CDATA[ ]]>的范围。 

三、缓存cache

缓存作用:让程序更快的访问数据,减少对数据库的访问压力。

缓存原理:从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存)中,当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库执行select 语句,从而减少了对数据库的查询次数,因此提高了数据库的性能。

mybatis有两种缓存方式:

1. 一级缓存

     在同一个SqlSession中执行相同的sql且参数也相同(完全相同的sql查询),第二次查询时,直接从sqlSession中获取,而不再从数据库中获取。   在没有默认配置情况下,mybatis开启一级缓存。

例如:

     @Test
     void testCache(){
        SqlSession sqlSession = MybatisUtil.getSqlsession();
        StudentDao studentDao =  sqlSession.getMapper(StudentDao.class);

        List<Student> students = studentDao.findstuTurn();
        System.out.println(students);

        List<Student> student2= studentDao.findstuTurn();
        sqlSession.commit();
        sqlSession.close();
    }

日志中只显示一条查询 

 

一级缓存失效:

  1. sqlSession.close();
  2. sqlSession.clearCache();
  3. SqlSession 中执行了任何一个修改操作(update()、delete()、insert()) ,都会清空缓存的数据。

2. 二级缓存

二级缓存是 SqlSessionFactory 级别的,数据存放在SqlSessionFactory中。

需要手动启动:

1.在核心配置文件中开启二级缓存:

        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>

2.将 POJO 类实现序列化接口:

        implements Serializable

3.在mapper映射文件中添加cache标签,表示此mapper开启二级缓存:

    <cache flushInterval="100000" ></cache>

 flushInterval可以设置刷新时间(缓存失效)

当 SqlSeesion 关闭时,会将数据存入到二级缓存。

示例:

    @Test
    void testCache1(){
        SqlSession sqlSession = MybatisUtil.getSqlsession();
        StudentDao studentDao =  sqlSession.getMapper(StudentDao.class);

        List<Student> students = studentDao.findstuTurn();
        System.out.println(students);
        sqlSession.commit();
        //sqlSession关闭
        sqlSession.close();
        

        SqlSession sqlSession2 = MybatisUtil.getSqlsession();
        StudentDao studentDao2 =  sqlSession2.getMapper(StudentDao.class);

        List<Student> students2 = studentDao2.findstuTurn();
        System.out.println(students2);
        sqlSession2.commit();
        sqlSession2.close();
    }

结果只查询一次: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/934059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】容器适配器stack、queue以及deque容器

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、什么是容器适配器1.1 stack的…

开源软件的漏洞响应:应对安全威胁

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

岛屿数量00

题目链接 岛屿数量 题目描述 注意点 grid[i][j] 的值为 ‘0’ 或 ‘1’ 解答思路 使用广度优先遍历思想遍历整个岛屿遍历整个二维网络&#xff0c;如果此时位置处的值为1&#xff0c;则当前位置是一个岛的一部分&#xff0c;从该位置向着四个方向遍历出整个岛屿&#xff0…

【滑动窗口】leetcode3:无重复字符的最长子串

一.题目描述 无重复字符的最长子串 二.思路分析 题目要求我们找符合要求的最长子串&#xff0c;要求是不能包含重复字符 确定一个子串只需确定它的左右区间即可&#xff0c;于是我们可以两层循环暴力枚举所有的子串&#xff0c;找到符合要求的&#xff0c;并通过比较得到最长…

5G+智慧交通行业解决方案[46页PPT]

导读&#xff1a;原文《5G智慧交通行业解决方案[46页PPT]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 喜欢文章&#xff0c;您可以点赞评论转发本文&#xff0c;…

基于Java+SpringBoot+Vue前后端分离贸易行业crm系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

小研究 - JVM 逃逸技术与 JRE 漏洞挖掘研究(七)

Java语言是最为流行的面向对象编程语言之一&#xff0c; Java运行时环境&#xff08;JRE&#xff09;拥有着非常大的用户群&#xff0c;其安全问题十分重要。近年来&#xff0c;由JRE漏洞引发的JVM逃逸攻击事件不断增多&#xff0c;对个人计算机安全造成了极大的威胁。研究JRE安…

小研究 - Java虚拟机内存管理分析

讨论了&#xff2a;&#xff41;&#xff56;&#xff41;关键技术组成&#xff0c;深入介绍了&#xff2a;&#xff41;&#xff56;&#xff41;虚拟机的体系结构&#xff0c;分析了虚拟机中内存管理的垃圾回收机制。同时&#xff0c;对现有的一些流行垃圾回收算法进行了深入…

5年经验之谈 —— APP和WEB的测试区别

在功能测试时&#xff0c;要考虑手机应用的特性&#xff1a; 1&#xff09;手机屏幕尺寸偏小&#xff0c;所以手机应用一般就占满了全屏&#xff0c;因此要考虑手机在前后端切换时被测试应用在资源使用时的优先级变化情况&#xff1b;还要考虑手机横竖屏切换时的测试 2&#xf…

yolov5中添加ShuffleAttention注意力机制

ShuffleAttention注意力机制简介 关于ShuffleAttention注意力机制的原理这里不再详细解释.论文参考如下链接here   yolov5中添加注意力机制 注意力机制分为接收通道数和不接受通道数两种。这次属于接受通道数注意力机制,这种注意力机制由于有通道数要求,所示我们添加的时候…

引导滤波(guided filter)与快速引导滤波(fast guided filter)理解

最近在学习图片的滤波和去噪的相关知识&#xff0c;查阅了一些资料参考了一些博客&#xff0c;这里做一个整合&#xff0b;理解。参考的博客资料在文末。 引入普通滤波的概念 假设输入图像为p&#xff0c;滤波窗口为wk,经过滤波后的输出图像为q,那么q图的第i个像素是由输入图p中…

Vue2向Vue3过度核心技术声明式导航

目录 1 声明式导航-导航链接1.需求2.解决方案3.通过router-link自带的两个样式进行高亮4.总结 2 声明式导航-两个类名1.router-link-active2.router-link-exact-active3.在地址栏中输入二级路由查看类名的添加4.总结 3 声明式导航-自定义类名1.问题2.解决方案3.代码演示4.总结 …

OpenSIPS 通话中 UPDATE 请求导致没有声音问题

文章目录 1. 问题现象2. 抓包排查3. 问题分析及解决方案 1. 问题现象 在 SIP 应用的开发中&#xff0c;通话一端听不到声音是比较常见的问题。一般来说&#xff0c;没有声音意味着 RTP 传输存在障碍&#xff0c;追根究底就是网络不通或者端口未开放等原因。但在实践中&#xf…

射频滤波器分析报告(声表面波滤波器/BAW/超声)

目录 一、射频芯片技术与产品概述二、5G时代滤波器需求潜力巨大三、全球滤波器市场现状3.1 基站3.2 手机端 四、射频芯片国内发展情况4.1 国内射频芯片概况4.2 国内射频滤波器发展情况4.3 BAW的重重困难4.4 终端厂商的参与 五 机会分析5.1 5G通信5.2 卫星通信5.3 雷达行业5.4 新…

Cinema 4D软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Cinema 4D&#xff08;简称C4D&#xff09;是由德国Maxon Computer公司开发的一款三维动画渲染和建模软件&#xff0c;广泛应用于影视、广告、工业设计等领域。C4D因其高效率、易用性和强大的功能而受到广大设计师和艺术家的青睐…

第四章文件管理

0.初识文件管理 一个文件有哪些属性?文件名:由创建文件的用户决定文件名&#xff0c;主要是为了方便用户找到文件&#xff0c;同一目录下不允许有重名文件。 标识符:一个系统内的各文件标识符唯一&#xff0c;对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一…

pandas-03-组合连接数据

采集的数据存储后通常会分为多个文件或数据库&#xff0c;如何将这些文件按需拼接&#xff0c;或按键进行连接十分重要。这节将介绍数据索引的复杂操作如分层索引&#xff0c;stack,unstack,seet_index,reset_index等帮助重构数据&#xff0c;数据的拼接如merge,join,concat,co…

pandas数据分析——groupby得到分组后的数据

groupbyagg分组聚合对数据字段进行合并拼接 Pandas怎样实现groupby聚合后字符串列的合并&#xff08;四十&#xff09; groupby得到分组后的数据 pandas—groupby如何得到分组里的数据 date_range补齐缺失日期 在处理时间序列的数据中&#xff0c;有时候会遇到有些日期的数…

python编程环境使用技巧3-程序打包pyinstaller

前言 在Python中&#xff0c;打包指的是将Python代码和相关资源&#xff08;如配置文件、图像等&#xff09;整合到一个可执行的文件或安装包中&#xff0c;以便于在其他环境中使用。 下面是使用pyinstaller进行打包的简要步骤&#xff1a; 1-安装pyinstaller&#xff1a;在命…

python之OCR文字识别

将图片翻译成文字一般被称为光学文字识别&#xff08;Optical Character Recognition&#xff0c;OCR&#xff09;。可以实现OCR 的底层库并不多&#xff0c;目前很多库都是使用共同的几个底层OCR 库&#xff0c;或者是在上面进行定制。 方法一&#xff1a; 使用easyocr模块 …