1. Введение
В этой статье мы рассмотрим, как мы можем хранить нулевые
значения в нашей базе данных, используя простой JDBC . Мы начнем с описания причин использования нулевых
значений, а затем приведем несколько примеров кода.
2. Использование нулевых
значений
null
— ключевое слово, превосходящее все языки программирования. Представляет особую ценность. Распространено мнение, что null
не имеет значения или ничего не представляет . Наличие нулевого значения
в столбце базы данных означает, что место на жестком диске зарезервировано. Если подходящее значение становится доступным, мы можем сохранить его в этом пространстве.
Другое восприятие состоит в том, что null
равен нулю или пустой
строке . Нуль или пустая строка в конкретном контексте может иметь значение, например, ноль товаров на складе. Кроме того, мы можем выполнять такие операции, как суммирование
или конкатирование
этих двух значений. Но эти операции не имеют смысла при работе с null
.
Использование нулевых
значений для представления особых случаев в наших данных имеет много преимуществ. Одним из таких преимуществ является то, что большинство механизмов баз данных исключают нулевые
значения из внутренних функций, таких как sum
или avg
. С другой стороны, когда в нашем коде есть null
, мы можем запрограммировать специальные действия, чтобы смягчить отсутствующие значения.
Добавление null
в таблицу также приносит пару недостатков. При написании кода, работающего с данными, содержащими нулевые
значения, мы должны обрабатывать эти данные по-другому. Это может привести к некрасивому коду, беспорядку и ошибкам. Кроме того, нулевые
значения могут иметь переменную длину в базе данных. n ull,
хранящиеся в столбцах Integer
и Byte
, будут иметь разную длину.
3. Реализация
В нашем примере мы будем использовать простой модуль Maven с базой данных H2 в памяти . Никаких других зависимостей не требуется.
Во-первых, давайте создадим наш класс POJO с именем Person
. Этот класс будет иметь четыре поля. Идентификатор
, используемый в качестве первичного ключа для нашей базы данных, имя
и фамилия ,
которые являются строками, а возраст
представлен как Integer
. Возраст
не является обязательным полем и может быть пустым
:
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
мы всегда уверены, что значение нашего поля равно null
перед выполнением SQL-запроса . Это дает нам больше гибкости в коде.
Вместе с индексом столбца мы также должны предоставить экземпляру 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
и вызывает метод setInt
с нулевым
значением, мы получим NullPointerException
.
3.2. Использование метода setObject
Метод setObject
дает нам меньше гибкости при работе с отсутствующими данными в нашем коде. Мы можем передать имеющиеся у нас данные, и базовая структура сопоставит типы Java Object
с типами SQL .
Обратите внимание, что не все базы данных позволяют передавать null
без указания типа SQL. Например, драйвер JDBC не может вывести типы SQL из значения 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. Вывод
В этом руководстве мы объяснили некоторые основные способы использования нулевых
значений в базах данных. Затем мы предоставили примеры того, как хранить нулевые
значения внутри столбцов Integer
с помощью простого JDBC.
Как всегда, весь код можно найти на GitHub .