Полный список типов данных 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 getEployeeById(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> getAllEployees(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, или ссылки на другие объекты, которые мы тоже хотим хранить в базе.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