一、简介

在本文中,我们将研究如何 使用普通 JDBC 在数据库中存储 。我们将首先描述使用 值的原因,然后是几个代码示例。

2. 使用

null 是一个超越所有编程语言的关键字。它代表着一种特殊的价值。 人们普遍认为 null 没有价值或者它代表任何东西 。在数据库列中存储 空值 意味着在硬盘上保留了空间。如果有合适的值可用,我们可以将其存储在该空间中。

另一种看法是 null 等于零或空白 字符串 。零或空白字符串在特定上下文中可能有意义,例如仓库中的零个项目。此外,我们可以对这两个值执行 sumconcat 等操作。但这些操作在处理 null 时没有任何意义。

使用 值来表示数据中的特殊情况有很多优点。这些优点之一是大多数数据库引擎从内部函数(例如 sumavg ) 中排除 值。另一方面,当我们的代码中存在 null 时,我们可以编写特殊操作来减少缺失值。

null 添加到表中也会带来一些缺点。当编写处理包含 值的数据的代码时,我们必须以不同的方式处理该数据。这可能会导致代码看起来很糟糕、混乱和错误。此外, 值在数据库中可以具有可变长度。存储在 IntegerByte 列中的 n ull 将具有不同的长度。

3. 实施

对于我们的示例,我们将使用一个带有H2 内存数据库的简单 Maven 模块。不需要其他依赖项。

首先,让我们创建名为 Person 的 POJO 类。这个类将有四个字段。 Id 用作我们数据库的主键, namelastName 是字符串, 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 上找到。


« 上一篇: 理解Pattern.quote方法
» 下一篇: Java String 教程全集