読者です 読者をやめる 読者になる 読者になる

無限大な夢のあと

テニスとアニメが大好きな厨二病SEのブログ

[OracleDB] [Java] JavaでOracleDBを使用した際のデータマッピング

お久しぶりです!

 

本日から知識の定着を図るため、当日つまずいた内容に関してブログを書いていきたいと思います。

本日のテーマは表題の通り、JavaからOracleDBを使用する際に、つまずいたポイントを書きたいと思います。

 

予備知識として、Javaから、OracleDBを使用する際にJDBCドライバを使用します。

JDBCに関しての詳細はこちら

http://www.techscore.com/tech/Java/JavaEE/JDBC/1/

 

OracleDBに接続する方法はこちら

http://www.techscore.com/tech/Java/JavaEE/JDBC/oracle-1/

さて、本題に入ります。

本日はまった点は、簡単に言うとOracleDBのテーブルでTIMESTAMP型のフィールドから、データを取得した際に精度がおかしくなったことです。

データマッピングがうまくいっていなかったことが原因でした。

OracleDBのデータの型を忘れていて、result.getDateで値を取ろうとしたことが原因でした。

JavaでDate型で定義した変数に、result.getTimestampで取得した結果を格納することにより、解決しました。

getTimestampメソッドは、Java.sql.Timestampオブジェクトとしてデータを取得してきてくれます。

 

Java.sql.TimestampはJava.util.dateのラッパークラスで、このラッパーによって JDBC はこれを SQL TIMESTAMP 値として識別できます。

 

実際にはどのようにマッピングされているかをこちらのサイトから抜粋しましたので参考にしてください。

http://itref.fc2web.com/java/jdbc.html

 

SQLJava の型のマッピング

SQL のデータ型は、Java のデータ型と同一ではないので、Java の型を使用するアプリケーションと SQL の方を使用するデータベースの間でデータを読み書きするためのメカニズムが必要です。 これを達成するために、JDBC は getXXX メソッドと setXXX メソッドのセット、メソッド registerOutParameter、およびクラス Types を用意しています。

JDBCの型とJavaの型の対応表を次に示します。

 

Javaの型にマッピングされるJDBCの型
JDBCJava
CHAR, VARCHAR, LONGVARCHAR String
NUMERIC, DECIMAL java.math.BigDecimal
BIT boolean
TINYINT byte
SMALLINT short
INTEGER int
BIGINT long
REAL float
FLOAT, DOUBLE double
BINARY, VARBINARY, LONGVARBINARY byte
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
JDBCの型にマッピングされるJava の型
JavaJDBC
String VARCHARまたはLONGVARCHAR
java.math.BigDecimal NUMERIC
boolean BIT
byte TIMYINT
short SMALLINT
int INTEGER
long BIGINT
float REAL
double DOUBLE
byte VARBINARYまたはLONGVARBINARY
java.sql.Date DATE
java.sql.Time TIME
java.sql.Timestamp TIMESTAMP

 

JDBC型からOracleデータ型へのマッピング

 

JDBCでアクセスするデータベースがオラクルの場合、JDBCのデータ型はJavaのデータ型を通じて、最終的にOracleのデータ型に変換されます。JDBCのデータ型とOracleのデータ型の対応表を次に示します。

Oracleのデータ型にマッピングされるJDBCのデータ型
JDBCOracle
CHAR CHAR
VARCHAR VARCHAR2
LONGVARCHAR LONG
VARBINARY RAW
LONGVARBINARY LONG RAW
数値型 NUMBER
日付型 DATE

 

 みなさんの反響があれば、地道に続けていきたいと思います。