數據類型
讓我們看一下表格:
“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 |
在第三列中,我們看到類型:INT、VARCHAR、DATE。這些是 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 中出現過的數據類型:
- 本地日期
- 當地時間
- 本地日期時間
GO TO FULL VERSION