Mybatis查询时报错 java.sql.SQLException: Invalid value for getInt() 如何解决

发布时间:2021-07-05 15:11:28 作者:chen
来源:亿速云 阅读:527
# Mybatis查询时报错 java.sql.SQLException: Invalid value for getInt() 如何解决

## 问题现象

在使用MyBatis进行数据库查询时,可能会遇到以下异常:
```java
java.sql.SQLException: Invalid value for getInt()

该错误通常发生在尝试将数据库字段值转换为Java的int类型时,但实际字段值为NULL或非数字类型。

错误原因分析

  1. 数据库字段值为NULL
    MyBatis通过ResultSet.getInt()获取值时,如果数据库字段为NULL,JDBC会抛出此异常

  2. 类型不匹配
    数据库字段类型为字符串(如VARCHAR)但包含非数字内容(如”abc”),而Java实体类中使用int类型接收

  3. MyBatis映射配置问题
    resultMap中字段类型与数据库实际类型不匹配

解决方案

方案1:修改实体类字段类型(推荐)

// 将基本类型int改为包装类型Integer
private Integer age;

包装类型可以接收NULL值,避免NPE问题。

方案2:配置JdbcType

在MyBatis映射文件中明确指定jdbcType:

<result column="age" property="age" jdbcType="INTEGER"/>

方案3:SQL中使用COALESCE/NVL函数

SELECT COALESCE(age, 0) AS age FROM users
-- 或Oracle
SELECT NVL(age, 0) AS age FROM users

方案4:自定义TypeHandler

创建处理NULL值的自定义类型处理器:

public class NullIntTypeHandler extends BaseTypeHandler<Integer> {
    @Override
    public void setNonNullParameter(...) {...}
    
    @Override
    public Integer getNullableResult(ResultSet rs, String columnName) 
        throws SQLException {
        return rs.wasNull() ? null : rs.getInt(columnName);
    }
}

预防措施

  1. 数据库设计时对可能为空的数字字段设置默认值
  2. 使用@Column(nullable = false)注解明确字段不可为空
  3. 在MyBatis配置中开启驼峰命名自动映射:
    
    <settings>
       <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    

总结

该异常的根本原因是Java基本类型与数据库NULL值的不兼容。推荐优先使用包装类型Integer,既能保持类型安全,又能正确处理NULL值。通过合理的类型设计和MyBatis配置,可以有效避免此类问题。 “`

推荐阅读:
  1. linux中怎样配置java环境变量
  2. 怎么在Linux中使用crontab运行Java程序定时任务

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java mybatis

上一篇:python中str() 与repr()有什么区别

下一篇:gitlab在合并请求时忽略文件的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》