MyBatis框架-动态SQL-XML中的常用标签+特殊字符在XML中的显示

一、if标签、where标签、trim标签、choose标签、set标签、foreach标签

1、问题引入:where关键字和and关键字在动态SQL里面应该如何添加?

(1)if标签:

test属性的值是判断条件

if标签里面的内容是条件成立时添加到SQL语句中的字符串

(2)代码一:是否添加where关键字

<select id="findStudents" parameterType="Student" resultType="Student">select * from student where<if test="name!=null">name = #{name}</if>/*条件一*/<if test="gender!=null">gender = #{gender}</if>/*条件二*/<if test="phone!=null">phone= #{phone}</if>/*条件三*/</select>
  • 如果添加where关键字,如果三个条件全部成立,则where关键字后面将会没有查询条件,得到不正确的SQL语句
  • 如果不添加where关键字,如果三个条件中有成立的条件,没有where关键字,也会得到不正确的SQL语句

(3)代码二:是否添加and关键字

<select id="findStudents" parameterType="Student" resultType="Student">select * from student <if test="name!=null">name = #{name}</if>/*条件一*/<if test="gender!=null">and gender = #{gender}</if>/*条件二*/<if test="phone!=null">and phone = #{phone}</if>/*条件三*/</select>
  • 如果添加and关键字,如果只有条件二和条件三成立,那么得到的SQL语句前面多了一个and关键字,这条SQL语句为不正确的SQL语句
  • 如果不添加and关键字,如果只有条件二和条件三成立,那么得到的SQL语句的两个查询条件之间没有关键字进行连接,这条SQL语句为不正确的SQL语句

2、where标签解决动态SQL语句中的where关键字和and关键字的添加问题

(1)where标签:

  • 特点:

A、当where标签中的if标签的条件只要有一个成立,会在SQL语句的查询条件最前面自动添加一个where关键字

B、当where标签中成立的条件的开头有and/or关键字时,and/or关键字会被自动去除

 (2)代码验证:从数据库中查询所有的女同学信息

核心代码:

<select id="findStudents" parameterType="Student" resultType="Student">select * from student<where><if test="name!=null">name = #{name}</if><if test="gender!=null">and gender = #{gender}</if><if test="phone!=null">and phone = #{phone}</if></where></select>

测试代码:

SqlSession sqlSession=MybatisUtil.getSqlSession();StudentDao studentDao=sqlSession.getMapper(StudentDao.class);Student student=new Student();student.setGender("女");List<Student>list=studentDao.findStudents(student);System.out.println(list);sqlSession.close();

结果输出:

3、trim标签解决动态SQL语句中的where关键字和and关键字的添加问题

(1)trim标签:

  • prefix属性:其值是要在条件前面添加的指定的前缀,只有当有条件成立时该前缀才会自动添加到条件前面
  • prefixOverrides属性:其值是条件语句开头要覆盖掉的关键字,如果条件语句开头存在该关键字,那么该关键字将会被去除

(2)代码:查询电话号为123456的学生的信息

核心代码:

<select id="findStudents" parameterType="Student" resultType="Student">select * from student<trim prefix="where" prefixOverrides="and|or"><if test="name!=null">name = #{name}</if><if test="gender!=null">and gender = #{gender}</if><if test="phone!=null">or phone = #{phone}</if></trim></select>

 测试代码:

SqlSession sqlSession=MybatisUtil.getSqlSession();StudentDao studentDao=sqlSession.getMapper(StudentDao.class);Student student=new Student();student.setPhone("123456");List<Student>list=studentDao.findStudents(student);System.out.println(list);sqlSession.close();

结果输出:

4、choose标签解决简化不同条件查询同一类对象的问题

(1)choose标签:choose标签里面有when标签和otherwise标签两种标签。其中when标签有一个test属性,其值为判断条件,当该条件满足时会将when标签中的内容作为结果进行返回。而otherwise标签则是当其前面的when标签中的条件都不被满足时才会将otherwise标签中的内容作为结果进行返回。choose标签所实现的作用等效于if-else if-else

