一、简介
在本文中,我们将研究如何 使用普通 JDBC 在数据库中存储 空 值 。我们将首先描述使用 空 值的原因,然后是几个代码示例。
2. 使用 空 值
null 是一个超越所有编程语言的关键字。它代表着一种特殊的价值。 人们普遍认为 null 没有价值或者它代表任何东西 。在数据库列中存储 空值 意味着在硬盘上保留了空间。如果有合适的值可用,我们可以将其存储在该空间中。
另一种看法是 null 等于零或空白 字符串 。零或空白字符串在特定上下文中可能有意义,例如仓库中的零个项目。此外,我们可以对这两个值执行 sum 或 concat 等操作。但这些操作在处理 null 时没有任何意义。
使用 空 值来表示数据中的特殊情况有很多优点。这些优点之一是大多数数据库引擎从内部函数(例如 sum 或 avg ) 中排除 空 值。另一方面,当我们的代码中存在 null 时,我们可以编写特殊操作来减少缺失值。
将 null 添加到表中也会带来一些缺点。当编写处理包含 空 值的数据的代码时,我们必须以不同的方式处理该数据。这可能会导致代码看起来很糟糕、混乱和错误。此外, 空 值在数据库中可以具有可变长度。存储在 Integer 和 Byte 列中的 n ull 将具有不同的长度。
3. 实施
对于我们的示例,我们将使用一个带有H2 内存数据库的简单 Maven 模块。不需要其他依赖项。
首先,让我们创建名为 Person 的 POJO 类。这个类将有四个字段。 Id 用作我们数据库的主键, name 和 lastName 是字符串, age 表示为 Integer 。 年龄 不是必填字段,可以为 null :
public class Person {
private Integer id;
private String name;
private String lastName;
private Integer age;
//getters and setters
}
为了创建反映该 Java 类的数据库表,我们将使用以下 SQL 查询:
CREATE TABLE Person (id INTEGER not null, name VARCHAR(50), lastName VARCHAR(50), age INTEGER, PRIMARY KEY (id));
一切都解决了,现在我们可以专注于我们的主要目标了。要将 空 值设置到 Integer 列中, PreparedStatement 接口中有两种定义的方法。
3.1.使用 setNull 方法
使用 setNull 方法, 我们在执行 SQL 查询之前始终确保字段值为 null 。这使我们的代码更加灵活。
对于列索引,我们 还必须为 PreparedStatement 实例提供有关基础列类型的信息 。在我们的例子中,这是 java.sql.Types.INTEGER 。
此方法仅为 空 值保留。对于任何其他,我们必须使用 PreparedStatement 实例的适当方法:
@Test
public void givenNewPerson_whenSetNullIsUsed_thenNewRecordIsCreated() throws SQLException {
Person person = new Person(1, "John", "Doe", null);
try (PreparedStatement preparedStatement = DBConfig.getConnection().prepareStatement(SQL)) {
preparedStatement.setInt(1, person.getId());
preparedStatement.setString(2, person.getName());
preparedStatement.setString(3, person.getLastName());
if (person.getAge() == null) {
preparedStatement.setNull(4, Types.INTEGER);
}
else {
preparedStatement.setInt(4, person.getAge());
}
int noOfRows = preparedStatement.executeUpdate();
assertThat(noOfRows, equalTo(1));
}
}
如果我们不检查 getAge 方法是否返回 null 并使用 null 值调用 setInt 方法,我们将得到 NullPointerException 。
3.2.使用 setObject 方法
setObject 方法使我们在处理代码中丢失的数据时缺乏灵活性。我们可以传递我们拥有的数据, 底层结构会将 Java 对象 类型映射到 SQL 类型 。
请注意,并非所有数据库都允许在不指定 SQL 类型的情况下传递 null 。例如,JDBC 驱动程序无法从 null 推断 SQL 类型。
为了安全起见,最好将 SQL 类型传递给 setObject 方法:
@Test
public void givenNewPerson_whenSetObjectIsUsed_thenNewRecordIsCreated() throws SQLException {
Person person = new Person(2, "John", "Doe", null);
try (PreparedStatement preparedStatement = DBConfig.getConnection().prepareStatement(SQL)) {
preparedStatement.setInt(1, person.getId());
preparedStatement.setString(2, person.getName());
preparedStatement.setString(3, person.getLastName());
preparedStatement.setObject(4, person.getAge(), Types.INTEGER);
int noOfRows = preparedStatement.executeUpdate();
assertThat(noOfRows, equalTo(1));
}
}
4。结论
在本教程中,我们解释了数据库 中空 值的一些基本用法。然后我们提供了如何使用普通 JDBC 在 整数 列中存储 空 值的示例。
与往常一样,所有代码都可以在 GitHub 上找到。