使用 JDBC 將 Null 插入整數列

一、簡介

在本文中,我們將研究如何**使用普通 JDBC 在我們的數據庫中存儲null**值。我們將首先描述使用null值的原因,然後是幾個代碼示例。

2. 使用null

null是一個超越所有編程語言的關鍵字。它代表了一種特殊的價值。普遍認為null沒有價值或它不代表任何東西。在null意味著在硬盤上保留了空間。如果有合適的值可用,我們可以將其存儲在該空間中。

**另一種看法是, null等於零或一個空字符串**。特定上下文中的零或空白字符串可能具有含義,例如,倉庫中的零個項目。此外,我們可以對這兩個值sumconcat但是這些操作在處理null時沒有意義。

在我們的數據中使用null值來表示特殊情況有很多優點。這些優點之一是大多數數據庫引擎sumavg等內部函數中null值。另一方面,當null時,我們可以編寫特殊操作來減少缺失值。

null帶到表中也會帶來一些缺點。在編寫處理包含null值的數據的代碼時,我們必須以不同的方式處理該數據。這可能會導致代碼難看、混亂和錯誤。此外, null值在數據庫中可以具有可變長度。 null存儲在IntegerByte列中將具有不同的長度。

3. 代碼實現

對於我們的示例,我們將使用帶有 H2 內存數據庫的簡單 Maven 模塊。不需要其他依賴項。

首先,讓我們創建名為Person的 POJO 類。這個類將有四個字段。 Id用作我們數據庫的主鍵, name,lastName,它們是字符串, age表示為IntegerAge不是必填字段,可以為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));

完成所有這些之後,現在我們可以專注於我們的主要目標。要將nullInteger PreparedStatement接口中有兩種定義的方法。

3.1.使用setNull方法

使用setNull方法,在執行 SQL 查詢之前,我們始終確保我們的字段值為null 。這使我們在代碼中具有更大的靈活性。

對於列索引,我們還必須為PreparedStatement實例提供有關基礎列類型的信息。在我們的例子中,這是java.sql.Types.INTEGER

此方法僅為null值保留。對於任何其他,我們必須使用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並使用a null setInt方法,我們將得到NullPointerException

3.2. 使用setObject方法

setObject方法讓我們在處理代碼中丟失的數據時靈活性較低。我們可以傳遞我們擁有的數據,底層結構會將 Java Object類型映射到 SQL 類型

請注意,並非所有數據庫都允許在不指定 SQL 類型的情況下null例如,JDBC 驅動程序無法從null.

為了安全起見,最好將 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 結論

在本教程中,我們解釋了一些基本的用法null數據庫中值。然後我們提供瞭如何使用普通 JDBC Integer null值的示例。