Полный список типов данных JDBC

Кроме известных тебе типов данных JDBC позволяет работать со многими родными типами данных для СУБД. Ниже я приведу список типов и функции для получения их:

Тип Метод
Array getArray()
AsciiStream getAsciiStream()
BigDecimal getBigDecimal()
BinaryStream getBinaryStream()
Blob getBlob()
Boolean getBoolean()
Blob getBlob()
Boolean getBoolean()
Byte getByte()
Bytes getBytes()
CharacterStream getCharacterStream()
Clob getClob()
Date getDate()
Double getDouble()
Float getFloat()
Int getInt()
Long getLong()
NCharacterStream getNCharacterStream()
Object getObject()
Ref getRef()
RowId getRowId()
Short getShort()
SQLXML getSQLXML()
String getString()
Time getTime()
Timestamp getTimestamp()
UnicodeStream getUnicodeStream()
URL getURL()

Примитивные типы мы с тобой уже рассматривали. Давай теперь попробуем поработать с объектами.

Тип данных BLOB

Если ты хочешь сохранить какой-то объект в базу данных, то самый простой способ сделать это — воспользовавшись SQL-типом BLOB. У JDBC есть его аналог, который называется Blob.

BLOB расшифровывается как Binary Large Object. Он используется для хранения массива байт. Тип Blob в JDBC является интерфейсом и в него можно класть (и получать) данные двумя способами:

  • С помощью InputStream
  • С помощью массива байт

Пример: колонка номер 3 содержит тип BLOB:


	Statement statement = connection.createStatement();
    ResultSet results = statement.executeQuery("SELECT * FROM user");
    results.first();
 
    Blob blob = results.getBlob(3);
    InputStream is = blob.getBinaryStream();

Чобы создать свой объект Blob, нужно воспользоваться функцией createBlob(). Пример:


  String insertQuery = “INSERT INTO images(name, image) VALUES (?, ?)”;
  PreparedStatement statement = connection.prepareStatement(insertQuery);
 
  // Создаем объект Blob и получаем у него OtputStream для записи в него данных
  Blob blob = connection.createBlob();
 
  // Заполняем Blob данными  …
  OutputStream os = blob.setBinaryStream(1);
 
  // Передаем Вlob как параметр запроса
  statement.setBlob(2, blob);
  statement.execute();

Заполнить Blob данными можно двумя способами. Первый — через OutputSteam:


  Path avatar = Paths.get("E:\\images\\cat.jpg");
  OutputStream os = blob.setBinaryStream(1);
  Files.copy(avatar, os);

И второй — через заполнение байтами:


  Path avatar = Paths.get("E:\\images\\cat.jpg");
  byte[] content = Files.readAllBytes(avatar);
  blob.setBytes(1, content);

Сохраняем Java-объект в базу

Мы научились сохранять в базу бинарные объекты: массивы байт, байтовые потоки и так далее. А что насчет Java-объектов? Как нам сохранить Java-объект в базу данных?

Допустим, у нас есть Java-класс Employee, описывающий сотрудника компании:


public class Employee {
    public Integer id;
    public String name;
    public String occupation;
    public Integer salary;
    public Date joinDate;  
}

Как нам сохранить объект этого класса в базу с помощью JDBC?

На самом деле ты уже знаешь все, что для этого нужно. Сначала необходимо создать таблицу в базе, которая соответствует этому классу. Например, такую:


CREATE TABLE employee {
    id INT PRIMARY KEY NOT NULL,
    name VARCHAR(100),
    occupation VARCHAR(100),
    salary INT,
    join_date DATE
}

А теперь напишем код, который добавит объект нашего класса Employee в базу:


	public static boolean addEmployee(Connection connection, Employee employee) throws Exception {
    	// Создаем и подготавливаем запрос на вставку данных в таблицу
    	String insertQuery = "INSERT INTO employee(name, occupation, salary, join_date ) VALUES (?, ?, ?, ?)";
    	PreparedStatement statement = connection.prepareStatement(insertQuery);
 
    	// Заполняем запрос данными из объекта Employee
    	statement.setString(1, employee.name);
    	statement.setString(2, employee.occupation);
    	statement.setInt(3, employee.salary);
    	statement.setDate(4, employee.joinDate);
 
    	// Выполняем наш запрос, и он возвращает true, если новая строка добавилась
    	int count = statement.executeUpdate();
    	return count > 0;
    }

Просто и понятно. Метод будет отлично работать.

Читаем Java-объект из базы

Записывать объект в базу мы научились, теперь давай напишем код, чтобы читать объект из базы. Начнем с кода, который читает объект из базы по его ID:


	public static Employee getEmployeeById(Connection connection, int id) throws Exception {
    	// Создаем и подготавливаем запрос для получения сотрудника из таблицы
    	PreparedStatement statement = connection.prepareStatement("SELECT * FROM employee WHERE id = ?");
    	statement.setInt(1, id);
    	
    	// Выполняем наш запрос, и он возвращает null, если строк в результате запроса нет
    	ResultSet results = statement.executeQuery();
    	if (!results.first())
        	return null;
 
    	// Заполняем объект Employee данными из ResultSet
    	Employee employee = new Employee();
    	employee.id = results.getInt(1);
    	employee.name = results.getString(2);
    	employee.occupation = results.getString(3);
    	employee.salary = results.getInt(4);
    	employee.joinDate = results.getDate(5);
    	return employee;
	}

А если нам нужен не один объект, а несколько? Такой запрос тоже написать просто. Давай получим всех сотрудников нашей компании:


    public static List<Employee> getAllEmployees(Connection connection) throws Exception {
    	// Создаем и выполняем запрос для получения сотрудников из таблицы
    	Statement statement = connection.createStatement();
    	ResultSet results = statement.executeQuery("SELECT * FROM employee");
 
    	ArrayList<Employee> list = new ArrayList<Employee>();
    	while (results.next()) {
            // Заполняем объект Employee данными из текущей строки ResultSet
	        Employee employee = new Employee();
	        employee.id = results.getInt(1);
	        employee.name = results.getString(2);
	        employee.occupation = results.getString(3);
	        employee.salary = results.getInt(4);
	        employee.joinDate = results.getDate(5);
 
	        list.add(employee);
    	}
    	return list;
    }

Кстати, если таких методов будет много, то в каждом из них придется писать одинаковый код по преобразованию строки ResultSet в объект Employee. Так что этот код можно вынести в отдельный метод.

Особенно это может быть полезно, если класс Employee содержит сложные поля типа Enum, InputStream, или ссылки на другие объекты, которые мы тоже хотим хранить в базе.

undefined
1
Задача
Модуль 4. Работа с БД, 8 уровень, 3 лекция
Недоступна
task0805
task0805
undefined
1
Задача
Модуль 4. Работа с БД, 8 уровень, 3 лекция
Недоступна
task0806
task0806