データ型

表を見てみましょう。

「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 番目の列には、タイプINTVARCHARDATEが表示されます。これらは 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 に登場するデータ型:

  • ローカル日付
  • 現地時間
  • ローカル日時