Jdbc driver postgresql это
В этом разделе рассматривается использование встроенного драйвера JDBC PostgreSQL. Начните с включения пути к файлу postgresql.jar в переменную CLASSPATH. Для этого можно либо задать значение переменной среды CLASSPATH, либо передавать путь в командной строке исполняемого файла при каждом запуске приложения Java. Дополнительную информацию о настройке пути к классам можно найти в инструкциях разработчика вашей виртуальной машины Java.
Далее в процессе написания приложения Java необходимо обеспечить регистрацию класса Driver в программе. При прохождении через загрузчик классов Java класс Driver автоматически регистрируется в классе DriverManager; по этим данным JDBC узнает, какой вариант класса Driver должен использоваться при подключении к базе данных определенного типа. Например, при подключении к базе данных PostgreSQL должен использоваться класс драйвера PostgreSQL и т. д.
Листинг 12.1. Поиск по имени класса.
После регистрации класса Driver наступает следующая стадия – подключение к базе данных PostgreSQL с использованием класса DriverManager. Класс DriverManager отвечает за работу с URL-адресами JDBC, выбор подходящего драйвера и его дальнейшее применение для подключения к базе данных. URL-адреса JDBC состоят из трех частей, разделенных двоеточиями:
Первая часть, jdbc, всегда остается постоянной и указывает на то, что подключение производится к источнику данных JDBC. Вторая часть, mun_dpaueepa, представляет тип базы данных, к которой вы хотите подключиться. Для подключения к базе данных PostgreSQL используется строка postgresql. Третья часть передается драйверу и используется им для поиска базы данных. Она имеет один из трех форматов:
В первом формате база данных PostgreSQL работает на локальном хосте со стандартным номером порта, а параметр база_данных определяет имя базы данных для подключения. Во втором формате задается имя хоста и имя базы данных со стандартным номером порта. Третий формат позволяет задать номер порта. Даже при использовании URL-адреса первого типа подключение JDBC всегда производится через TCP/IP.
1- Database использующийся в данной статье
В этом документе вы узнаете, как использовать Java для соединения с базой данных.Модель базы данных, используемая в этом документе - "simplehr". Вы можете просмотретьсценарии создания базы данных по ссылке:
2- Что такое JDBC?
Java Database Connectivity (JDBC) - это стандартный API для взаимодействия с реляционными базами данных. JDBC имеет набор классов и интерфейсов, которые могут использоваться для Java-приложения и разговаривать с базой данных,.- DriverManager:
- Это класс, использующийся для управления списком Driver (database drivers).
- Driver:
- Это интерфейс, использующийся для соединения коммуникации с базой данных, управления коммуникации с базой данных. Когда загружается Driver, программисту не нужно конкретно вызывать его.
- Connection:
- Интерфейс со всеми методами связи с базой данных. Он описывает коммуникационный контекст. Вся связь с базой данных осуществляется только через объект соединения (connection).
- Statement:
- Это интерфейс, включающий команду SQL отправленный в базу данных для анализа, обобщения, планирования и выполнения.
- ResultSet представляет набор записей, извлеченных из-за выполнения запроса.
3- На каком принципе подключается Java к базе данных?
Java с использует JDBC для работы с базой данных.- Например, с Oracle, класс реализующий интерфейс java.sql.Driver является oracle.jdbc.driver.OracleDriver
- Способ 1: вы предоставляете Driver управляющий этим видом базы данных, это прямой способ. Если вы используете DB oracle (или другой DB), вам нужно будет загрузить конкретную библиотеку JDBC этой BD.
- Способ 2: объявите "ODBC Datasource" и используйте мост JDBC-ODBC для соединения с этим "ODBC Datasource". Мост JDBC-ODBC доступен в JDBC API.
Вопрос для нас в том, что такое "ODBC DataSource"?
ODBC - Open Database Connectivity: Это набор открытых библиотек, которые могут подключаться практически ко всем видам различных баз данных, и это бесплатно. Предоставляется Microsoft.
ODBC DataSource: в операционной системе Windows вы можете объявить соединение ODBC с определенным видом BD. В результате у нас есть источник данных (Data Source).
В JDBC API, JDBC-ODBC Bridge (мост) был настроен так, что JDBC может работать с ODBC Data Source.
В этой статье показано, как создать пример приложения, которое использует Java и JDBC для сохранения данных в Базе данных Azure для PostgreSQL и их извлечения из нее.
JDBC — это стандартный API Java для подключения к классическим реляционным базам данных.
Предварительные условия
- Учетная запись Azure. Если у вас ее нет, получите бесплатную пробную версию. или Azure CLI Мы рекомендуем использовать Azure Cloud Shell, так вы автоматически войдете в систему и получите доступ ко всем необходимым средствам.
- Поддерживаемый пакет средств разработки Java (JDK) версии 8 (включена в Azure Cloud Shell).
- Средство сборки Apache Maven.
Подготовка среды выполнения
Мы будем использовать переменные среды, чтобы минимизировать ошибки ввода и упростить дальнейшую настройку конфигурации в соответствии с требованиями.
Настройте следующие переменные среды с помощью следующих команд.
Замените заполнители следующими значениями, которые используются в этой статье:
Чтобы создать группу ресурсов, выполните следующую команду:
Мы используем служебную программу jq , чтобы отобразить данные JSON и сделать их более удобочитаемыми. Эта программа устанавливается по умолчанию в Azure Cloud Shell. Если вам не нравится эта служебная программа, вы можете безопасно удалить | jq часть всех команд, которые мы будем использовать.
Создание экземпляра Базы данных Azure для PostgreSQL
Прежде всего мы создадим управляемый сервер PostgreSQL.
Выполните следующую команду в Azure Cloud Shell:
Эта команда создает небольшой сервер PostgreSQL.
Настройка правила брандмауэра для сервера PostgreSQL
Экземпляры Базы данных Azure для PostgreSQL по умолчанию защищены. В них включен брандмауэр, который блокирует все входящие подключения. Чтобы вы могли использовать нашу базу данных, добавьте правило брандмауэра, которое разрешит локальному IP-адресу обращаться к серверу базы данных.
Так как вы настроили локальный IP-адрес ранее, вы можете открыть брандмауэр сервера, выполнив следующую команду:
Настройка базы данных PostgreSQL
Созданный вами ранее сервер PostgreSQL пуст. На нем отсутствует база данных, которую можно использовать с приложением Java. Создайте базу данных с именем demo , выполнив следующую команду:
Создание нового проекта Java
Используя любую интегрированную среду разработки, создайте проект Java и добавьте файл pom.xml в его корневой каталог.
Этот файл в формате Apache Maven настраивает в проекте использование следующих компонентов:
- Java 8
- Последний драйвер PostgreSQL для Java
Подготовка файла конфигурации для подключения к Базе данных Azure для PostgreSQL
Создайте файл src/main/resources/application.properties и добавьте в него следующее содержимое.
- Замените две переменные $AZ_DATABASE_NAME значением, которое вы настроили ранее.
- Замените переменную $AZ_POSTGRESQL_PASSWORD значением, которое вы настроили ранее.
Мы добавляем ?ssl=true&sslmode=require к свойству конфигурации url , чтобы драйвер JDBC при соединении с базой данных использовал протокол TLS. С Базой данных Azure для PostgreSQL следует обязательно использовать TLS. Кроме того, это хорошая практика с точки зрения безопасности.
Создание файла SQL для генерации схемы базы данных
Для создания схемы базы данных мы будем использовать файл src/main/resources/ schema.sql . Создайте такой файл со следующим содержимым:
Добавление кода приложения
Подключение к базе данных
Затем добавьте код Java, который будет использовать JDBC для хранения данных на сервере PostgreSQL и их извлечения из него.
Создайте файл src/main/java/DemoApplication.java со следующим содержимым.
Этот код Java, используя ранее созданные файлы application.properties и schema.sql, подключится к серверу PostgreSQL и создаст схему для хранения данных.
Как видите, в этом файле мы закомментировали методы вставки, чтения, обновления и удаления данных. Эти методы мы создадим позже, и вы просто последовательно раскомментируете их.
Учетные данные для базы данных хранятся в свойствах user и password в файле application.properties. Эти учетные данные используются при выполнении DriverManager.getConnection(properties.getProperty("url"), properties); , так как файл свойств передается в качестве аргумента.
Теперь вы можете выполнить класс main в любом удобном инструменте.
- В любой среде IDE щелкните правой кнопкой мыши класс DemoApplication и выполните его.
- В Maven приложение можно запустить, выполнив команду mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication" .
Приложение должно подключиться к Базе данных Azure для PostgreSQL, создать схему базы данных и закрыть подключение. При этом в журналах консоли вы увидите следующий результат.
Создание доменного класса
Создайте новый класс Java Todo рядом с классом DemoApplication и добавьте следующий код:
Этот класс является доменной моделью, сопоставленной с таблицей todo , которую вы создали при выполнении скрипта schema.sql.
Вставка данных в Базу данных Azure для PostgreSQL
В файле src/main/java/demoapplication.java добавьте после метода main следующий метод, который вставляет данные в базу данных.
Теперь можно раскомментировать две следующие строки в методе main .
Теперь при запуске класса main вы увидите следующие выходные данные.
Чтение данных из Базы данных Azure для PostgreSQL
Теперь мы считаем ранее вставленные данные, чтобы проверить работу нашего кода.
В файле src/main/java/demoapplication.java добавьте после метода insertData следующий метод, который считывает данные из базы данных.
Теперь можно раскомментировать следующую строку в методе main .
Теперь при запуске класса main вы увидите следующие выходные данные.
Обновление данных в Базе данных Azure для PostgreSQL
Давайте изменим ранее вставленные данные.
В том же файле src/main/java/demoapplication.java добавьте после метода readData следующий метод, который обновляет данные в базе данных.
Теперь можно раскомментировать две следующие строки в методе main .
Теперь при запуске класса main вы увидите следующие выходные данные.
Удаление данных в Базе данных Azure для PostgreSQL
Наконец, давайте удалим ранее вставленные данные.
В том же файле src/main/java/demoapplication.java добавьте после метода updateData следующий метод, который удаляет данные из базы данных.
Теперь можно раскомментировать следующую строку в методе main .
Теперь при запуске класса main вы увидите следующие выходные данные.
Очистка ресурсов
Поздравляем! Вы создали приложение Java, которое использует JDBC для сохранения данных в Базе данных Azure для PostgreSQL и их извлечения из нее.
Чтобы очистить все ресурсы, используемые во время этого краткого руководства, удалите группу ресурсов с помощью следующей команды:
В современном мире без хранения данных никак. И история работы с базами данных началась уже очень давно, с появления JDBC. Предлагаю вспомнить то, без чего не обходися ни один современный фрэймворк, построенный поверх JDBC. Кроме того, даже работая с ними временами может понадобится возможность "вернуться к корням". Надеюсь, обзор поможет как вступительное слово или поможет что-то освежить в памяти.
Вступление
Одна из основных целей языка программирования - хранение и обработка информации. Чтобы лучше понять работу хранения данных стоит немного времени выделить на теорию и архитектуру приложений. Например, можно ознакомиться с литературой, а именно с книгой "Software Architect's Handbook: Become a successful software architect by implementing effective arch. " авторства Joseph Ingeno. Как сказано, есть некий Data Tier или "Слой данных". Он включает в себя место хранения данных (например, SQL базу данных) и средства для работы с хранилищем данных (например, JDBC, о котором и пойдёт речь). Так же на сайте Microsoft есть статья: "Проектирование уровня сохраняемости инфраструктуры" в которой описывается архитектурное решение выделения из Data Tier дополнительного слоя — Persistence Layer. В таком случае Data Tier — это уровень хранения самих данных, в то время как Persistence Layer - это некоторый уровень абстракции для работы с данными из хранилища с уровня Data Tier. К уровню Persistence Layer можно отнести шаблон "DAO" или различные ORM. Но ORM — это тема отдельного разговора. Как Вы могли уже понять, вначале появился Data Tier. Ещё с времён JDK 1.1 в Java мире появился JDBC (Java DataBase Connectivity — соединение с базами данных на Java). Это стандарт взаимодействия Java-приложений с различными СУБД, реализованный в виде пакетов java.sql и javax.sql, входящих в состав Java SE:
Данный стандарт описан специфкицией "JSR 221 JDBC 4.1 API". Данная спецификация рассказывает нам о том, что JDBC API предоставляет программный доступ к реляционным базам данных из программ, написанных на Java. Так же рассказывает о том, что JDBC API является частью платформы Java и входит поэтому в Java SE и Java EE. JDBC API представлен двумя пакетами: java.sql and javax.sql. Давайте тогда с ними и познакомимся.
Начало работы
Чтобы понять что такое вообще JDBC API нам понадобится Java приложение. Удобнее всего воспользоваться одной из систем сборки проектов. Например, воспользуемся Gradle. Более подробно про Gradle можно прочитать в небольшом обзоре: "Краткое знакомство с Gradle". Для начала инициализируем новый Gradle проект. Так как функциональность Gradle реализуется через плагины, то для инициализации нам нужно воспользоваться "Gradle Build Init Plugin": Откроем после этого билд скрипт — файл build.gradle, где описывается наш проект и то, как с ним нужно работать. Нас интересует блок "dependencies", где описываются зависимости — то есть те библиотеки/фрэймворки/api, без которых мы не можем работать и от которых мы зависим. По умолчанию мы увидим что-то вроде: Почему мы тут это видим? Это зависимости нашего проекта, которые нам сгенерировал автоматически Gradle при создании проекта. А так же потому что guava - это отдельная библиотека, не входящая в комплект с Java SE. JUnit так же не входит в комплект с Java SE. Но JDBC у нас есть "из коробки", то есть входит в состав Java SE. Получается JDBC у нас есть. Отлично. Что же нам ещё надо? Есть такая замечательная схема:
Как мы видим, и это логично, база данных является внешним компонентом, которого нет изначально в Java SE. Это объясняется просто - существует огромное количество баз данных и работать вы можете захотеть с любой. Например, есть PostgreSQL, Oracle, MySQL, H2. Каждая из этих баз данных поставляется отдельной компанией, которые называются поставщиками баз данных или database vendors. Каждая база данных написана на каком-то своём языке программирования (не обязательно Java). Чтобы с базой данных можно было работать из Java приложения поставщик базы данных пишет особый драйвер, который является своего образа адаптером. Такие JDBC совместимые (то есть у которых есть JDBC драйвер) ещё называют "JDBC-Compliant Database". Тут можно провести аналогию с компьютерными устройствами. Например, в блокноте есть кнопка "Печать". Каждый раз когда вы её нажимаете программа сообщает операционной системе, что приложение блокнот хочет напечатать. И у Вас есть принтер. Чтобы научить разговаривать единообразно вашу операционную систему с принтером Canon или HP понадобятся разные драйверы. Но для Вас, как пользователя, ничего не изменится. Вы по прежнему будете нажимать одну и ту же кнопку. Так и с JDBC. Вы выполняете один и тот же код, просто "под капотом" могут работать разные базы данных. Думаю, тут очень понятный подход. Каждый такой JDBC драйвер — это некоторый артефакт, библиотека, jar файл. Он то и является зависимостью для нашего проекта. Например, мы можем выбрать базу данных "H2 Database" и тогда нам надо добавить зависимость следующим образом: То, как найти зависимость и как её описать указано на официальных сайтах поставщика БД или на "Maven Central". JDBC драйвер не является базой данных, как Вы поняли. А лишь является проводником к ней. Но есть такое понятие, как "In memory databases". Это такие базы данных, которые существуют в памяти на время жизни вашего приложения. Обычно, это часто используют для тестирования или для учебных целей. Это позволяет не ставить отдельный сервер баз данных на машине. Что нам очень даже подойдёт для знакомств с JDBC. Вот и готова наша песочница и мы приступаем.
Connection
- Через DriverManager
- Через DataSource
Statements
- Statement: SQL выражение, которое не содержит параметров
- PreparedStatement : Подготовленное SQL выражение, содержащее входные параметры
- CallableStatement : SQL выражение с возможностью получить возвращаемое значение из хранимых процедур (SQL Stored Procedures).
ResultSet
Понятие ResultSet описано в спецификации JDBC API в главе "CHAPTER 15 Result Sets". Прежде всего, там сказано, что ResultSet предоставляет методы для получения и манипуляции результатами выполненных запросов. То есть если метод execute вернул нам true, значит мы можем получить и ResultSet. Давайте вынесем вызов метода createCustomerTable() в метод init, который отмечен как @Before. Теперь доработаем наш тест shouldSelectData: Тут стоит отметить, что next — это метод, который двигает так называемый "курсор". Курсор в ResultSet указывает на некоторую строку. Таким образом, чтобы считать строку, на неё нужно этот самый курсор установить. Когда курсор перемещается, то метод перемещения курсора возвращает true, если курсор валидный (правильный, корректный), то есть указывает на данные. Если возвращает false, значит данных нет, то есть курсор не указывает на данные. Если попытаться получить данные с невалидным курсором, то мы получим ошибку: No data is available Ещё интересно, что через ResultSet можно обновлять или даже вставлять строки:
RowSet
JDBC помимо ResultSet вводит такое понятие, как RowSet. Подробнее можно прочитать здесь: "JDBC Basics: Using RowSet Objects". Существуют различные вариации использования. Например, самый простой случай может выглядеть так: Как видно, RowSet похож на симбиоз statement (мы указали через него command) и выполнили command. Через него же мы управляем курсором (вызывая метод next) и из него же получаем данные. Интересен не только такой подход, но и возможные реализации. Например, CachedRowSet. Он является "отключённым" (то есть не использует постоянное подключение к БД) и требует явного выполнения синхронизации с БД: Подробнее можно прочитать в tutorial на сайте Oracle: "Using CachedRowSetObjects".
Metadata
Кроме запросов, подключение к БД (т.е. экземпляр класса Connection) предоставляет доступ к метаданным - данным о том, как настроена и как устроена наша база данных. Но для начала озвучим несколько ключевых моментов: URL подключения к нашей БД: "jdbc:h2:mem:test". test - это название нашей базы данных. Для JDBC API это каталог. И название будет в верхнем регистре, то есть TEST. Схема по умолчанию (Default schema) для H2 - PUBLIC. Теперь, напишем тест, который показывает все пользовательские таблицы. Почему пользовательские? Потому что в базах данных есть не только пользовательские (те, которые мы сами создали при помощи create table выражений), но и системные таблицы. Они необходимы, чтобы хранить системную информацию о структуре БД. У каждой БД такие системные таблицы могут храниться по-разному. Например, в H2 они хранятся в схеме "INFORMATION_SCHEMA". Интересно, что INFORMATION SCHEMA является общим подходом, но Oracle пошли иным путём. Подробнее можно прочитать здесь: "INFORMATION_SCHEMA и Oracle". Напишем тест, получающий метаданные по пользовательским таблицам:
Пул подключений
Пулу подключений в спецификации JDBC отведен раздел "Chapter 11 Connection Pooling". В нём же и даётся главное обоснование необходимости пула подключений. Каждый Coonection - это физическое подключение к БД. Его создание и закрытие - довольно "дорогая" работа. JDBC предоставляет лишь API для пула соединений. Поэтому, выбор реализации остаётся за нами. Например, к таким реализациям относится HikariCP. Соответственно, нам понадобится добавить пул к нам в зависимости проекта: Теперь надо как-то пул этот задействовать. Для этого нужно выполнить инициализацию источника данных, он же Datasource: И напишем тест на получение подключения из пула:
Читайте также: