Mysql字段类型和Java类型的对应关系_zijikanwa的博客-程序员秘密

技术标签: Java  


一. 问题复现

  • 之前操作表的时候,都自认为Mysql的bigint类型对应Java的Long类型。今天写一个查询语句返回Map,结果出现类转换异常。怀疑了好久,查了好半天,终于搞清楚是为什么了。问题现场是这样子滴…

1. mapper.xml

<select id="getInfo" resultType="java.util.Map">
select product_trac_info_id,remark,product_name
from product_trac_info info
where product_trac_info_id=#{productTracInfoId}
</select>

2. dao.java

@MapKey("productTracInfoId")
Map<Long,Map<String,String>> getInfo(@Param("productTracInfoId") Long productTracInfoId);

3. manager.java

Map<Long, Map<String, String>> map = infoDao.getInfo(productTracInfoId); 
  • 此时,代码报错,类转换异常,无法将BigInteger转为Long (java.math.BigInteger can’t be cast to java.lang.Long)

二. 问题解答

1. 原因概述

  • 主要原因是数据库字段类型和Java类型不对应导致的。Mysql和Java的对应类型:
Mysql Java
int Integer
int unsigned Long
bigint(20) Long
bigint(20) unsigned BigInteger
  • ️注意
    1. Mysql中有符号int(int) :最大可以支持到约22亿,远远大于我们的需求和MySQL单表所能支持的性能上限。对于OLTP应用来说,单表的规模一般要保持在千万级别,不会达到22亿上限。
    2. Mysql中无符号int(int unsigned) :上限为42亿,这个预留量已经是非常的充足了。如果使用bigint,会占用更大的磁盘和内存空间,内存空间毕竟有限,无效的占用会导致更多的数据换入换出,额外增加了IO的压力,对性能是不利的。

2. 原因解读

  1. 这次的异常就是因为数据库表的product_trac_info_id字段是bigint unsigned类型,导致的类型转换异常。
    在这里插入图片描述
  • BIGINT(20)的取值范围:-9223372036854775808~9223372036854775807,它与Java.lang.Long的取值范围完全一致,因此mybatis会将其映射为Long类型;
  • BIGINT(20) unsigned的取值范围:0 ~ 18446744073709551615,其中一半的数据超出了Long的取值范围,因此Mybatis将其映射为BigInteger类型。
  1. 为什么没有在MyBatis的Dao层或者mapper.xml报错,而是到业务代码里获取Map的时候才报错呢?因为mapper.xml的SQL语句并没有指定Map范型类型,所以map中存储各种类型都可以通过。

参考资料

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zijikanwa/article/details/105225014

智能推荐

spring4构造器注入和@Resource,@Autowired的区别_spring4 构造方法注入_tom和cat的博客-程序员秘密

为什么要用spring4构造器注入https://www.cnblogs.com/joemsu/p/7688307.htmlSpring注解Resource和Autowired区别对比@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支...

Python的zip和exe安装方法_python zip.exe_不熬夜的( ⊙ o ⊙ )猫的博客-程序员秘密

我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《Python的zip和exe安装方法》, 一起来围观吧 https://blog.csdn.net/u012060033/article/details/105449881?utm_source=app

Bootstrap Table API 中文版(完整翻译文档)_bootstrap-tableapi_matthew_leung的博客-程序员秘密

/* *bootstrap的代码本质是jQuery,所以bootstrap的代码就是使用jQuery的代码格式书写为基础语法 *$('#table').bootstrapTable({}); *看网上有中文版的,但有些就是字面直接译过来了,而且有的就没有翻译,那就打算自己再翻译一遍,每一条会尽 *最大可能结合尽可能多资料翻译,如果发现译的内容比英文多,是添...

第五周项目—分段函数1_raptor怎么分段函数_Youwenmin的博客-程序员秘密

问题及代码:Copyright   2016 ,烟台大学计算机学院文件名称:任意整数.rap作者:尤文敏完成时间:2016年9月29日知识点总结:  数学当中的分段函数让我更直观地了解到raptor'的选择结构。学习心得:  细心再认真,写好程序。

python接口测试面试题及答案_和面试官面对面—常见接口测试面试题汇总(附参考答案)..._weixin_39542742的博客-程序员秘密

原标题:和面试官面对面—常见接口测试面试题汇总(附参考答案)0 1什么是API?API是(Application Programming Interface)首字母缩略词,即应用程序编程接口。API是一组用于构建软件应用程序的规程,协议和工具。API充当软件应用程序之间的接口,并允许两个软件应用程序相互通信。API是一组软件功能,可以由其他软件执行。0 2什么是API测试?API测试是一种软件测试...

RadioButton自定义样式及点击事件全解析_radiobutton事件_OAOAAce的博客-程序员秘密

1.设置文字在下边的RadioButton<RadioButton android:id="@+id/rb_male" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="50dp" android:text="男孩"

随便推点

Andriod AlertDialog_yanghw0510的博客-程序员秘密

private void showInputErrorDialog() {        AlertDialog.Builder builder = new AlertDialog.Builder(给出该窗口所依附的对象引用);        builder.setTitle("输入错误");        builder.setIcon(R.drawable.warning);        builder.setMessage("用户名或密码不能为空。");        bui

Python学习第一周-账号登陆练习_weixin_30911809的博客-程序员秘密

2017年11月底开始python的学习。选择python 3.6。账号登陆的粗糙实现。 1 import getpass 2 3 wall = True 4 usr = 'root' 5 paswd = 0000 6 block_list = open("test.txt", 'a') 7 print("Please sign in!") 8 ...

Java设计模式--建造者模式(Builder)_yanbincn的博客-程序员秘密

概述建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。它关注如何一步一步创建一个的复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立,增加新的建造者非常方便,无须修改已有代码,系统具有较好的扩展性。定义:将一个复杂对象的构建与它的表示分离,使得同...

hibernate 中注解 一对多 主键中mappedBy的具体使用及其含义_mappedby 一对多用法_l_feilong的博客-程序员秘密

1、@OneToMany(mapped=“由One的一方指向Many的一方,并且,这个属性应该等于Many的一方中含有One类的属性的属性名,否则会出错啦 ”)如:在ClassPO中:@OneToMany(targetEntity=StudentPO.class,mappedBy="myclass",cascade=javax.persistence.CascadeType.A

MachineLearning(Hsuan-Tien Lin)第九讲_帽子矩阵_DanaMeng的博客-程序员秘密

线性回归andrew的Week1和Week2说的也是线性回归。可以比较下二者所讲的。比如银行给顾客信用卡的例子,线性回归做的不是决定“要不要给顾客信用卡”而是“要给顾客多少信用额度”,每个顾客给的不一样。线性回归: 注意,x0是常数项,是阈值。目标是希望加权后的结果和期望接近。没有sign,就是直接算出来的值就是结果,不需要像分类问题一样,取符号。和分类不一样想展示:(有两

推荐文章

热门文章

相关标签