數據類型

讓我們看一下表格:

“C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
ID java.lang.整數 情報局 4個
姓名 java.lang.字符串 變量 12
等級 java.lang.整數 情報局 4個
創建日期 java.sql.日期 日期 91
進程結束,退出代碼為 0

在第三列中,我們看到類型:INTVARCHARDATE。這些是 SQL 服務器類型。服務器意味著提供他知道的那些類型的數據。這些類型如何轉換為 Java 類型?

這正是 JDBC 標準化的內容之一。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() 函數 數字、整數、小數
浮動 getFloat() 數字、整數、小數、浮點數、實數
雙 getDouble() 數字、整數、小數、浮點數、實數
日期 getDate() 日期、時間、時間戳
時間 getTime() 日期、時間、時間戳
時間戳 getTimestamp() 日期、時間、時間戳
字符串 getString() 字符、變量

在所有的 SQL 類型中,有些組可以被清楚地區分:

  • 數字
  • 時間
  • 線條
  • 字節對象

順便問一下,您注意到getInt()方法了嗎?

JDBC 和 NULL

您是否注意到ResultSet類的getInt()方法有什麼問題?讓我們再看看它的簽名:

int getInt(column)

此方法返回一個 int,而不是一個 Integer。因為在創建 JDBC 類型 Integer 時,它還不存在。好吧,讓我們說吧。那麼我有一個問題:

我在數據庫中有一個表,它有一個 INT NULL 列,該列可以是 INT,但也可以是 NULL。如何從此列中獲取空值?

別擔心,一切都為您想到了。

解決方案一。如果Java中的SQL類型用Date或String等引用類型來表示,那就沒有問題了。這種類型的變量可以採用空值。

解法二。原始類型不能為 null,因此像getInt()這樣的方法將簡單地返回一個默認值。對於 int 它是 0,對於 float = 0.0f,對於 double = 0.0d 等等。

那麼如何理解列中的內容:0 或 NULL?黨對這個問題有答案。

解法三。ResultSet 類有一個特殊的wasNull()方法,如果該方法只是返回一個不同的值而不是 NULL ,則該方法返回 true

一切都像我在這裡寫的那樣工作。例子:

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,這已經足夠了。但是,他還是有些不對勁。線索!下面是正確的 Date 類型:

java.util.Date

他們有不同的包裹!這些通常是不同類型的數據。這就是原因......

20 世紀 70 年代以來的數據庫支持 3 種類型的數據來存儲時間:

  • DATE - 存儲日期:年、月、日。
  • TIME - 存儲時間:小時、分鐘、秒。
  • TIMESTAMP - 存儲特定時間點:日期、時間和毫秒。

Java 語言在其存在的前 10 年只有一種數據類型java.util.Date,它以 UNIX TIME 格式存儲一個時間點:自 1970 年初以來的毫秒數。

因此,JDBC 標準的創建者向 Java 添加了另外三種數據類型——專門針對 JDBC:

  • java.sql.日期
  • java.sql.時間
  • java.sql時間戳

因此ResultSet接口的方法包含固定的數據類型:

類型 Java類型 方法
日期 java.sql.日期 java.sql.date 獲取日期()
時間 java.sql.時間 java.sql.Time 獲取時間()
時間戳 java.sql.時間戳 java.sql.Timestamp getTimestamp() 方法

這是您在這裡看到的類型:

“C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
ID java.lang.整數 情報局 4個
姓名 java.lang.字符串 變量 12
等級 java.lang.整數 情報局 4個
創建日期 java.sql.日期 日期 91
進程結束,退出代碼為 0

猜猜這裡缺少什麼?Java DateTime API 中出現過的數據類型:

  • 本地日期
  • 當地時間
  • 本地日期時間