溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mybatis查詢時報錯 java.sql.SQLException: Invalid value for getInt() 如何解決

發布時間:2021-07-05 15:11:28 來源:億速云 閱讀:539 作者:chen 欄目:大數據
# 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配置,可以有效避免此類問題。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女