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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。