[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
SQL のデータ型は、Java のデータ型と同一ではないので、Java の型を使用するアプリケーションと SQL の方を使用するデータベースの間でデータを読み書きするためのメカニズムが必要です。 これを達成するために、JDBC は getXXX メソッドと setXXX メソッドのセット、メソッド registerOutParameter、およびクラス Types を用意しています。
| JDBC | Java |
|---|---|
| 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 |
| Java | JDBC |
|---|---|
| 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でアクセスするデータベースがオラクルの場合、JDBCのデータ型はJavaのデータ型を通じて、最終的にOracleのデータ型に変換されます。JDBCのデータ型とOracleのデータ型の対応表を次に示します。
| JDBC | Oracle |
|---|---|
| CHAR | CHAR |
| VARCHAR | VARCHAR2 |
| LONGVARCHAR | LONG |
| VARBINARY | RAW |
| LONGVARBINARY | LONG RAW |
| 数値型 | NUMBER |
| 日付型 | DATE |
みなさんの反響があれば、地道に続けていきたいと思います。