1. 程式人生 > >MySQL中BIGINT與Java資料型別對應問題

MySQL中BIGINT與Java資料型別對應問題

問題背景:

        最近在做的工作使用了mybatis框架,前兩天有一個需求,中間涉及到一條sql,需要將某表中的最大最小主鍵取出來,mysql中該主鍵型別是BIGINT(20),我在xml檔案中是這樣寫的:

<select id="getMinAndMaxId" resultType="java.util.Map">
    select min(id) as minId, max(id) as maxId
    from t
</select>

        在DAO層,我將其結果存入一個HashMap<String, Long> resMap,但當我執行resMap.get("minId");時,系統報錯:

java.math.BigInteger can't be cast to java.lang.Long

        之前對這張表操作的時候,都是用Long對應BIGINT,從來沒有問題,不明白為什麼這次會有異常,我查了一下MySQL和Java資料型別的對應關係,發現,BIGINT確實是對應java.math.BigInteger,但是此時又出現了另外一個疑點。我在操作另外一張表的時候,同樣是取最大最小值,同樣是BIGINT(20)的主鍵,同樣是儲存進HashMap<String, Long>,為什麼兩個表有這樣的差別呢?

        最後,以兩個表的結構對比為突破口找到了原因。可以成功對映為Long的表用的是BIGINT(20),但是出問題的表使用的是BIGINT(20) UNSIGNED。如果不是無符號型別,BIGINT(20)的取值範圍為-9223372036854775808~9223372036854775807。與Java.lang.Long的取值範圍完全一致,mybatis會將其對映為Long;而BIGINT(20) UNSIGNED的取值範圍是0 ~ 18446744073709551615,其中一半的資料超出了Long的取值範圍,Mybatis將其對映為BigInteger。

      最後一個問題,為什麼HashMap<String, Long>中會儲存成BigInteger呢?當然是因為我開始的sql裡面沒有指定map的型別,所以,各種型別的資料都可以儲存的。