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

ops/2024/11/25 8:38:02/

一、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.ppmy.cn/ops/136521.html

相关文章

Elasticsearch实战应用:构建高效搜索与分析平台

Elasticsearch实战应用&#xff1a;构建高效搜索与分析平台 在当今大数据时代&#xff0c;数据的量级已经达到了惊人的级别&#xff0c;动辄上亿甚至更多。对于这样的数据量&#xff0c;如何进行有效的搜索和分析成为了众多开发者和数据科学家关注的焦点。Elasticsearch&#…

SpringBoot多文件上传

多文件上传是在单文件上传的基础上修改而来&#xff0c;不了解单文件上传可以参考上一篇。以下在将修改部分展示如下&#xff1a; 一、修改upload.html文件&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title&g…

Selenium + 数据驱动测试:从入门到实战!

引言 在软件测试中&#xff0c;测试数据的多样性和灵活性对测试覆盖率至关重要。而数据驱动测试&#xff08;Data-Driven Testing&#xff09;通过将测试逻辑与数据分离&#xff0c;极大地提高了测试用例的可维护性和可扩展性。本文将结合Selenium这一流行的测试工具&#xff0…

计算机的错误计算(一百六十四)

摘要 探讨 MATLAB 中 函数的计算精度问题。 例1. 考虑在许多应用中出现的函数 计算 直接贴图吧&#xff1a; 从上图可知&#xff0c;MATLAB的输出为 0.999200722162641 . 然而&#xff0c;事实上&#xff0c;16位的正确结果为 0.1000000000000045e1&#xff08;ISReals…

什么是Git,有什么特点

版本控制工具Git简介 一、Git的由来 Git 是一种分布式版本控制系统&#xff0c;由 Linux 之父 Linus Torvalds 于 2005 年创建。当时&#xff0c;Linux 内核开发团队需要一个高效的版本控制系统来管理庞大的代码库。在此之前&#xff0c;他们使用的是 BitKeeper&#xff0c;这…

Dubbo源码解析-服务订阅与发现(八)

一、服务订阅与发现 服务提供者暴漏服务的时候会向注册中心注册服务信息&#xff0c;当服务消费者引入服务的时候会去订阅服务提供者信息。RegistryDirectory#subscribe public void subscribe(URL url) {setSubscribeUrl(url);consumerConfigurationListener.addNotifyListe…

SQL注入--布尔盲注--理论

布尔盲注的原理 在SQL注入时&#xff0c;我们查询的数据不会直接回显在界面上&#xff0c;且界面对正确的查询和错误的查询有不同的回显&#xff0c;我们就可以使用布尔盲注。 比如sqli-labs的第八题&#xff0c;当我们输入的查询语句是正确的时候&#xff0c;回显就是you ar…

ftdi_sio应用学习笔记 5 - SPI

目录 1. 查找设备 2. 打开设备 3. 验证 3.1 遍历设备 3.2 打开关闭设备 3.3 读flash id SPI的SCK/MOSI/MISO分别对应&#xff08;A/B)D0/D1/D2&#xff0c;其他IO作为CS。和I2C一样&#xff0c;最大支持2路MPSSE通道&#xff0c;一路MPSSE最大13路SPI。 #define FTDI_DE…