欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
	}
相关标签: Oracle resultSet