数据类型

让我们看一下表格:

“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 中出现过的数据类型:

  • 本地日期
  • 当地时间
  • 本地日期时间