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

相关文章

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略