`
marb
  • 浏览: 418908 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle 数据库,通过resultSet.getObject获取时间类型截断的问题的解析

阅读更多

一般的数据库中,DATE字段仅仅表示日期,不包括日期信息,而Oracle数据库中的DATE数据类型是包括日期、时间的,对于不同的Oracle jdbc驱动版本,对于该问题的处理都有些区别,如果你使用9i或者11g
的驱动程序,可能不会发现什么困惑,不幸的话,你使用Oracle10g的JDBC驱动,问题就来了,你会发现时间不见了
看下面的程序
• 表结构如下
create table t_test(
id int,
date1 date,
date2 timestamp,
primary key(id)
)

 1 try   {
 2             Class.forName( " oracle.jdbc.OracleDriver " );
 3             java.sql.Connection connection1  =  DriverManager.getConnection( " jdbc:oracle:thin:@192.168.8.200:1521:cdb " " sysusr " " sys " );
 4             System.out.println(connection1);
 5             System.out.println(connection1.getMetaData().getDriverName() + "   " + connection1.getMetaData().getDriverVersion());
 6             ResultSet rs  =  connection1.createStatement().executeQuery( " select date1,date2 from t_test " );
 7             rs.next();
 8              printInfo(rs, 1 );
 9             printInfo(rs, 2 );
10         }

11          catch  (Exception exception1)  {
12             exception1.printStackTrace();
13         }

14
15
16 public   static   void  printInfo(ResultSet rs, int  i)  throws  SQLException {
17         ResultSetMetaData meta = rs.getMetaData();
18         System.out.printf( " Colname=%s,Type=%s,TypeName=%s,val=[%s];\n " ,meta.getColumnName(i),meta.getColumnType(i),meta.getColumnTypeName(i),rs.getObject(i).toString());
19     }


• 如果使用9i或者11g的驱动连接数据库,返回结果如下:
9i数据库JDBC
oracle.jdbc.driver.OracleConnection@16930e2
Oracle JDBC driver 9.2.0.8.0
Colname=DATE1,Type=91,TypeName=DATE,val=[2008-06-13 13:48:21.0 ];
Colname=DATE2,Type=93,TypeName=TIMESTAMP,val=[oracle.sql.TIMESTAMP@18d107f];

11g数据库JDBC
oracle.jdbc.driver.T4CConnection@a61164
Oracle JDBC driver 11.1.0.6.0-Production+
Colname=DATE1,Type=93,TypeName=DATE,val=[2008-06-13 13:48:21.0];
Colname=DATE2,Type=93,TypeName=TIMESTAMP,val=[oracle.sql.TIMESTAMP@c4aad3];

如果使用10g JDBC 驱动,结果如下:
oracle.jdbc.driver.T4CConnection@1bac748
Oracle JDBC driver 10.2.0.2.0
Colname=DATE1,Type=91,TypeName=DATE,val=[2008-06-13 ];
Colname=DATE2,Type=93,TypeName=TIMESTAMP,val=[oracle.sql.TIMESTAMP@b8df17];

结果是让人困惑,时间怎么不见了?

对于该问题,在Oracle的JDBC FAQ中有提到解决办法:

Prior to 9.2, the Oracle JDBC drivers mapped the DATE SQL type to java.sql.Timestamp. This made a certain amount of sense because the Oracle DATE SQL type contains both date and time information as does java.sql.Timestamp. The more obvious mapping to java.sql.Date was somewhat problematic as java.sql.Date does not include time information. It was also the case that the RDBMS did not support the TIMESTAMP SQL type, so there was no problem with mapping DATE to Timestamp. 

In 9.2 TIMESTAMP support was added to the RDBMS. The difference between DATE and TIMESTAMP is that TIMESTAMP includes nanoseconds and DATE does not. So, beginning in 9.2, DATE is mapped to Date and TIMESTAMP is mapped to Timestamp. Unfortunately if you were relying on DATE values to contain time information, there is a problem. 

There are several ways to address this problem: 

Alter your tables to use TIMESTAMP instead of DATE. This is probably rarely possible, but it is the best solution when it is. 

Alter your application to use defineColumnType to define the columns as TIMESTAMP rather than DATE. There are problems with this because you really don't want to use defineColumnType unless you have to (see What is defineColumnType and when should I use it?). 

Alter you application to use getTimestamp rather than getObject. This is a good solution when possible, however many applications contain generic code that relies on getObject, so it isn't always possible. 

Set the V8Compatible connection property. This tells the JDBC drivers to use the old mapping rather than the new one. You can set this flag either as a connection property or a system property. You set the connection property by adding it to the java.util.Properties object passed to DriverManager.getConnection or to OracleDataSource.setConnectionProperties. You set the system property by including a -D option in your java command line. 

  java -Doracle.jdbc.V8Compatible="true" MyApp


参照上面的解释,修改代码如下可以解决10g JDBC驱动的问题:

try   {
            Class.forName(
" oracle.jdbc.OracleDriver " );
            Properties prop
= new  Properties();
            prop.setProperty(
" user " , " sysuser " );
            prop.setProperty(
" password " , " sys " );
            prop.setProperty(
" oracle.jdbc.V8Compatible " , " true " );
            java.sql.Connection connection1 
=  DriverManager.getConnection( " jdbc:oracle:thin:@192.168.8.200:1521:cdb "
, prop);
            System.out.println(connection1);
            System.out.println(connection1.getMetaData().getDriverName()
+ "   " + connection1.getMetaData().getDriverVersion());
            ResultSet rs 
=  connection1.createStatement().executeQuery( " select date1,date2 from t_test " );
            rs.next();
            printInfo(rs,
1 );
            printInfo(rs,
2 );
        }

        
catch  (Exception exception1)  {
            exception1.printStackTrace();
        }

或者在系统变量中使用参数-Doracle.jdbc.V8Compatible="true",例如
java -Doracle.jdbc.V8Compatible="true" MyApp

结果如下:
oracle.jdbc.driver.T4CConnection@9664a1
Oracle JDBC driver 10.2.0.2.0
Colname=DATE1,Type=93,TypeName=DATE,val=[2008-06-13 13:48:21.0 ];
Colname=DATE2,Type=93,TypeName=DATE,val=[oracle.sql.TIMESTAMP@1172e08];

分享到:
评论

相关推荐

    ojdbc6--oracle数据库连接驱动.rar

    Oracle数据库是世界上最流行的关系型数据库管理系统之一,广泛应用于企业级应用、数据分析以及互联网服务等领域。在Java编程中,为了与Oracle数据库进行交互,我们需要使用特定的数据库连接驱动,这就是ojdbc6驱动的...

    java数据库连接ResultSet

    另外,ResultSet还提供了获取列信息的方法,例如 getMetaData,可以用来获取 ResultSet 对象各列的编号、类型和属性。如果列名已知,但不知其索引,则可以使用 findColumn 方法来获取其列号。 在使用 getXXX 方法时...

    java连接oracle数据库

    通过以上步骤,我们完成了使用Java连接Oracle数据库的基本过程。在实际开发过程中,还需要考虑异常处理、日志记录等更多细节问题。此外,为了提高性能和可维护性,可以考虑使用ORM框架(如Hibernate)来简化数据库...

    基于Java的实例开发源码-Oracle数据库工具 WARTS.zip

    标题中的“基于Java的实例开发源码-Oracle数据库工具 WARTS.zip”表明这是一个使用Java编程语言开发的Oracle数据库管理工具。WARTS(可能是Web-based Application for Reporting, Tracking and Status)是一个开源...

    基于Java的Oracle数据库工具 WARTS.zip

    **Java与Oracle数据库的交互** Java作为一种跨平台的编程语言,广泛应用于开发各种类型的应用程序,包括数据库管理工具。在给定的资源“基于Java的Oracle数据库工具 WARTS.zip”中,我们可以发现一个名为“warts-...

    【技术篇】JDBC连接ORACLE数据库之方法.docx

    【技术篇】JDBC连接ORACLE数据库之方法 在IT领域,JDBC(Java Database Connectivity)是Java语言中用于与关系数据库交互的一种标准接口。它允许Java程序通过编写Java代码来执行SQL语句,实现数据的增删查改操作。...

    VC 中使用OCCI访问Oracle数据库的研究.pdf

    本文主要关注使用VC++并通过OCCI(Oracle C++ Call Interfaces)访问Oracle数据库的方式。以下是对各种Oracle数据库访问方法的简要概述: 1. **ODBC(Open Database Connectivity)**:这是一个广泛使用的数据库...

    java通过jdbc连接oracle数据库.doc

    Java通过JDBC连接Oracle数据库是开发中常见的任务,它允许我们与Oracle数据库进行交互,执行SQL语句,处理结果集等。以下是一个详细的步骤指南,以及相关知识点的介绍。 1. **下载Oracle数据库驱动**: Oracle ...

    oracle.jdbc.driver.oracledriver Oracle JDBC驱动包 ojdbc6

    Oracle JDBC驱动包是Oracle数据库与Java应用程序之间进行通信的关键组件,它使得Java程序员能够通过编写Java代码来操作Oracle数据库。标题中的"ojdbc6"指的是Oracle JDBC驱动的一个特定版本,适用于Java SE 6环境。...

    JSP+JDBC_真分页(基于Oracle数据库分页).

    本主题聚焦于使用JSP和JDBC在Oracle数据库上实现真正的分页功能。在Web开发中,分页是提高用户体验的关键技术,尤其是在处理大量数据时,它能让用户更有效地浏览和查找所需信息。这里我们将深入探讨如何结合Java ...

    ResultSet对象获取数据的各种方法

    `ResultSet`提供了多种方法来根据不同的数据类型获取值: - `Array getArray(int columnIndex)`:获取数组类型的值。 - `boolean getBoolean(int columnIndex)`:获取布尔类型的值。 - `byte getByte(int column...

    Oracle18c(18.3)数据库驱动ojdbc.jar

    这个驱动程序,也被称为Oracle JDBC驱动,允许Java开发者通过Java编程语言与Oracle数据库进行交互。ojdbc8.jar是Oracle数据库18c版本的JDBC Type 4驱动,支持最新的Java 8标准,它提供了全面的功能,包括数据的查询...

    java连接oracle数据库jar包

    Java连接Oracle数据库主要依赖于JDBC(Java Database Connectivity)技术,这是Java平台中用于与各种数据库进行交互的一套标准API。Oracle公司提供了JDBC驱动,使得Java程序能够方便地访问Oracle数据库。在Java中...

    Oracle JDBC驱动11.2.0.4

    Oracle JDBC驱动程序允许Java应用程序通过Java代码与Oracle数据库进行交互,执行SQL查询、更新数据库记录以及管理事务等操作。在11g Release 2版本中,11.2.0.4是一个重要的维护版本,包含了一些性能优化、bug修复...

    oracle-ojdbc14.jar

    Oracle-Ojdbc14.jar是Oracle数据库与Java应用程序之间进行数据交互的重要组件,它包含了Oracle数据库的Java Database Connectivity (JDBC)驱动程序。JDBC是一种Java API,允许Java开发者使用SQL语句来操作数据库,...

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    "解决mybatis使用char类型字段查询oracle数据库时结果返回null问题" 在使用mybatis框架对Oracle数据库进行查询操作时,如果使用char类型字段作为查询条件,可能会出现结果返回null的问题。这种情况下,需要对char...

    JDBC实用技术(连接Oracle数据库).

    分为thin、thin with OCI(Oracle Call Interface)、 DriverManager和JNDI(Java Naming and Directory Interface)四种类型,其中thin驱动是最常用的,因为它无需安装额外的客户端组件,直接通过网络与数据库...

    Oracle数据库时间类型与JAVA之间的转换和应用.pdf

    ### Oracle数据库时间类型与JAVA之间的转换和应用 #### 一、从Oracle数据库中查询时间的格式 在Oracle数据库中,时间通常以特定的格式存储。当通过Java应用程序使用JDBC从Oracle数据库中检索时间时,可能会遇到...

    jsp连接oracle数据库代码

    ### JSP连接Oracle数据库知识点详解 #### 一、前言 在Web开发中,Java Server Pages (JSP) 是一种广泛使用的服务器端脚本技术,它允许开发者将动态内容嵌入到HTML页面中。JSP可以与各种类型的数据库进行交互,以...

    利用Java程序实现Oracle数据库中大对象的存取.pdf

    该代码使用jdbc驱动程序连接Oracle数据库,并使用ResultSet对象来获取大对象的内容,然后可以对输入流进行处理。 使用Java程序实现Oracle数据库中大对象的存取可以通过jdbc驱动程序连接Oracle数据库,并使用...

Global site tag (gtag.js) - Google Analytics