数据类型
让我们看一下表格:
“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 中出现过的数据类型:
- 本地日期
- 当地时间
- 本地日期时间