
Мы уже уверенно владеем Java и SQL, можем без проблем писать довольно сложные запросы к реляционным базам данных и программы. Но как же это мы могли бы делать из нашего Java приложения? Конечно же давно существует специальный для этого инструмент во всех современных языках программирования. В случае Java - это JDBC, которому мы посвятим целый небольшой курс. В первом видео более подробно разберем эту аббревиатуру и что она из себя представляет.
Ссылка для скачивания среды разработки IntelliJ IDEA (лучше выбирать Ultimate): https://www.jetbrains.com/idea/download/#section=windows
Ссылка для скачивания СУБД PostgreSQL, что будет использована в курсе: https://www.postgresql.org/download/
Ссылка для скачивания Java 15, что также будет использована в курсе: https://www.oracle.com/java/technologies/javase-jdk15-downloads.html
00:00 - Приветствие
00:39 - Что такое JDBC и для чего нужен
01:35 - Из чего состоит JDBC
02:43 - JDBC Driver
03:38 - Используемое ПО в курсе
04:15 - Основные классы из пакета java.sql.*
07:08 - Все SQL запросы - это String в Java
Как мы и обсуждали на предыдущем занятии: для подключения к любой реляционной базе данных нам лишь нужно подключить соответствующий драйвер, остальная часть будет работать одинаково и мы будем использовать те же самые классы и интерфейсы из пакета java.sql.*. На занятии разберемся откуда скачать и как подключить в нашей среде разработки Intellij IDEA без использования различных средств сборки проекта как Maven or Gradle.
00:00 - Введение
00:52 - Создание нового проекта
02:41 - Скачивание PostgreSQL драйвера
03:38 - Добавление jar в Classpath проекта
05:34 - Подключение в СУБД в IntelliJ IDEA
Мы уже прекрасно знаем тонкости подключения к базам данных на примере предыдущего курса "Реляционным базам данных. SQL". Основные параметры - это имя пользователя, его пароль и url, который в свою очередь состоит из следующих параметров: хост, порт и название базы данных, к которой мы хотим обращаться из нашего Java приложения. На занятии все подробно разберем и для примера возьмем базу данных перелетов опять же из предыдущего курса по SQL.
00:00 - Введение
00:34 - Класс DriverManager
02:48 - Класс Connection
06:22 - Метод getConnection
08:04 - Класс ConnectionManager
10:31 - Загрузка драйвера вручную
Мы довольно часто меняет параметры подключения к базам данных в зависимости от того, где мы хотим развернуть свое приложение: на локальном компьютере (local environment), на сервере для тестировщиков (qa environment), на продакшен сервере (prod environment), который уже виден всем конечным пользователям. Следовательно, мы не хотим пересобирать наше приложения для каждого environment, но в то же время хотим сделать подключение динамическим. Для этого нам и приходит на помощь обычный текстовый формат данных - properties, который мы и будем разбирать на занятии.
00:00 - Введение
00:58 - Структура Properties файлов
03:04 - Класс PropertiesUtil
07:06 - Корректировка класса ConnectionManager
08:34 - Тестирование функционала
Наконец-то мы готовы для того, чтобы сделать свой первый запрос в СУБД PostgreSQL из нашего Java приложения. Для этого мы будем разбирать один из самых базовых интерфейсов - Statement, который позволяет нам выполнять совершенно любые SQL операции и отправлять их для выполнения нашей СУБД, к которой мы уже подключились и вынесли в properties файл все настройки соединения. Но начнем мы с более простых команд - это DDL операции.
00:00 - Введение
00:53 - Интерфейс Statement
03:27 - Метод execute и DDL операции
08:06 - Резюме
Продолжаем разбираться с интерфейсом Statement. На очереди у нас уже 3 основных DML операции - это INSERT, UPDATE и DELETE. К сожалению, DML операция SELECT гораздо сложнее, чем перечисленные три, потому что нам нужно знать, как работать с результатом выборки. Поэтому мы пока умышленно опустим ее в этом занятии.
00:00 - Введение
00:50 - INSERT операция
02:48 - Выполнение нескольких SQL операций
03:27 - Метод executeUpdate
04:09 - UPDATE операция
04:54 - UPDATE и DELETE операции c RETURNING
Вот мы и добрались до самой сложной в обработке операции на стороне Java приложения - это DML операция SELECT. Рассмотрим ее на занятии более подробно, а также зачем нам новый для нас интерфейс из пакета java.sql.* - ResultSet.
00:00 - Введение
00:32 - SELECT операция и метод executeQuery
01:42 - Интерфейс ResultSet
06:29 - Как работает ResultSet
08:15 - Обновление и перемещение в ResultSet
11:59 - ResultSet можно не закрывать
Мы уже знаем как работать с результатами выборки с помощью интерфейса ResultSet. В свою очередь, мы его можем использовать и для многих-многих других операций, потому что это основной интерфейс для работы с выборкой данных из наших СУБД. Поэтому мы сможем на занятии воспользоваться им для возвращения сгенерированных первичных ключей при вставке в таблицы - это наши уже известные типы SERIAL, SMALLSERIAL and BIGSERIAL.
00:00 - Введение
00:25 - Таблицы с SERIAL полем
01:26 - Метод getGeneratedKeys
Мы уже говорили на предыдущих занятиях, что на практике интерфейс Statement не очень часто используется. Оказывается, это не только неудобно, когда у вас переменные параметры, а не просто готовый объект класса String, но и опасно, потому что можно выполнить абсолютно любую операцию (например, DROP DATABASE) совершенно случайно или, наоборот, умышленно. На занятии поговорим про такие опасные операции и что такое SQL Injection.
00:00 - Введение
00:11 - SQL запрос getTicketsByFlightId
03:13 - Метод getObject null-safe
05:01 - Примеры SQL Injections
08:09 - Резюме
Вот мы и подошли до наследника Statement - это интерфейс PreparedStatement. Он используется при создании большинства запросов в современных Java приложениях, потому что имеет тот же функционал, что и Statement (потому что все-таки является его наследником), но и имеет еще кучу своих новых методов, которые невероятно удобно использовать с изменчивыми параметрами в запросах, которых большинство на практике. Более того, он обезопашивает нас от SQL Injections, что делает его еще более востребованным. Разберем на видео как работать с PreparedStatement более подробно.
00:00 - Введение
00:13 - Интерфейс PrepareStatement
02:30 - Установка параметров через ?
05:54 - SQL запрос getFlightsBetween
10:44 - Тестирование запроса
11:56 - Резюме
Есть довольно примечательные параметры при выполнении SQL запросов, которым почему-то не уделяют внимания, но они часто являются корнем проблем, связанных с производительностью вашего Java приложения. Разберем на примере каждый из них, но в особенности - параметр FetchSize.
00:00 - Введение
00:23 - Как работает FetchSize
05:05 - Оптимальный размер FetchSize
06:10 - Как устанавливать FetchSize
07:17 - Установка timeout запроса
08:18 - Установка лимита запросов через maxRows
Мы уже давно используем среду разработки IntelliJ IDEA для того, чтобы подключаться к любой СУБД и видеть ее содержимое: базы данных, схемы, таблицы, поля таблиц, их индексы, ограничения и многое другое. Но как эту информацию получает наша IntelliJ IDEA? Для этого мы на занятии разберемся с таким понятием как метаинформация (MetaData), которую можно извлечь из нашего соединения с базой данных (интерфейс Connection).
00:00 - Введение
01:07 - Интерфейс DatabaseMetaData
03:27 - Метод getCatalogs
04:51 - Метод getSchemas
07:01 - Метод getTables
11:16 - Метод getColumns
12:21 - Резюме
На курсе по SQL мы хорошо поработали с транзакциями на практике, перед этим неплохо изучив их в теории. Теперь же нам необходимо узнать, как с ними работать со стороны нашего Java приложения, чем мы и будем заниматься в видео.
00:00 - Введение
00:26 - Что такое транзакция
01:09 - Auto commit mode by default
01:48 - Подготовка классов и методов
07:31 - Проблема auto commit mode
10:01 - Ручное управление транзакциями
14:58 - Резюме
JDBC позволяет нам выполнять не по одному SQL запросу, а сразу множество одним запросом на сервер базы данных, что уменьшает время на обмен данными между сервером, где работает наше Java приложение, и СУБД. Это дает неплохой буст в производительности, особенно если СУБД находится физически очень далеко от нашего приложения, с которого мы отправляем наши SQL запросы. На видео более детально разберемся в Batch запросах.
00:00 - Введение
00:23 - Зачем использовать Batch запросы
03:49 - Отправка Batch запроса
08:28 - Резюме
Современные СУБД позволяют нам сохранять не только примитивную информацию вроде чисел, символов и дат, но и более сложную: аудио, картинки, видео и любую другую информацию, что можно представить в видео массива байт (т.е. все что угодно можно представить в виде массива байт). Для таких целей у нас есть специальные типы данных: Blob and Clob, про которые и поговорим на занятии. К счастью, есть более лучшие способы хранить подобные большие данные, чтобы не ухудшать производительность наших СУБД, про что также затронем в данной теме.
00:00 - Введение
00:30 - Теория Blob & Clob
01:57 - Работа с типом Blob (bytea)
08:40 - Аналог Blob - тип bytea
10:01 - Считывание типа bytea
13:02 - Не стоит хранить файлы в СУБД
В современных Java приложениях очень редко закрывают соединения сразу после использования, потому что операция открытия/закрытия соединения довольно дорогостоящая и время затратное. Следовательно, используется так называемый Connection Pool (пул соединений). Про который и пойдет речь в данном видео.
00:00 - Введение
00:15 - Как работает ConnectionPool
02:30 - Внедрение ConnectionPool в ConnectionManager
08:01 - Как вернуть connection в pool
11:13 - Тестирование ConnectionPool
12:32 - Как и когда закрывать pool
Мы уже неплохо владеем JDBC и можем программно отправлять совершенно любые SQL запросы. Теперь мы должны понять практический смысл того, как JDBC используется в Java приложениях. Для этого мы разберем в теории специальный шаблон проектирования DAO (Data Access Object).
00:00 - Введение
00:46 - Паттерн проектирования DAO
03:06 - DAO класс на примере таблицы Ticket
05:31 - ORM frameworks
05:31 - ORM frameworks
06:38 - Структура Java проектов
Для понимания шаблона проектирования DAO и практического применения JDBC в Java приложениях мы начнем с самой основной части: маппинг сущностей, где будем создавать Java объект на основании таблицы из реляционной базы данных PostgreSQL.
00:00 - Введение
00:29 - Создание сущности Ticket
01:46 - Маппинг таблицы на поля в Ticket
04:40 - Вспомогательные методы в Ticket
06:32 - Создание TicketDao
07:20 - Шаблон проектирования Singleton
09:19 - Резюме
После маппинга сущности мы можем перейти к непосредственному преобразованию реляционной модели в объектно ориентированному. Начнем в первых двух операций CRUD (Create Read Update Delete) - это SQL операции DELETE and INSERT.
00:00 - Введение
00:18 - Аббревиатура CRUD
01:00 - Операция DELETE
05:26 - Операция INSERT
11:19 - Тестирование написанных методов
Продолжаем маппинг реляционной модели в объектно ориентированную на примере следующих двух операций CRUD (Create Read Update Delete) - это SQL операции UPDATE and SELECT. После чего мы будем знать, как выполнять все четыре основных операции. При необходимости мы теперь можем добавить без проблем любые другие SQL операции (чаще это различные SELECT операции) в наш DAO объект.
00:00 - Введение
00:17 - Операция UPDATE
04:40 - Операция SELECT - findById
09:38 - Тестирование методов update и findById
12:10 - Операция SELECT - findAll
15:15 - Тестирование метода findAll
В реальной практике очень часто выполняются запросы с динамической фильтрацией, когда условие WHERE заранее неизвестно и может меняться. Рассмотрим простенький пример реализации такого SELECT SQL запроса в видео, чтобы дать краткий обзор того, как это реализовывается в таких сторонних библиотеках и фреймворках как Hibernate and Querydsl.
00:00 - Введение
00:50 - Практический пример
02:45 - Шаблон проектирования DTO
03:40 - Records - новый тип классов в Java 14
04:20 - Метод findAll с LIMIT и OFFSET
07:51 - Тестирование метода findAll с LIMIT и OFFSET
08:42 - Метод findAll с фильтрацией
12:26 - Тестирование метода findAll с фильтрацией
13:38 - Querydsl
14:14 - Улучшить план выполнения и избавиться от OFFSET
Пока мы использовали простой маппинг сущности, но в таких фреймворках как Hibernate обычно используется более сложный, где внешние ключи выглядят не как обычные типы данных, а ссылка на другие сущности. На видео попробуем разобраться со всеми нюансами работы в таком случае.
00:00 - Введение
00:18 - Сложный маппинг ManyToOne
01:54 - Два варианта реализации связи ManyToOne
02:42 - Первый вариант - JOIN
04:55 - Тестирование первого варианта
07:15 - Реализация FlightDao и общего интерфейса Dao
09:55 - Второй вариант - дополнительный запрос
12:43 - Оптимизация использования ConnectionPool
15:21 - Тестирование второго варианта
15:38 - Сложный маппинг OneToMany
В заключительном видео курса JDBC мы как обычно поговорим про дальнейший путь развития нас как backend разработчиков на Java.
00:00 - Введение
00:15 - Что мы уже знаем на текущий момент
00:45 - Нужно узнать HTTP и веб серверы
01:35 - Нужно уметь тестировать код c JUnit
02:18 - Maven и Gradle
03:45 - Frameworks and tools
Для успешного прохождения курса JDBC нужно также уверенно знать Java Core (предыдущие курсы Java для начинающих Level 1 and Level 2) и одну из реляционных базы данных (SQL).
На курсе по JDBC мы познакомимся:
- с тем, как работать с реляционными базами данных из нашего Java приложения, как отправлять DDL and DML запросы
- в чем отличие классов Statement and PreparedStatement, и как с ними работать
- узнаем, что такое JDBC драйвер, как его подключать в наше Java приложение без использования инструментов сборки проекта, таких как Maven or Gradle, и зачем он вообще нужен
- познакомимся с properties файлом и зачем выносить настройки соединения с СУБД в этот текстовый формат данных
- проработаем тему транзакций, почему ни одна СУБД не может выполнять SQL запрос без них, а также что такое ACID и уровни изолированности транзакций
- узнаем тонкости настройки запросов (fetch size, batch size, timeout, etc).
- проговорим и на практике применим Connection Pool и узнаем важность его использования
- разберем такой шаблон проектирования как DAO, чтобы показать практическую ценность полученных знаний по JDBC и как его используют на практике в реальных проектах.
На всем протяжении курса будет использоваться самая лучшая и активно развивающаяся СУБД PostgreSQL, которая очень часто встречается в реальных приложениях. А также самая мощная среда разработки IntelliJ IDEA.