気をつけること
JavaでSQLを扱う際に気をつけないといけないのが「SQLから受け取った値を扱える型をJava側で用意する」ことです。
もしJava側でSQLの値を扱える型が用意できなければ、DBに保存されている値を間違った形で取得してしまい、整合性のないプログラムになってしまいます。
まずは、SQLとJavaの型の対応を見ていきましょう。(OracleDBで自分がよく使うデータ型)
SQL | Java |
CHAR | String |
VARCHAR2 | |
NUMBER | int |
float | |
byte | |
DATE | java.sql.Date |
TIMESTAMP | java.sql.Timestamp |
ここで気をつけなければ行けないのが日付を扱うDATE型とTIMESTAMP型です。
DATE型とは「年・月・日」を扱うデータ方に対してTIMESTAMP型は日付と時刻を扱うデータ型になります。
−−DATE型(YYYY/MM/DD)
2021/08/20
--TIMESTAMP型(YYYY/MM/DD HH:MM:SS)
2021/08/20 12:30:25
日付を扱うDATE型やTIMESTAMP型も文字列を扱う際のようにString一つで扱えたら良いのですが、Javaではそこが難しいです。
下記のようなコードで対応しましょう。
/*DATE*/
String sql = "SELECT 登録日 FROM SAMPLE LIMIT1";
PreparedStatement ps = con.preparedStatement(sql);
ResultSet rs = ps.excuteQuery();
java.util.Date date = new java.util.Date(); −−DATE型を扱えるパッケージの呼び出し
date = rs;
/*TIMESTAMP*/
String sql = "SELECT 登録日 FROM SAMPLE LIMIT1";
PreparedStatement ps = con.preparedStatement(sql);
ResultSet rs = ps.excuteQuery();
java.sql.Timestamp ts = rs.getTimesatamp(1);
java.util.Date date = new Date(1);
補足
日付型の変換はよく使用するので紹介しておきます。
この方法を使えばSQLの型をあまり気にせずにJava側で値を受け取ることができまーす。
/*日付型を文字列に変換*/
SELECT TO_CHAR('登録日, YYYY/MM/DD'),
TO_CHAR('登録日, YYYY/MM/DD HH12:MM:SS') --12時間形式
TO_CHAR('登録日, YYYY/MM/DD HH24:MM:SS') --24時間形式
/*文字列を日付型に変換*/
SELECT TO_DATE('登録日, YYYY/MM/DD'),TO_DATE('登録日, YYYY/MM/DD HH12:MM:SS') --12時間形式
TO_DATE('登録日, YYYY/MM/DD HH24:MM:SS') --24時間形式