MyBatis惊天bug!居然将字符串解析成数值类型!

2023-10-28 19:30

本文主要是介绍MyBatis惊天bug!居然将字符串解析成数值类型!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

mybatis会自动映射字段,在mapper.xml文件中,可以不写jdbcType显式指定数据类型,它会自动解析成相对应的Java数据类型,但是今天写代码就遇到了问题:

业务场景是需要根据不同权限的用户查询不同数据,又因为一些历史原因,所以就直接将用户ID当字符串类型的参数传递进来。

List<String> getOwnAssignedOrderNo(@Param("backendId") String backendId, @Param("userId") String userId);
<if test="userId == '1'">AND w.backend_id = #{backendId}AND w.workflow_type = 'manual_check'
</if>
<if test="userId == '2' || userId == '3' || userId == '2,3'">AND w.backend_id = #{backendId}AND w.workflow_type = 'phone_check'
</if>

结果就出现开头的悲剧,错误很易懂,类型转换异常,而且是userId参数,难道不能用数字类型的字符串做过参数?

有人说是没有指定jdbcType导致的,但这个不是字段,而是在if条件中,无法指定jdbcType。

继续查资料,看到有大佬给了一种写法,需要对if条件中的参数做toString(),写法如下:

<if test="userId == '1'.toString()">AND w.backend_id = #{backendId}AND w.workflow_type = 'manual_check'
</if>
<if test="userId == '2'.toString() || userId == '3'.toString() || userId == '2,3'.toString()">AND w.backend_id = #{backendId}AND w.workflow_type = 'phone_check'
</if>

这种写法真的是很烦,判断条件简单还好说,如果复杂的条件,岂不是要写到吐血,遂继续百度之,终于找到了一种简单的写法:单引号和双引号调换一下

<if test='userId == "1"'>AND w.backend_id = #{backendId}AND w.workflow_type = 'manual_check'
</if>
<if test='userId == "2" || role == "3" || role == "2,3"'>AND w.backend_id = #{backendId}AND w.workflow_type = 'phone_check'
</if>

总结

  • 如果在传参字段中,可以考虑追加jdbcType属性来指定数据类型
  • 如果在if条件中,用字符串比对的的地方少,可以直接在字符串后面跟一个toString()方法
  • 如果在if条件中,用字符串比对的地方多,直接将单引和双引调换位置;
    推荐第三种写法!

这篇关于MyBatis惊天bug!居然将字符串解析成数值类型!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295431

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Spring Boot 中整合 MyBatis-Plus详细步骤(最新推荐)

《SpringBoot中整合MyBatis-Plus详细步骤(最新推荐)》本文详细介绍了如何在SpringBoot项目中整合MyBatis-Plus,包括整合步骤、基本CRUD操作、分页查询、批... 目录一、整合步骤1. 创建 Spring Boot 项目2. 配置项目依赖3. 配置数据源4. 创建实体类

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines