java:BigDecimal还是Integer有啥区别??Oracel保存的数值类型对应java,java中用啥类型好?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java:BigDecimal还是Integer有啥区别??Oracel保存的数值类型对应java,java中用啥类型好?相关的知识,希望对你有一定的参考价值。

java中 与 Oracle数据库对应的数据类型,当数据库保存为Number,或者别的类型,java中用什么类型好?我发现,我们的后台,int 几乎不要用到诶,都是用Integer什么原因?

第一个问题:
二者的区别就是运算后的精度问题,这个在对结果精度要求很高的情况下使用,如银行系统,电子商务交易。
第二个问题:
Number可以对应java中任意的数字类型,如整型和浮点型,java中选取当然还是和业务有关啦。
第三个问题:
最后一点说的就是开发经验了,有经验的人都这么干,为的就是能更好更直接的与数据库映射,更方便的使用框架进行开发如hibernate。追问

我想再问:当我用BigDecimal 来定义实体类时,报了个错:
org.hibernate.PropertyAccessException
后来我将类型改成Integer,又能成功执行了。你觉得这是什么原因??

数据库里面为Number类型,没有小数。

追答

Java数据类型 Hibernate数据类型 标准SQL数据类型(不同的DB可能有所差异)
java.math.BigDecimal big_decimal NUMERIC
映射的配置出问题了,导致映射不过去。

追问

我在数据库里面碰到BigDecimal这种类型了诶,这又是对应哪种类型,真是搞混了 !!

追答

你用的什么数据库了,哪有BigDecimal这种数据类型的,是不是DECIMAL啊?

追问

Oracle 是 Decimal ,哈哈

追答

你尽折腾我,这个可对应所有的数字类型 如整型和浮点型。

追问

借机再问一个,@Resource与@Autowired什么区别?
对高手而言,折腾一也下无所谓是吧,加分肯定的啦!

追答

@Autowire默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果我们想使用按照名称装配,可以结合@Qualifier注解一起使用;
@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象.
注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖的对象时候,会回退到按照类型装配,但一旦指定了name属性,就只能按照名称装配了.

追问

很清楚,真谢谢了。

参考技术A Integer是int的封装类,可以为null,所以映射一般为Integer,hibernate中也是这样的,推荐用封装类映射。 参考技术B 在后台写实体类时,int与Integer都可以,建议使用Integer,一切皆对象。 参考技术C BigDecimal和Integer精度不同 ,int 默认值为0; Integer 可以为 null。 参考技术D 用Integer吧

java.math.BigDecimal cannot be cast to java.lang.Integer说类型不能转换,求解释!

第七十八行报错,debug说list.get(i).get("goods_amout")不能转化为integer类型

将其改为:

classroom.ClassroomBuilding = int.Parse(buildnum)
classroom.ClassroomStep = int.Parse(floor)

隐试转换说明:

1.两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换

2.两个参数都是字符串,会按照字符串来比较,不做类型转换

3.两个参数都是整数,按照整数来比较,不做类型转换

4.十六进制的值和非数字做比较时,会被当做二进制串

5.有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp

6.有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较

7.所有其他情况下,两个参数都会被转换为浮点数再进行比较

所以,下面的几个sql语句有相同的效果:

select * from convert_test where areacode=0001 and period>='20170511' and period<='20170511'; 

select * from convert_test where areacode=1 and period>='20170511' and period<='20170511'; 

select * from convert_test where areacode=0001.0 and period>='20170511' and period<='20170511'; 

select * from convert_test where areacode=1.0 and period>='20170511' and period<='20170511';

参考技术A Object不能直接转化成Integer
你首先需要把它转化成String
list.get(i).toString();
再使用
Integer.valueOf(list.get(i).toString());
有很多转化都是使用String做中继的。。。本回答被提问者采纳
参考技术B 曾经在一个视频上看到,说BigInteger类的处理时按照字符串的处理方式来进行的,直接的用强制类型转换时不行的,但Integer类可以接string类型,可以使用一个Integer密名实例来接BigInteger类。 参考技术C Integer和BigDecimal都是封装类,你用(Integer)这种强制转换肯定是不行的,强制转换只能转换包含继承关系的类或基本类型数据。
BigDecimal d = new BigDecimal(1.2);
Integer i= new Integer(d.intValue());
这样转吧。
参考技术D Integer不是基本类型,是int的包装类,无法把包装当做基本类型来用。

比如,char a = 'c'; int b = (Integer)a; 这样也是回报cannot cast错误的。必须是(int)a,用基本类型才能转。这是第一个问题。

第二个问题 你的list.get(i).get("goods_amout")得到的应该是BigDecimal类型的,这个类型,不能用基本类型强转的。举个简单的例子,string a = "c"; int b = (int)a; 可以这样吗?

要转化这个,用intValue(),也就是:
list.get(i).get("goods_amout").intValue() 这样得到的就是个int 的值了。

以上是关于java:BigDecimal还是Integer有啥区别??Oracel保存的数值类型对应java,java中用啥类型好?的主要内容,如果未能解决你的问题,请参考以下文章

请问,java里,如何把BigDecimal类型转成Integer

java.math.BigDecimal cannot be cast to java.lang.Integer说类型不能转换,求解释!

将 BigDecimal 转换为 Integer

存储大量资金总额和内存/存储影响 - BigDecimal vs Integer 和最佳实践?

数据转换bug花了半天时间 Java.math.BigDecimal cannot be cast to java.lang.String

mybatis bigdecimal 对应啥类型