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

2023-11-19

目录

一、动态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();
    }

结果只查询一次: 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis:动态sql【2】+转义符+缓存 的相关文章

  • IntelliJ Ultimate 在 Play 2.3 (Java) 项目测试中找不到路由

    虽然我的测试运行得很好 但 IntelliJ 抱怨它找不到路由对象 并且代码自动完成无法工作 我已经查看了所有文档 这应该可以工作 这是 IntelliJ 的报告内容 关于我的项目配置可能有什么问题有什么想法吗 这很可能与以下事实有关 ro
  • 使用 google-api-java-client 的 2 足 OAuth

    有谁知道如何将 2 legged OAuth 与 google api java client 一起使用 我正在尝试访问 Google Apps 配置 API 以获取特定域的用户列表 以下不起作用 HttpTransport transpo
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • FXML 文件中的 getHostServices().showDocument()

    有没有简单的方法可以将 getHostServices showDocument 命令放入 toHomepage 方法中 而不是执行一行又一行的代码 这样代码应该看起来干净简单 package sample import javafx ap
  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng
  • Tomcat - 多个 webapps 文件夹

    是否可以有多个文件夹来放置要部署的应用程序 这些是如何定义的 是否可以将一个文件夹限制为仅是 domain com 的应用程序 而不是其他域 Thanks 看一眼conf server xml
  • 处理 ANTLR 4 中的错误

    遵循后接受的答案 https stackoverflow com a 18137301 2279200的指示处理 ANTLR4 中的错误 https stackoverflow com q 18132078 2279200问题 我遇到了以下
  • Android 反向地理编码不适用于华为设备

    我正在尝试通过这段代码反转地理编码纬度 经度 Geocoder geocoder new Geocoder context Locale ENGLISH try List
  • Mysql为简单频繁查询创建排序索引性能

    我正在处理一个包含大约 400 万条消息条目的 mysql 表 并尝试根据时间戳选择最新的 50 条消息 另一个要求是返回的消息不以固定前缀开头 问题是单个查询大约占用 25 的 cpu 并且最多需要 1 5 秒 该查询经常由多个客户端执行
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • 将 XML 从网站解析到 Android 设备

    我正在启动一个 Android 应用程序 它将解析来自网络的 XML 我创建了一些 Android 应用程序 但它们从未涉及解析 XML 我想知道是否有人对最佳方法有任何建议 这是一个例子 try URL url new URL your
  • iText7 将 SVG 添加到 PdfDocument 中以及可能出现的问题

    关于问题的答案 如何使用 iText7 将 SVG 添加到 PDF 这是一个链接点击这里 https stackoverflow com questions 50059456 how to add an svg to a pdf using
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • 使用另一个表中的数据查找并替换 MySQL 中的字符串

    我有两个 MySQL 表 我想使用另一个表中的数据查找和替换一个表中的文本字符串 Table texts messages thx guys i think u r great thx again u rock Table dictiona
  • 文档过滤器在 Java 中不起作用?

    在超过 10 个字符的文本字段中 它必须显示错误 为此 我使用了文档过滤器 JTextField field JTextField txtFld AbstractDocument document AbstractDocument fiel
  • Java 中 .NET 的 Lambda 表达式

    我最近 再次 从 C 迁移到 Java 但我非常怀念 lambda 表达式和 C 的 IEnumerable Foreach 之类的东西 所以我正在寻找Java中的lambda表达式库 有比这更好的图书馆吗LambdaJ http code
  • 为什么 sql 字段名称中不应该包含逗号?

    人们一直告诉我列名中不应包含空格 我只是想知道 这是为什么 这是我为学校创建的一些数据库表遇到的问题 字段名称包括 Preble 和 Darke 相反 它们需要是 普雷布尔县 俄亥俄州 和 达克县 俄亥俄州 如果它们是行名称 我只需创建一个
  • 在没有 ODBC 的情况下从 Java 操作 Access 数据库

    我想从我的 Java 项目操作 Microsoft Access 数据库 accdb 或 mdb 文件 我不想使用 Microsoft 的 JDBC ODBC Bridge 和 Access ODBC 驱动程序 因为 JDBC ODBC 桥