(3)代码:根据指定的姓名或电话号查询学生表

核心代码:

<select id="findStudents" parameterType="Student" resultType="Student">select * from student<trim prefix="where" prefixOverrides="and|or"><choose><when test="name!=null">name = #{name}</when><when test="phone!=null">phone = #{phone}</when><otherwise>gender = '男'</otherwise></choose></trim></select>

测试代码1:

/*student.setName("tom");*/
student.setPhone("178942");

运行结果1:

测试代码2:

/*student.setName("tom");*/
student.setPhone("178942");

运行结果2:

测试代码3:

/*student.setName("tom");*/
/*student.setPhone("178942");*/

运行结果3:

5、set标签解决updateSQL语句在实现多属性修改同类对象只需一个update标签所带来的开头缺set关键字和末尾逗号多余的问题(实现修改同一类对象只需要一个update标签加一个修改方法)

(1)set标签:set标签的作用是当set标签中有结果返回时会在返回结果的开头加上set关键字并且去除返回结果末尾的逗号

(2)代码:

核心代码1:

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

测试代码 1:修改学生的姓名和性别

SqlSession sqlSession=MybatisUtil.getSqlSession();
StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
Student student = new Student();
student.setName("liming");
student.setGender("男");
student.setId(9);
studentDao.updateStudent(student);
sqlSession.commit();
sqlSession.close();

运行结果1: 

核心代码2:

 <update id="updateStudent" parameterType="Student">update student<trim prefix="set" suffixOverrides=","><if test="name!=null">name=#{name},</if><if test="gender!=null">gender=#{gender},</if><if test="phone!=null">phone=#{phone}</if></trim>where id=#{id}</update>

测试代码 1:修改学生的电话号码

SqlSession sqlSession=MybatisUtil.getSqlSession();StudentDao studentDao=sqlSession.getMapper(StudentDao.class);Student student = new Student();student.setPhone("24680");student.setId(9);studentDao.updateStudent(student);sqlSession.commit();sqlSession.close();

运行结果2: 

6、foreach标签解决在构建in条件时在SQL语句中迭代集合的问题

(1)foreach标签

  • item属性的值是集合中的元素进行迭代时的别名
  • index属性的值是集合中元素进行迭代时迭代到的位置
  • collection属性的值是集合的类型:list/array
  • open属性的值是语句的开始字符串
  • separator属性的值是元素进行迭代时元素之间的分隔符
  • close属性的值是语句的结束字符串

(2)代码:

核心代码1:

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

测试代码1:在学生表中删除id为6,10的学生的信息

SqlSession sqlSession=MybatisUtil.getSqlSession();StudentDao studentDao=sqlSession.getMapper(StudentDao.class);List<Integer> ids = Arrays.asList(6,10);studentDao.deleteStudents(ids);sqlSession.commit();sqlSession.close();

运行结果1:

核心代码2:

<select id="findStudents1" resultType="Student">select<foreach collection="array" item="colName" separator=",">${colName}</foreach>from student</select>

