JDK 1.4升级至JDK5 JDK6的两个关键有关问题BigDecimal、java.sql.Date

JDK 1.4升级至JDK5 JDK6的两个关键问题BigDecimal、java.sql.Date

JDK 1.4升级至JDK 6.0有若干兼容性事项(应该是升级至JDK 5就应该出现类似问题),但在应用系统中比较关键的有两个:一个是数字,一个是日期。若是在财务或账务系统中,这两个东西都是非常关键的。

1、java.math.BigDecimal

 

JDK 1.4升级至JDK 5(或6),BigDecimal的toString()方法的含义发生了变化,自从JDK 5开始增加了toPlainString()方法。对于两个方法的说明如下:

(1)toString()
          返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用科学记数法。

(2)toPlainString()
          返回不带指数字段的此 BigDecimal 的字符串表示形式。

 

可以采用如下代码测试:

package mm;
import java.*;
import java.math.BigDecimal;
import java.math.MathContext;
public class Test {
 public static void main (String[] args) {


  BigDecimal a = new BigDecimal(0.000001);
  a.toString();
  System.out.println("a=   "+a);
  BigDecimal b = new BigDecimal(0.000002);
  b.toPlainString();
  System.out.println("b=   "+b);
  
 }
}

 

2、Oracle数据库的Date类型字段对应的JDBC类型为java.sql.Timestamp,不再是java.sql.Date。

 

    鉴于此,加入你从数据库中查询了一个表字段为Date类型的日期字段,假如为2011-08-08,返回的值默认为一个TimeStamp类型,即为2011-08-08 00:00:00 000,如果Java程序中将该值赋给了一个java.util.Date类型(注意是util的Date),并且把这个值作为参数传给数据库做个一个查询,并且数据库的索引就是该日期字段,此时就会发生该字段可能不走索引了,因为传给数据库的是TimeStamp类型,这是数据库会做内部类型转换,将其转为Date类型。

 

    杯具发生了,这个表数据量非常巨大,不走索引了。解决方法是在Java程序中不要用java.util.Date来接受这个字段的返回值,应该将其转换为java.sql.Date类型,然后再做为参数传给数据库。