随机推荐

  • 第八章、Linux 磁盘与文件系统管理

    系统管理员很重要的任务之一就是管理好自己的磁盘文件系统 每个分割槽不可太大也不能太小 太大会造成磁盘容量的浪费 太小则会产生文件无法储存的困扰 此外 我们在前面几章谈到的文件权限与属性中 这些权限与属性分别记录在文件系统的哪个区块内 这就得
  • 贝叶斯网络学习

    状态空间搜索 如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程 通俗点说 两点之间求一线路 这两点是求解的开始和问题的结果 而这一线路不一定是直线 可以是曲折的 由于求解问题的过程中分枝有很多 主要是求解过程
  • 神经网络——实现MNIST数据集的手写数字识别

    由于官网下载手写数字的数据集较慢 因此提供便捷下载地址如下 手写数字的数据集MNIST下载 https download csdn net download gaoyu1253401563 10891997 数据集包含如下 一 使用小规模数
  • 超级简单!vue解决前后端跨域问题,看完就会

    在Vue中解决前后端跨域问题 需要通过配置和设置代理来实现 配置 在Vue的config目录下的index js文件中 找到devServer选项 在其中添加如下代码 devServer proxy api target http loca
  • mysql my-innodb-heavy-4g.cnf_my-innodb-heavy-4G.cnf 配置文件

    client 客户端配置 port 3306 mysql连接时默认的端口号 socket tmp mysql sock 用于连接mysql mysqld 服务端配置 port 3306 mysql服务默认监听的端口 socket tmp m
  • window opengl

    接口 https www khronos org registry OpenGL api GL
  • 一文吃透KMP算法

    前提 假设我们在字符串 bacbababaabababca 中 搜寻字符串 abababca 是否存在 KMP算法过程 下面就KMP算法的匹配过程进行阐述 step0 在执行匹配之前 先定义几个概念 前缀集合 后缀集合 部分匹配值 前缀集合
  • 天梯题集——紧急救援(Dijkstra+倒序打印分析)

    Dijkstra算法 用于求单源到其他点的最短路径 紧急救援 该题与 Dijkstra模板题 的不同之处在于该题需要记录更多信息 主要思路从局部最优到整体最优 类似dp的思想 include
  • 函数指针的使用

    函数指针的初始化 调用方式 include
  • .net core 连接mysql_asp.net core 连接mysql

    打开VS 工具 NuGet包管理器 管理解决方案的NuGet程序包 搜索MySql Data并安装 测试连接MySQL的代码 using System using System Collections Generic using Syste
  • python快速编程入门黑马程序员pdf_Python快速编程入门 传智播客 黑马程序员 python编程从入门到实践基础视频教程核心编程爬虫数据分析程序设计机器学习简明书籍...

    传智播客就业系列 从入门到就业 JAVA从入门到精通 套装5本 148 javaweb从入门到精通套装3本 88 Python从入门到实践套装8本 280 php教程全套7本 227 PHP套装5本 165 php全套5本 149 andr
  • uniapp uviewUI 安卓端 无法显示问题

    今天遇到个坑 其他端正常显示 就到安卓端不行 发现是uview的form组件的问题 官方的表单没问题 排错发现是模拟器问题 不支持X86 CPU 换了个模拟器就好了 发个模拟器配置连接https ask dcloud net cn arti
  • vue+vant动态渲染生成form表单生成多个上传插件(页面配置化)

    页面配置化 根据数据库配置 动态生成表单的上传组件 后面有补充表单输入框 单选框 复选框 日期控件 下拉框 picker选择器 以及级联的动态渲染 上传插件动态 从后端读取页面配置的表单信息 渲染到页面 这里是多个上传插件渲染了 依次上传后
  • R语言实现文本情感分析

    在本博客中 我们将介绍如何使用R语言进行文本情感分析 我们将介绍如何处理文本数据 构建模型 训练模型并进行情感预测 这里我们将使用IMDb电影评论数据集进行示例分析 数据准备 首先 我们需要下载并加载IMDb电影评论数据集 可以从这里下载数
  • 域名注册绑定内网穿透项目部署

    文章目录 1 注册域名 2 域名绑定 3 内网穿透 4 项目部署 5 关于tomcat配置的补充 1 注册域名 本次演示以腾讯云注册域名为例 方式如下 百度搜索腾讯云进入官网 或者点击此链接跳转腾讯云 如果没有账号 使用微信或者QQ注册 然
  • 模拟实现通讯录<二>(动态模拟)

    继静态模拟通讯录 实现动态模拟 静态模拟通讯录博客链接 http blog csdn net bitboss article details 51374654 实现一个通讯录 通讯录可以动态存储信息 每个人的信息包括 姓名 性别 年龄 电话
  • TensorFlow CNN 测试CIFAR-10数据集

    1 CIFAR 10 数据集 CIFAR 10数据集是机器学习中的一个通用的用于图像识别的基础数据集 官网链接为 The CIFAR 10 dataset官方教程Convolutional Neural Networks 下载使用的版本是
  • pip下载速度过慢解决方法

    好久没用pip了 速度太慢 参考了一下这篇文章 与github访问太慢类似 在c 用户 你的用户名 目录下面建立一个pip目录 再在其下面建立一个pip ini文件 内容为 global index url https pypi tuna
  • OJ刷题---【算法课动态规划] 换硬币(C++完整代码)

    题目 给定面值分别为2 5 7的硬币 每种硬币有无限个 给定一个N 求组成N最少需要的硬币的数量 若无法组成则返回 1 输入 输入N 1 lt N lt 100 输出 输出需要的最少硬币个数 完整代码 C include
  • mybatis:动态sql【2】+转义符+缓存

    目录 一 动态sql 1 set if 2 foreach 二 转义符 三 缓存cache 1 一级缓存 2 二级缓存 一 动态sql 1 set if 在update语句中使用set标签 动态更新set后的sql语句 if作为判断条件