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

news2024/11/27 12:34:25

一、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.coloradmin.cn/o/2248411.html

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

相关文章

EXTI配置流程 含中断延时消抖点亮小灯

如图可知&#xff0c;配置流程分成以下一个部分 ①使能GPIO时钟 __HAL_RCC_GPIOA_CLK_ENABLE();// 打开时钟 ②初始化利用 HAL_GPIO_Init 一步到位&#xff0c;可以初始化外设GPIO的一切 4个参数 &#xff08;引脚 Pull 这里选择的模式是从下面这几个里面选 速度&#x…

数据库系列之GaussDB数据库高可用能力测试验证

数据库的高可用能力是数据库的基本能力&#xff0c;可靠性的设计和机制能够保证数据库节点异常时能够正常切换、减少业务的影响范围和时间&#xff0c;保证业务的可用性和连续性。本文主要介绍GaussDB数据库的高可用能力测试验证情况&#xff0c;通过模拟故障场景来验证GaussDB…

Android BottomNavigationView 底部导航栏使用详解

一、BottomNavigationView简介 BottomNavigationView是官方提供可以实现底部导航的组件&#xff0c;最多支持5个item&#xff0c;主要用于功能模块间的切换&#xff0c;默认会包含动画效果。 官方介绍地址&#xff1a;BottomNavigationView 二、使用BottomNavigationView a…

IIT开发自适应协作界面,通过Xsens动作捕捉系统实现安全人机交互

意大利理工学院(IIT)的研究人员正在利用自适应界面转变人机协作&#xff0c;实现实时机器人调整和安全、无缝的交互。 本文要点: l 协作的实时适应&#xff1a;IIT的研究员西林图纳和厄兹达马尔开发了一种自适应协作界面(ACI)&#xff0c;允许机器人根据人类的运动意图实时调…

一学就废|Python基础碎片,格式化F-string

Python 3.6 中引入了 f-string语法&#xff0c;提供了一种简洁直观的方法来将表达式和变量直接嵌入到字符串中进行字符串格式化&#xff0c;f -string背后的想法是使字符串插值更简单。 要创建 f -string&#xff0c;在字符串前加上字母 “f”即可&#xff0c;与字符串本身的格…

SVG无功补偿装置MATLAB仿真模型

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 SVG&#xff08;又称ASVG 或STATCOM&#xff09;是Static Var Generator 的缩写&#xff0c;叫做静止无功发生器。也是做无功补偿的&#xff0c;比SVC 更加先进。其基本原理是将自换相桥式电路通过电抗器或…

MVC、EL、JSTL

1.MVC设计模式 三层&#xff1a; MVC&#xff1a; M&#xff08;Model&#xff09;模型&#xff1a;负责业务逻辑处理&#xff0c;数据库访问。 V&#xff08;View&#xff09;视图&#xff1a;负责与用户交互。 C&#xff08;Controller&#xff09;控制器&#xff1a;负责流程…

Web开发技术栈选择指南

互联网时代的蓬勃发展&#xff0c;让越来越多人投身软件开发领域。面对前端和后端的选择&#xff0c;很多初学者往往陷入迷茫。让我们一起深入了解这两个领域的特点&#xff0c;帮助你做出最适合自己的选择。 在互联网发展的早期&#xff0c;前端开发主要负责页面布局和简单的…

太通透了,Android 流程分析 蓝牙enable流程(应用层/Framework/Service层)

零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0c;加上网络上其实没有一个完整的介绍Bluedroid系列的文档&#xff0…

R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法

R语言绘图过程中遇到图例的图块中出现字符的解决方法 因为我遇到这个问题的时候没在网上找到合适的方法&#xff0c;找到个需要付费的&#xff0c;算了。也许是因为问的方式不同&#xff0c;问了半天AI也回答出来&#xff0c;莫名有些烦躁&#xff0c;打算对代码做个分析&…

【C语言】字符串左旋的三种解题方法详细分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;方法一&#xff1a;逐字符移动法&#x1f4af;方法二&#xff1a;使用辅助空间法&#x1f4af;方法三&#xff1a;三次反转法&#x1f4af;方法对…

【346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)

1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…

大数据面试SQL题-笔记02【查询、连接、聚合函数】

大数据面试SQL题复习思路一网打尽&#xff01;(文档见评论区)_哔哩哔哩_bilibiliHive SQL 大厂必考常用窗口函数及相关面试题 大数据面试SQL题-笔记01【运算符、条件查询、语法顺序、表连接】大数据面试SQL题-笔记02【查询、连接、聚合函数】​​​​​​​ 目录 01、查询 01…

【Python中while循环】

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

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

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

【pyspark学习从入门到精通20】机器学习库_3

目录 使用 ML 预测婴儿生存几率 加载数据 创建转换器 创建估计器 创建管道 拟合模型 使用 ML 预测婴儿生存几率 在这一部分&#xff0c;我们将使用前一章中的数据集的一部分来介绍 PySpark ML 的概念。 在这一部分&#xff0c;我们将再次尝试预测婴儿的生存几率。 加载…

【计算机网络】核心部分复习

目录 交换机 v.s. 路由器OSI七层更实用的TCP/IP四层TCPUDP 交换机 v.s. 路由器 交换机-MAC地址 链接设备和设备 路由器- IP地址 链接局域网和局域网 OSI七层 物理层&#xff1a;传输设备。原始电信号比特流。数据链路层&#xff1a;代表是交换机。物理地址寻址&#xff0c;交…

LLamafactory 批量推理与异步 API 调用效率对比实测

背景 在阅读 LLamafactory 的文档时候&#xff0c;发现它支持批量推理: 推理.https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/inference.html 。 于是便想测试一下&#xff0c;它的批量推理速度有多快。本文实现了 下述两种的大模型推理&#xff0c;并对…

【自动化Selenium】Python 网页自动化测试脚本(上)

目录 1、Selenium介绍 2、Selenium环境安装 3、创建浏览器、设置、打开 4、打开网页、关闭网页、浏览器 5、浏览器最大化、最小化 6、浏览器的打开位置、尺寸 7、浏览器截图、网页刷新 8、元素定位 9、元素交互操作 10、元素定位 &#xff08;1&#xff09;ID定位 &…

Table 滚动条始终停靠在可视区域的底部

1. 话题引入 存在这样一个场景&#xff1a;当页面尺寸发生变化时&#xff0c;希望滚动条能够随之动态调整&#xff0c;始终展示在 table 的可视区域的最下方&#xff0c;而不是整个 table 本身的最底部。 这种行为可以提升用户的使用体验&#xff0c;尤其是在处理大数据表格时…