mybatis 报错:Cause: java.lang.NumberFormatException: For input string: ““

本文介绍了在使用MyBatis 3.5.5版本时遇到的一个问题,即在进行动态SQL模糊查询时,由于OGNL语法解析导致的NumberFormatException。问题出现在if条件判断中,当字符串包含特殊字符时,MyBatis尝试将其解析为数值类型。解决方案是调整单引号和双引号的位置,避免MyBatis误解析。修复后的XML代码示例给出,帮助开发者解决类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mybatis 报错:Cause: java.lang.NumberFormatException: For input string: “”


问题描述

我使用的mybatis版本是3.5.5。
使用mybatis动态SQL进行模糊查询,if条件判断时,报出数字格式错误。

	//Mapper.xml源代码
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        where
            status = #{status}
        <if test="companyName != null and companyName != ' '">
            and company_name like #{companyName}
        </if>
        <if test="brandName != null and brandName != ' '">
            and brand_name like #{brandName}
        </if>
    </select>
org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NumberFormatException: For input string: "%华为%"
### Cause: java.lang.NumberFormatException: For input string: "%华为%"

	... more
	at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:39)
	at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:305)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:87)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
	... 32 more
	
Process finished with exit code -1


原因分析:

问题的原因在于mybiatis是基于OGNL语法,在解析单引号+单字符 ‘Y’ 的解析时会默认时char类型,单引号+多字符 ‘AA’ 或者双引号+单字符 “A” 解析为String类型。


解决方案:

把单引号和双引号的位置互换即可。

	    <if test='companyName != null and companyName != " "'>
            and company_name like #{companyName}
        </if>
<think>好的,我现在需要帮助用户解决MyBatis查询数据库时出现的NumberFormatException问题,特别是当输入字符串是'Y'的时候。用户提到错误信息是NumberFormatException: For input string: "Y",这说明MyBatis在尝试将字符串"Y"转换为数值类型时失败了。 首先,我应该回忆一下常见的导致NumberFormatException的原因。根据之前的引用内容,可能的情况包括:数据库字段类型与Java实体类属性类型不匹配、MyBatis在动态SQL中的类型处理问题,或者参数传递时类型转换错误。 根据引用3和4中的信息,用户可能在MyBatis的if test条件中直接比较了字符串和字符,例如使用'Y',而MyBatis可能会将'Y'视为char类型,从而导致类型不匹配。例如,如果有一个条件判断如test="status != 'Y'",而status是String类型,那么这里比较的是String和char,可能导致类型转换异常。 接下来,我需要检查用户可能的Mapper XML文件中的SQL片段。例如,用户可能在<if test>标签中使用了类似的条件,将字符串参数与字符常量比较。比如: <if test="status != 'Y'"> ... </if> 这里如果status是String类型,而'Y'在OGNL表达式中会被解析为char类型,导致MyBatis尝试将String转换为数值类型进行比较,从而引发NumberFormatException。 解决方案之一是将比较的常量改为双引号包裹的字符串,如"Y"。例如: <if test='status != "Y"'> ... </if> 这里外层使用单引号,内部用双引号表示字符串,这样OGNL会将"Y"视为String类型,避免类型不匹配的问题。 另外,根据引用4的建议,可以使用toString()方法将常量转换为字符串,例如将'Y'.toString(),或者直接使用双引号。例如: <if test="status != 'Y'.toString()"> ... </if> 或者更简单的,直接使用双引号包裹,外层用单引号: <if test='status != "Y"'> ... </if> 此外,还需要检查实体类中的属性类型是否与数据库字段类型匹配。如果数据库中的字段是CHAR或VARCHAR,对应的Java属性应该是String类型。如果实体类中的属性被错误地定义为Integer或其他数值类型,那么在映射时也会导致转换异常。需要确认实体类中的相关字段是否为String类型。 同时,用户提到的引用5中的例子显示,在动态SQL的条件判断中,使用#{userRole}作为参数时,如果userRole是int类型,但在条件判断中可能错误地处理了参数类型。这可能与用户当前的问题类似,即类型不匹配导致转换异常。 总结解决方案步骤: 1. 检查Mapper XML中的条件判断,确保比较的常量类型与参数类型一致。将字符常量改为字符串,如使用双引号。 2. 确认实体类中的属性类型与数据库字段类型匹配,尤其是涉及到的字段是否为String。 3. 在必要的情况下,使用toString()方法显式转换常量类型。 4. 测试修改后的代码,确保类型转换正确,不再抛出异常。 用户可能还需要注意MyBatis在处理动态SQL时的类型推断机制,避免隐式类型转换导致的错误。通过显式处理类型,可以避免大部分NumberFormatException问题。</think>### MyBatis查询时NumberFormatException问题的分析与解决 #### 问题分析 当MyBatis执行查询时抛出$NumberFormatException: \text{For input string: "Y"}$,通常是由于以下原因导致: 1. **类型映射错误**:数据库字段类型(如CHAR/VARCHAR)与Java实体类属性类型(如Integer/Long)不匹配,导致字符串"Y"无法转换为数值类型[^3][^4]。 2. **动态SQL条件判断类型冲突**:在MyBatis的`<if test>`标签中,字符串参数与字符常量(如`'Y'`)直接比较,触发隐式类型转换异常[^3][^4]。 #### 解决步骤 1. **检查实体类与数据库字段类型匹配性** - 确保实体类中对应字段的类型为`String`,例如: ```java public class YourEntity { private String status; // 对应数据库的CHAR/VARCHAR字段 } ``` 2. **修正动态SQL中的类型比较** - **错误写法**(字符与字符串比较): ```xml <if test="status != 'Y'"> <!-- MyBatis将'Y'视为char类型 --> ``` - **正确写法**(统一为字符串比较): ```xml <if test='status != "Y"'> <!-- 外层用单引号,内部用双引号表示字符串 --> ``` 或显式调用`toString()`: ```xml <if test="status != 'Y'.toString()"> ``` 3. **参数传递时显式类型声明** - 在Mapper接口中明确参数类型,避免MyBatis自动推断错误: ```java List<YourEntity> selectByStatus(@Param("status") String status); ``` 4. **SQL日志调试** - 启用MyBatis的SQL日志,检查最终生成的SQL语句是否符合预期: ```properties # application.properties logging.level.org.mybatis=DEBUG ``` #### 示例修正代码 ```xml <!-- 修改后的Mapper XML片段 --> <select id="getData" resultType="YourEntity"> SELECT * FROM your_table <where> <if test='status != null and status != "Y"'> AND status = #{status} </if> </where> </select> ``` #### 总结 通过统一类型比较、修正实体类映射、显式声明参数类型,可彻底解决因类型不匹配导致的$NumberFormatException$问题。此问题常见于动态SQL中隐式类型转换的场景[^3][^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值