データ型
表を見てみましょう。
「C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe... | |||
ID | java.lang.Integer | INT | 4 |
名前 | java.lang.string | VARCHAR | 12 |
レベル | java.lang.Integer | INT | 4 |
作成日 | java.sql.date | 日にち | 91 |
プロセスは終了コード 0 で終了しました |
3 番目の列には、タイプINT、VARCHAR、DATEが表示されます。これらは SQL サーバーの種類です。サーバー手段は、サーバーが知っているタイプのデータを提供します。これらの型はどのようにして Java 型に変換されるのでしょうか?
これはまさに JDBC で標準化されたものの 1 つです。JDBC の作成者は、SQL 型のリストを修正することから始めました。定数を持つ特別なクラスがあります。
class java.sql.Types {
public static final int CHAR = 1;
public static final int NUMERIC = 2;
public static final int DECIMAL = 3;
public static final int INTEGER = 4;
public static final int FLOAT = 6;
public static final int REAL = 7;
…
}
この番号はクラス内のシリアル番号ではなく、SQL 仕様の SQL タイプのリストにある ID タイプです。これらは、講義の冒頭の例で見た数値です。
また、ResultSet クラスには、あるデータ型を別のデータ型に変換できるメソッドがあります。すべての型を相互に変換できるわけではありませんが、ロジックは十分に明確です。ここにあなたのための良いスプレッドシートがあります:
方法 | SQLデータ型 |
---|---|
int getInt() | 数値、整数、10 進数 |
フロート getFloat() | 数値、整数、10 進数、浮動小数点数、実数 |
ダブル getDoublel() | 数値、整数、10 進数、浮動小数点数、実数 |
日付 getDate() | 日付、時刻、タイムスタンプ |
時間 getTime() | 日付、時刻、タイムスタンプ |
タイムスタンプ getTimestamp() | 日付、時刻、タイムスタンプ |
文字列getString() | CHAR、VARCHAR |
すべての SQL タイプの中で、いくつかのグループは明確に区別できます。
- 数字
- 時間
- 行
- バイトオブジェクト
ところで、getInt()メソッドに気づきましたか?
JDBC と NULL
ResultSetクラスのgetInt()メソッドの何が間違っているのかに気づきましたか? もう一度その署名を見てみましょう。
int getInt(column)
このメソッドは、 Integer ではなくintを返します。これは、JDBC 型 Integer が作成された時点では、まだ存在していなかったためです。さて、言ってみましょう。それから質問があります:
データベース内に INT NULL 列を持つテーブルがあります。この列は INT である可能性もありますが、NULL になる可能性もあります。この列から null 値を取得するにはどうすればよいですか?
心配しないでください。すべてはあなたのために考えられています。
解決策 1。Java の SQL 型が Date や String などの参照型で表現されている場合は問題ありません。このタイプの変数は null 値を取ることができます。
解決策 2。プリミティブ型を null にすることはできないため、getInt()のようなメソッドは単にデフォルト値を返します。int の場合は 0、float = 0.0f、double = 0.0d などです。
それでは、列の内容 (0 または NULL) をどうやって理解するのでしょうか? そして党はこの質問に対する答えを持っています。
解決策 3。ResultSet クラスには、メソッドが NULL ではなく別の値を返した場合に true を返す特別なwasNull()メソッドがあります。
ここで書いたとおりにすべてが正確に機能します。例:
ResultSet results = staatement.executeQuery("SELECT * FROM user");
int level = results.getInt("level");
if (results.wasNull()) {
System.out.println("Level is null");
} else {
System.out.println("Level is " + level);
}
getInt()メソッドの呼び出し時にnull を返すことが想定されている場合、 wasNull()メソッドはtrue を返し、そうでない場合はwasNull()メソッドは false を返します。
これはプリミティブ型に対してのみ機能するわけではありません。
ResultSet results = staatement.executeQuery("SELECT * FROM user");
String name = results.getString("name");
if (results.wasNull()) {
System.out.println("Name is null");
} else {
System.out.println("User name is " + name);
}
これはもちろん松葉杖です。ただし、NullPointerExceptionに関しては問題ありません。すべてのポジティブな点を見てください:)
JDBC のデータ型の何が問題になっているのでしょうか?
テストを続けましょう。getDate(column)メソッドをよく見てください。彼の何が問題なのでしょうか?このメソッドの結果は次のタイプになります。
java.sql.Date
null を格納できるので十分です。しかし、それでも彼は何かがおかしい。ヒント!正しい日付型は次のようになります。
java.util.Date
それぞれ違うパッケージがありますよ!これらは通常、異なる種類のデータです。そしてその理由はここにあります...
20 世紀の 70 年代以降のデータベースは、時刻を保存するために 3 種類のデータをサポートしています。
- DATE - 日付 (年、月、日) を保存します。
- TIME - 時間、分、秒を保存します。
- TIMESTAMP - 特定の時点 (日付、時刻、ミリ秒) を保存します。
Java 言語が誕生してから最初の 10 年間、Java 言語にはjava.util.Date という1 つのデータ型しかありませんでした。これは、時点を UNIX TIME 形式で保存します。つまり、1970 年初頭からのミリ秒数です。
したがって、JDBC 標準の作成者は、特に JDBC 用に、さらに 3 つのデータ型を Java に追加しました。
- java.sql.date
- java.sql.Time
- java.sqlタイムスタンプ
したがって、ResultSetインターフェイスのメソッドには固定データ型が含まれます。
SQLの種類 | Java タイプ | 方法 |
---|---|---|
日にち | java.sql.date | java.sql.date getDate() |
時間 | java.sql.Time | java.sql.Time getTime() |
タイムスタンプ | java.sql.タイムスタンプ | java.sql.Timestamp getTimestamp() |
そして、これがここで見られるタイプです:
「C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe... | |||
ID | java.lang.Integer | INT | 4 |
名前 | java.lang.string | VARCHAR | 12 |
レベル | java.lang.Integer | INT | 4 |
作成日 | java.sql.date | 日にち | 91 |
プロセスは終了コード 0 で終了しました |
ここに何が欠けていると思いますか? Java DateTime API に登場するデータ型:
- ローカル日付
- 現地時間
- ローカル日時
GO TO FULL VERSION