Oracle数据同步接口中,对于NUMBER、DATE类型数据,从resultSet中直接获取造成精度丢失的解决方案
程序员文章站
2022-06-15 12:09:32
...
通过JDBC获取ORACLE数据库数据时,返回值统一都是ResultSet对象,就像存储过程中的游标,一行一行的读取数据。对于NUMBER和DATE类型的数据,如果java代码中直接用resultSet.getInt()、resultSet.getDate()等,往往会存在一些精度上的丢失。
- NUMBER类型
NUMBER数据类型既可以标识整数,也可以表示小数,所以大部分情况下表中的数字类型字段都直接用NUMBER表示,在java中通过JDBC获取时,通过resultSet.getBigDecimal()来接收对应字段的数据,可以有效防止数据精度丢失。
BigDecimal bigDecimal = resultSet.getBigDecimal(s.trim());
- DATE类型
ORACLE数据库中的DATE类型数据,可以只表示年月日,也可以加上时分秒,相对而言非常灵活。如果通过resultSet.getDate()获取数据,返回值为java.sql.Date,该类型对象只能表示年月日,精度丢失可能会非常严重。java中还有一个java.util.Date类型,该类型对象却可以表示年月日+时分秒。所以在java中通过JDBC获取时,先将字段按照TimeStampe对象处理,再转换成java.util.Date对象。
Timestamp timestamp1 = resultSet.getTimestamp(s.trim());
//加上空判断,防止空指针异常
if(timestamp1!=null){
long time = timestamp1.getTime();
//DateFormateUtil.formatDate方法在本地工具包中,将日期转换成对应字符串
filedData = DateFormateUtil.formatDate(new Date(time));
}
public static String formatDate(Date date) throws ParseException {
//SimpleDateFormat 不能保证线程安全,所以不要声明为静态成员变量
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
}