您的位置:首页 > 编程语言 > Java开发

MySQL中BIGINT与Java数据类型对应问题

2018-03-04 13:17 267 查看
问题背景:
        最近在做的工作使用了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的类型,所以,各种类型的数据都可以存储的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: