使用 JDBC 將 Null 插入整數列
- java
- JDBC
一、簡介
在本文中,我們將研究如何**使用普通 JDBC 在我們的數據庫中存儲null
**值。我們將首先描述使用null
值的原因,然後是幾個代碼示例。
2. 使用null
值
null
是一個超越所有編程語言的關鍵字。它代表了一種特殊的價值。普遍認為null
沒有價值或它不代表任何東西。在null
意味著在硬盤上保留了空間。如果有合適的值可用,我們可以將其存儲在該空間中。
**另一種看法是, null
等於零或一個空字符串
**。特定上下文中的零或空白字符串可能具有含義,例如,倉庫中的零個項目。此外,我們可以對這兩個值sum
或concat
但是這些操作在處理null
時沒有意義。
在我們的數據中使用null
值來表示特殊情況有很多優點。這些優點之一是大多數數據庫引擎sum
或avg
等內部函數中null
值。另一方面,當null
時,我們可以編寫特殊操作來減少缺失值。
將null
帶到表中也會帶來一些缺點。在編寫處理包含null
值的數據的代碼時,我們必須以不同的方式處理該數據。這可能會導致代碼難看、混亂和錯誤。此外, null
值在數據庫中可以具有可變長度。 null
存儲在Integer
和Byte
列中將具有不同的長度。
3. 代碼實現
對於我們的示例,我們將使用帶有 H2 內存數據庫的簡單 Maven 模塊。不需要其他依賴項。
首先,讓我們創建名為Person
的 POJO 類。這個類將有四個字段。 Id
用作我們數據庫的主鍵, name,
和lastName,
它們是字符串, age
表示為Integer
。 Age
不是必填字段,可以為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));
完成所有這些之後,現在我們可以專注於我們的主要目標。要將null
值Integer
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
值的示例。