1. 程式人生 > >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型別,然後再做為引數傳給資料庫。