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

目录

一、动态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开启一级缓存。

例如:

     @Testvoid 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 关闭时,会将数据存入到二级缓存。

示例:

    @Testvoid 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.hqwc.cn/news/88576.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何理解IaaS、PaaS、SaaS?盘点受欢迎的八大SaaS平台!

如何理解IaaS、PaaS、SaaS&#xff1f;他们各自的优势在哪里&#xff1f;我们又应该如何选择&#xff1f;本篇将带大家深入浅出的了解IaaS、PaaS、SaaS&#xff0c;并为大家盘点2023最受欢迎的SaaS平台。 通过本文你将了解&#xff1a; IaaS、PaaS、SaaS分别是什么我们该如何理…

省级智慧农业大数据平台项目规划建设方案[195页Word]

导读&#xff1a;原文《省级智慧农业大数据平台项目规划建设方案[195页Word]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 1 农业大数据平台项目概述 1.1 建设…

每日两题 111二叉树的最小深度 112路径总和(递归)

111 题目 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2示例 2&#x…

Java 程序打印 OpenCV 的版本

我们可以使用 Java 程序来使用 OpenCV。 OpenCV 的使用需要动态库的加载才可以。 加载动态库 到 OpenCV 的官方网站上下载最新的发布版本。 Windows 下载的是一个可执行文件&#xff0c;没关系&#xff0c;这个可执行文件是一个自解压程序。 当你运行以后会提示你进行解压。…

WordPress导航主题源码

源码说明&#xff1a; V2.0406 添加搜索自动索引百度热搜关键词 添加首页tab标签模式加载方式切换(ajax加载和普通加载)(首页设置) 修复tab标签ajax加载模式会显示未审核的网址的bug 小屏幕热搜采用水平滚动 优化子主题支持 添加文章分页 添加解决WordPress 429的服务(…

Gorilla LLM:连接海量 API 的大型语言模型

如果你对这篇文章感兴趣&#xff0c;而且你想要了解更多关于AI领域的实战技巧&#xff0c;可以关注「技术狂潮AI」公众号。在这里&#xff0c;你可以看到最新最热的AIGC领域的干货文章和案例实战教程。 一、前言 在当今这个数字化时代&#xff0c;大型语言模型&#xff08;LLM…

Element table根据字段合并表格(可多字段合并),附带拖拽列动态合并

效果如图&#xff0c;姓名 数值1 字段进行自动合并 封装合并列js - tableMerge.js // 获取列合并的行数 // params // tableData: 表格数据 // mergeId: 合并的列的字段名 export const tagRowSpan (tableData, mergeId) >{const tagArr [];let pos 0;tableData.map((i…

C语言_分支和循环语句(2)

文章目录 前言一、for 循环1.1语法1.2 for 语句的循环控制变量1.3 一些 for 循环的变种 二、do ... while()循环2.1 do 语句的语法2.2 do ... while 循环中的 break 和 continue2.3 练习1 **- 计算n的阶乘**2. - **在一个有序数组中查找具体的某个数字 n** 二分查找算法&#x…

C++------map和set的使用

文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器 什么是关联式容器&#xff1f;它与序列式容器有什么区别&#xff1f; 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key&#xff0c;value>结…

报错sql_mode=only_full_group_by

首发博客地址 https://blog.zysicyj.top/ 报错内容 ### The error may exist in file[D:\code\cppCode20221025\leader-system\target\classes\mapper\system\TJsonDataMapper.xml] ### The error may involve defaultParameterMap ### The error occurred while…

软件工程(二十) 系统运行与软件维护

1、系统转换计划 1.1、遗留系统的演化策略 时至今日,你想去开发一个系统,想完全不涉及到已有的系统,基本是不可能的事情。但是对于已有系统我们有一个策略。 比如我们是淘汰掉已有系统,还是继承已有系统,或者集成已有系统,或者改造遗留的系统呢,都是不同的策略。 技术…

AI 绘画Stable Diffusion 研究(十五)SD Embedding详解

大家好&#xff0c;我是风雨无阻。 本期内容&#xff1a; Embedding是什么&#xff1f;Embedding有什么作用&#xff1f;Embedding如何下载安装&#xff1f;如何使用Embedding&#xff1f; 大家还记得 AI 绘画Stable Diffusion 研究&#xff08;七&#xff09; 一文读懂 Stab…