测试代码2:查询学生的指定属性列(1个或多个属性列

SqlSession sqlSession=MybatisUtil.getSqlSession();StudentDao studentDao=sqlSession.getMapper(StudentDao.class);String[] colNames = {"gender","phone"};List<Student>list=studentDao.findStudents1(colNames);System.out.println(list);sqlSession.close();

运行结果2:

二、特殊符号在XML文件中的显示

1、在MyBatis中的XML文件中,要想显示特殊符号<、>、"、'、&,一种方法是对这些符号进行转义,以转义字符的形式在XML文件中进行显示

select * from student where id<if test="phone!=null &amp; gender!=null">> #{id}</if>
特殊字符        转义字符
<        &lt;
>&gt;
"&quot;
'&pos;
&&amp;

 另一种方法是使用<![CDATA[]]>包裹特殊字符在XML文件中进行显示

select * from student where id <![CDATA[<]]> 10

2、<![CDATA[]]>

(1)<![CDATA[]]>是XML语法,在CDATA中的所有内容都会被解析器忽略

(2)如if标签、where标签等的标签如果在CDATA中都不会被解析,因此我们只把有特殊字符且无标签的内容放在<![CDATA[]]>中。

(3)<![CDATA[]]>不能在双标签的头标签中被使用,否则程序会出错。

<if test="phone!=null <![CDATA[&]]> gender!=null">> #{id}</if>

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

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

相关文章

探秘嵌入式位运算:基础与高级技巧

目录 一、位运算基础知识 1.1. 位运算符 1.1.1. 与运算&#xff08;&&#xff09; 1.1.2. 或运算&#xff08;|&#xff09; 1.1.3. 异或运算&#xff08;^&#xff09; 1.1.4. 取反运算&#xff08;~&#xff09; 1.1.5. 双重按位取反运算符&#xff08;~~&#xf…

渗透测试笔记—shodan(7完结)

声明&#xff1a; 学习视频来自B站up主 【泷羽sec】有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&am…

2024年最新版Java八股文复习

最新版本Java八股文复习&#xff0c;每天更新一篇&#xff0c;博主正在持续努力更新中~~~ 一、Java基础篇1、怎么理解面向对象&#xff1f;简单说说封装、继承、多态三大特性&#xff1f;2、多态体现在哪几个方面&#xff1f;3、面向对象的设计原则你知道有哪些吗&#xff1f;4…

Notepad++ 替换所有数字给数字加单引号

前言 今天遇到这样一个场景&#xff1a; 要去更新某张表里 code1,2,3,4,5,6 的数据&#xff0c;把它的 name 设置为 ‘张三’ 但是 code在数据库里面的字段类型是 vachar(64)&#xff0c;它自身携带索引 原本可以这样写 SQL: update tableA set namezhangsan where code in …

前端图像处理(一)

目录 一、上传 1.1、图片转base64 二、图片样式 2.1、图片边框【border-image】 三、Canvas 3.1、把canvas图片上传到服务器 3.2、在canvas中绘制和拖动矩形 3.3、图片(同色区域)点击变色 一、上传 1.1、图片转base64 传统上传&#xff1a; 客户端选择图片&#xf…

推荐一款龙迅HDMI2.0转LVDS芯片 LT6211UX LT6211UXC

龙迅的HDMI2.0转LVDS芯片LT6211UX和LT6211UXC是两款高性能的转换器芯片&#xff0c;它们在功能和应用上有所差异&#xff0c;同时也存在一些共同点。以下是对这两款芯片的详细比较和分析&#xff1a; 一、LT6211UX 主要特性&#xff1a; HDMI2.0至LVDS和MIPI转换器。HDMI2.0输…

51单片机从入门到精通:理论与实践指南入门篇(二)

续51单片机从入门到精通&#xff1a;理论与实践指南&#xff08;一&#xff09;https://blog.csdn.net/speaking_me/article/details/144067372 第一篇总体给大家在&#xff08;全局&#xff09;总体上讲解了一下51单片机&#xff0c;那么接下来几天结束详细讲解&#xff0c;从…

STM32C011开发(3)----Flash操作

STM32C011开发----3.Flash操作 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置堆栈设置串口重定向FLASH数据初始化FLASH 读写演示 概述 STM32C011 系列微控制器内置 Flash 存储器&#xff0c;支持程序存储与数据保存&#xff0c;具备页面擦除、双字写入…

IDEA无法创建java8、11项目创建出的pom.xml为空

主要是由于Spring3.X版本不支持JDK8&#xff0c;JDK11&#xff0c;最低支持JDK17 解决的话要不就换成JDK17以上的版本&#xff0c;但是不太现实 另外可以参考以下方式解决 修改spring初始化服务器地址为阿里云的 https://start.aliyun.com/

【Unity3D】创建自定义字体

前置准备 如图所示&#xff0c;项目工程中需要用文件夹存储0-9的Sprite图片。 使用流程 直接右键存放图片的文件夹&#xff0c;选择【创建自定义字体】&#xff0c;之后会在脚本定义的FontOutputPath中生成材质球和字体。 源码 using System; using System.Collections.Gene…

logminer挖掘日志归档查找问题

--根据发生问题时间点查找归档文件 select first_time,NAME from gv$archived_log where first_time>2016-03-15 17:00:00 and first_time<2016-03-15 21:00:00; 2016-03-15 17:23:55 ARCH/jxdb/archivelog/2016_03_15/thread_1_seq_41588.4060.906577337 2016-03-15 17:…

电商项目高级篇06-缓存

电商项目高级篇06-缓存 1、docker下启动redis2、项目整合redis 缓存 流程图&#xff1a; data cache.load(id);//从缓存加载数据 If(data null){ data db.load(id);//从数据库加载数据 cache.put(id,data);//保存到 cache 中 } return data;在我们的单体项目中可以用Map作…

如何使用GCC手动编译stm32程序

如何不使用任何IDE&#xff08;集成开发环境&#xff09;编译stm32程序? 集成开发环境将编辑器、编译器、链接器、调试器等开发工具集成在一个统一的软件中&#xff0c;使得开发人员可以更加简单、高效地完成软件开发过程。如果我们不使用KEIL,IAR等集成开发环境&#xff0c;…

一个专为云原生环境设计的高性能分布式文件系统

大家好&#xff0c;今天给大家分享一款开源创新的分布式 POSIX 文件系统JuiceFS&#xff0c;旨在解决海量云存储与各类应用平台&#xff08;如大数据、机器学习、人工智能等&#xff09;之间高效对接的问题。 项目介绍 JuiceFS 是一款面向云原生设计的高性能分布式文件系统&am…

Vue-TreeSelect组件最下级隐藏No sub-options

问题&#xff1a;最下级没有数据的话&#xff0c;去除No sub-options信息 为什么没下级&#xff0c;会展示这个&#xff1f; 整个树形结构数据都是由后端构造好返回给前端的。默认子类没数据的话&#xff0c;children是一个空数组。也就是因为这最下级的空数组&#xff0c;导致…

k8s集群增加nfs-subdir-external-provisioner存储类

文章目录 前言一、版本信息二、本机安装nfs组件包三、下载nfs-subdir-external-provisioner配置文件并进行配置1.下载文件2.修改配置 三、进行部署备注&#xff1a;关于镜像无法拉取问题的处理 前言 手里的一台服务器搭建一个单点的k8s集群&#xff0c;然后在本机上使用nfs-su…

C语言数据结构-链表

C语言数据结构-链表 1.单链表1.1概念与结构1.2结点3.2 链表性质1.3链表的打印1.4实现单链表1.4.1 插入1.4.2删除1.4.3查找1.4.4在指定位置之前插入或删除1.4.5在指定位置之后插入或删除1.4.6删除指定位置1.4.7销毁链表 2.链表的分类3.双向链表3.1实现双向链表3.1.1尾插3.1.2头插…

【SpringCloud详细教程】-04-服务容错--Sentinel

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…

【Python中while循环】

一、深拷贝、浅拷贝 1、需求 1&#xff09;拷贝原列表产生一个新列表 2&#xff09;想让两个列表完全独立开&#xff08;针对改操作&#xff0c;读的操作不改变&#xff09; 要满足上述的条件&#xff0c;只能使用深拷贝 2、如何拷贝列表 1&#xff09;直接赋值 # 定义一个…

在 Mac(ARM 架构)上安装 JDK 8 环境

文章目录 步骤 1&#xff1a;检查系统版本步骤 2&#xff1a;下载支持 ARM 的 JDK 8步骤 3&#xff1a;安装 JDK步骤 4&#xff1a;配置环境变量步骤 5&#xff1a;验证安装步骤 6&#xff1a;注意事项步骤7&#xff1a;查看Java的安装路径 在 Mac&#xff08;ARM 架构&#xf…