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

问题背景:
最近在做的工作使用了mybatis框架,前两天有一个需求,中间涉及到一条sql,需要将某表中的最大最小主键取出来,mysql中该主键类型是BIGINT(20),我在xml文件中是这样写的:


在DAO层,我将其结果存入一个HashMap 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,为什么两个表有这样的差别呢?

最后,以两个表的结构对比为突破口找到了原因。可以成功映射为Long的表用的是BIGINT(20),但是出问题的表使用的是BIGINT(20) UNSIGNED。如果不是无符号类型,BIGINT(20)的取值范围为-9223372036854775808~9223372036854775807。与Java.lang.Long的取值范围完全一致,mybatis会将其映射为Long;而BIGINT(20) UNSIGNED的取值范围是0 ~ 18446744073709551615,其中一半的数据超出了Long的取值范围,Mybatis将其映射为BigInteger。

最后一个问题,为什么HashMap中会存储成BigInteger呢?当然是因为我开始的sql里面没有指定map的类型,所以,各种类型的数据都可以存储的。

用以记录问题。
转自薄编靖的MySQL中BIGINT与Java数据类型对应问题

你可能感兴趣的:(mysql,java)