MyBatis 的 `<if test="">` 语句里面使用反单引号的问题
时间:2022-07-26
本文章向大家介绍MyBatis 的 `<if test="">` 语句里面使用反单引号的问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
如下是 MyBatis 的映射文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.renda.dao.CourseMapper">
<!--
多条件课程列表查询
-->
<select id="findCourseByCondition" parameterType="courseVo" resultType="course">
select * from course
<where>
<if test="courseName != null and courseName != ''">
and course_name like concat('%', #{courseName}, '%')
</if>
<if test="`status` != null and `status` != ''">
and `status` = #{status}
</if>
<if test="true">
and is_del != 1
</if>
</where>
</select>
</mapper>
启动了 Tomcat 服务器,使用 Postman 进行测试,使用了 log4j 输出 MyBatis 相关的 log。
当 status 为 1 时,无论有没有为 status 加反单引号,输出结果都是正确的:
::, DEBUG SpringManagedTransaction: - JDBC Connection [com.mysql.jdbc.JDBC4Connection@fd1a13d] will not be managed by Spring
::, DEBUG findCourseByCondition: - ==> Preparing: select * from course WHERE course_name like concat('%', ?, '%') and `status` = ? and is_del !=
::, DEBUG findCourseByCondition: - ==> Parameters: Vue.js 3.0 核心源码解析(String), (Integer)
::, DEBUG findCourseByCondition: - <== Total:
当 status 为 0 时,如果 <if test>
的 status 没有加反单引号,即便里面的 status 加了反单引号,输出结果是错误的:
<if test="status != null and status != ''">
and `status` = #{status}
</if>
::, DEBUG SpringManagedTransaction: - JDBC Connection [com.mysql.jdbc.JDBC4Connection@d4a78] will not be managed by Spring
::, DEBUG findCourseByCondition: - ==> Preparing: select * from course WHERE course_name like concat('%', ?, '%') and is_del !=
::, DEBUG findCourseByCondition: - ==> Parameters: Vue.js 3.0 核心源码解析(String)
::, DEBUG findCourseByCondition: - <== Total:
可以看到这时候的 <if test>
执行并没有通过,导致少追加了 status 的判断。
只有在 <if test>
的 status 加上反单引号,执行结果才是正确的:
<if test="`status` != null and `status` != ''">
and `status` = #{status}
</if>
::, DEBUG SpringManagedTransaction: - JDBC Connection [com.mysql.jdbc.JDBC4Connection@af06d] will not be managed by Spring
::, DEBUG findCourseByCondition: - ==> Preparing: select * from course WHERE course_name like concat('%', ?, '%') and `status` = ? and is_del !=
::, DEBUG findCourseByCondition: - ==> Parameters: Vue.js 3.0 核心源码解析(String), (Integer)
::, DEBUG findCourseByCondition: - <== Total:
整数类型的 isFree 也会出现这个问题,加上反单引号:
<if test="`isFree` != null and `isFree` != ''">
is_free = #{isFree},
</if>
由此可以推测出:整数类型转字符串类型后,0 代表空字符串的意思,加上反单引号可以把整数类型的 0 直接转为 字符 0
。
同样道理,status 是整数类型,当它为 0 时,进行字符串转型会把它转为 null;加上反单引号就不会出错了。
但是加上反单引号却有另外一个问题,就是当 status 为 Integer 类型时, status 可以为 null,这时候使用反单引号进行整数类型转字符串类型会把 null 本身转为字符串 "null",从而导致判断出错。
所以,当 status 为 Integer 且可能为 null 时,最好是用以下方式解决:
<if test="status != null and status != '' or status == 0">
and `status` = #{status}
</if>
- python_IO编程
- Python爬虫(十七)_糗事百科案例
- 上千亿巨头撑腰 双拼妥妥被他拿了
- Python爬虫(十八)_多线程糗事百科案例
- Python爬虫(十九)_动态HTML介绍
- Python爬虫(二十)_动态爬取影评信息
- Python爬虫(二十一)_Selenium与PhantomJS
- Python爬虫(十三)_案例:使用XPath的爬虫
- Python爬虫(十四)_BeautifulSoup4 解析器
- Python爬虫(十五)_案例:使用bs4的爬虫
- Python爬虫(十六)_JSON模块与JsonPath
- 多类好米齐交易:域名776.cn近10万元结拍
- Python爬虫(八)_Requests的使用
- Python爬虫(十一)_案例:使用正则表达式的爬虫
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(字符编码和char型)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(整型、浮点型、布尔型)
- 多图详解Spring框架的设计理念与设计模式
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.2-3.5):标识符、关键字、注释、变量及常量
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.1):一个简单的例子
- 详解Java解析XML的四种方法
- 《Java从入门到失业》第四章:类和对象(4.6):类路径
- 《Java从入门到失业》第四章:类和对象(4.5):包
- 《Java从入门到失业》第四章:类和对象(4.4):方法参数及传递
- 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象
- 《Java从入门到失业》第四章:类和对象(4.2):String类
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.9):数组(数组基本使用、数组的循环、数组拷贝、数组排序、多维数组)
- Establishing SSL connection without server identity verification is not recommended
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.8):流程控制(循环语句、while语句、for语句)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.8):流程控制(选择语句、if-else语句、switch语句)