Автор оригинала: Pankaj Kumar.
Добро пожаловать в пример JDBC. Подключение к базе данных Java или API JDBC обеспечивает стандартное и независимое от базы данных подключение между приложениями Java и серверами реляционных баз данных. Точно так же, как программы java, которые мы можем “написать один раз и запустить везде”, JDBC предоставляет платформу для подключения к реляционным базам данных из программ java.
Пример JDBC
API JDBC используется для решения следующих задач:
- Установление соединения с серверами реляционных баз данных, такими как Oracle, MySQL и т.д. API JDBC не предоставляет платформу для подключения к базам данных NoSQL, таким как MongoDB.
- Отправляйте SQL-запросы к соединению, которое будет выполняться на сервере базы данных.
- Обработайте результаты, возвращенные при выполнении запроса.
Мы рассмотрим пример JDBC MySQL, а также пример JDBC Oracle. Мы прочитаем конфигурацию базы данных из файла свойств, чтобы сделать наш код слабо связанным с драйверами базы данных.
Драйвер JDBC
API JDBC состоит из двух частей – первая часть-это API JDBC, который будет использоваться программистами приложений. Вторая часть-это низкоуровневый API для подключения к серверу базы данных. Первая часть API JDBC является частью стандартных пакетов java в java.sql
пакете.
Для второй части существует четыре различных типа драйверов JDBC:
- JDBC-мост ODBC плюс драйвер ODBC (Тип 1): Этот драйвер использует драйвер ODBC для подключения к серверам баз данных. У нас должны быть драйверы ODBC, установленные на машинах, с которых мы хотим подключиться к базе данных, поэтому этот драйвер почти устарел и должен использоваться только тогда, когда другие опции недоступны.
- Собственный API частично драйвер с поддержкой технологии Java (Тип 2): Этот тип драйвера преобразует класс JDBC в клиентский API для серверов СУБД. У нас должен быть установлен API клиента базы данных на компьютере, с которого мы хотим установить соединение с базой данных. Из-за дополнительной зависимости от драйверов API клиента базы данных это также не является предпочтительным драйвером.
- Чистый драйвер Java для промежуточного программного обеспечения базы данных (Тип 3): Этот тип драйвера отправляет вызовы JDBC на сервер промежуточного программного обеспечения, который может подключаться к базам данных другого типа. У нас должен быть установлен сервер промежуточного программного обеспечения для работы с такого рода драйверами. Это увеличивает количество дополнительных сетевых вызовов и снижает производительность. Следовательно, это также не широко используемый драйвер JDBC.
- Драйвер Java с прямым подключением к базе данных (тип 4): Это предпочтительный драйвер, поскольку он преобразует вызовы JDBC в сетевой протокол, понятный серверу баз данных. Это решение не требует каких-либо дополнительных API на стороне клиента и подходит для подключения к базе данных по сети. Однако для этого решения мы должны использовать драйверы для конкретных баз данных, например банки OJDBC, предоставляемые Oracle для Oracle DB и MySQL Connector/J для баз данных MySQL.
Давайте создадим простой пример проекта JDBC и посмотрим, как API JDBC помогает нам в написании слабо связанного кода для подключения к базе данных.
Прежде чем начать с примера jdbc, нам нужно выполнить некоторую подготовительную работу, чтобы получить некоторые данные на серверах баз данных для запроса.
Установка серверов баз данных не входит в рамки этого руководства, поэтому я буду считать, что у вас установлены серверы баз данных.
Мы напишем программу для подключения к серверу базы данных, выполним простой запрос jdbc и обработаем результаты. Чтобы показать, как мы можем добиться слабой связи при подключении к базам данных с помощью API JDBC, я буду использовать системы баз данных Oracle и MySQL.
Запустите приведенные ниже сценарии SQL, чтобы создать таблицу и вставить в нее некоторые фиктивные значения.
--mysql create table create table Users( id int(3) primary key, name varchar(20), email varchar(20), country varchar(20), password varchar(20) ); --oracle create table create table Users( id number(3) primary key, name varchar2(20), email varchar2(20), country varchar2(20), password varchar2(20) ); --insert rows INSERT INTO Users (id, name, email, country, password) VALUES (1, 'Pankaj', 'pankaj@apple.com', 'India', 'pankaj123'); INSERT INTO Users (id, name, email, country, password) VALUES (4, 'David', 'david@gmail.com', 'USA', 'david123'); INSERT INTO Users (id, name, email, country, password) VALUES (5, 'Raman', 'raman@google.com', 'UK', 'raman123'); commit;
Обратите внимание, что типы данных в базах данных Oracle и MySQL различны, поэтому я предоставил два разных запроса SQL DDL для создания таблицы пользователей. Однако обе базы данных соответствуют языку SQL, поэтому запросы на вставку одинаковы для обеих таблиц базы данных.
Пример JDBC – Драйверы баз данных
Как вы можете видеть на изображении проекта, у меня есть оба MySQL (mysql-connector-java-5.0.5.jar) и Оракул (ojdbc6-11.2.0.1.0.jar) введите 4 драйвера в каталог библиотеки и добавьте их в путь сборки проекта. Убедитесь, что вы используете правильную версию драйверов Java в соответствии с версией установки сервера базы данных. Обычно эти банки поставляются вместе с установщиком, поэтому вы можете найти их в установочном пакете. Если у вас есть приложение на основе maven, вы также можете использовать приведенные ниже зависимости.
mysql mysql-connector-java 5.0.5 com.oracle ojdbc6 11.2.0.1.0
Файл свойств конфигурации базы данных JDBC
Мы прочитаем сведения о конфигурации базы данных из файлов свойств. Это поможет нам легко переключиться с Oracle на базу данных MySQL и наоборот. Все, что нам нужно, – это изменить сведения о собственности.
#mysql DB properties #DB_DRIVER_CLASS=com.mysql.jdbc.Driver #DB_URL=jdbc:mysql://localhost:3306/UserDB #DB_USERNAME=pankaj #DB_PASSWORD=pankaj123 #Oracle DB Properties DB_DRIVER_CLASS=oracle.jdbc.driver.OracleDriver DB_URL=jdbc:oracle:thin:@localhost:1571:MyDBSID DB_USERNAME=scott DB_PASSWORD=tiger
Конфигурации базы данных являются наиболее важными деталями при использовании API JDBC. Первое, что мы должны знать, – это класс драйвера для использования. Для базы данных Oracle классом драйвера является oracle.jdbc.driver.Оракул-река
. Для базы данных MySQL класс драйвера – com.mysql.jdbc.Driver
. Вы найдете эти классы драйверов в соответствующих файлах jar драйверов. Оба они реализуют интерфейс JDBC java.sql.Driver
.
Вторая важная часть-это строка URL-адреса подключения к базе данных. У каждого драйвера базы данных есть свой собственный способ настройки URL-адреса базы данных, но все они содержат сведения о хосте, порту и схеме в URL-адресе подключения.
Формат строки подключения к базе данных MySQL: jdbc:mysql://<ХОСТ>:<ПОРТ>/<СХЕМА>
.
Формат строки подключения к базе данных Oracle: jdbc:oracle:тонкий:@<ХОСТ>:<ПОРТ>:
.
Другие важные сведения-это имя пользователя и пароль базы данных, которые будут использоваться для подключения к серверу базы данных.
Пример программы JDBC
Давайте рассмотрим простой пример программы jdbc, чтобы увидеть, как мы можем прочитать вышеуказанные свойства и создать соединение с базой данных.
package com.journaldev.jdbc; import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class DBConnection { public static Connection getConnection() { Properties props = new Properties(); FileInputStream fis = null; Connection con = null; try { fis = new FileInputStream("db.properties"); props.load(fis); // load the Driver Class Class.forName(props.getProperty("DB_DRIVER_CLASS")); // create the connection now con = DriverManager.getConnection(props.getProperty("DB_URL"), props.getProperty("DB_USERNAME"), props.getProperty("DB_PASSWORD")); } catch (IOException | ClassNotFoundException | SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return con; } }
Приведенный выше пример программы jdbc действительно прост. Сначала мы считываем сведения о конфигурации базы данных из файла свойств, а затем загружаем драйвер JDBC и используем DriverManager для создания соединения. Обратите внимание, что в этом коде используются только классы API Java JDBC, и невозможно узнать, к какому типу базы данных он подключается. Это также отличный пример написания кода для интерфейсов методологии.
Важным кодом, на который следует обратить внимание, является вызов метода Class.forName ()
, это Отражение Java метод для создания экземпляра данного класса. Вы можете задаться вопросом, почему мы используем отражение, а не новый
оператор для создания объекта, и почему мы просто создаем объект, а не используем его.
Первая причина заключается в том, что использование отражения для создания экземпляра помогает нам в написании слабо связанного кода, которого мы не можем достичь, если используем новый оператор. В этом случае мы не смогли бы переключиться на другую базу данных без внесения соответствующих изменений в код.
Причина отказа от использования объекта заключается в том, что мы не заинтересованы в его создании. Основной мотив-загрузить класс в память, чтобы класс драйвера мог зарегистрироваться в диспетчере драйверов. Если вы изучите реализацию классов драйверов, вы обнаружите, что у них есть статический блок, в котором они регистрируются в DriverManager.
oracle.jdbc.драйвер.OracleDriver.java
фрагмент:
static { try { if (defaultDriver == null) { defaultDriver = new oracle.jdbc.OracleDriver(); DriverManager.registerDriver(defaultDriver); } //some code omitted for clarity } }
com.mysql.jdbc.Driver.java
фрагмент:
static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } }
Это отличный пример того, как мы делаем наш код слабо связанным с использованием API отражения. Таким образом, в основном мы выполняем следующие действия, используя вызов метода Class.forName ().
Driver driver = new OracleDriver(); DriverManager.registerDriver(driver);
Метод DriverManager.getConnection() использует зарегистрированные драйверы JDBC для создания подключения к базе данных. Этот метод вызывает java.sql.SQLException
, если есть какие-либо проблемы с подключением к базе данных.
Теперь давайте напишем простой пример тестовой программы jdbc для использования подключения к базе данных и выполним простой запрос.
Заявление JDBC и набор результатов
Вот простой пример программы jdbc, в которой мы используем соединение JDBC для выполнения SQL-запроса к базе данных, а затем обработки результирующего набора.
package com.journaldev.jdbc; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBConnectionTest { private static final String QUERY = "select id,name,email,country,password from Users"; public static void main(String[] args) { //using try-with-resources to avoid closing resources (boiler plate code) try(Connection con = DBConnection.getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(QUERY)) { while(rs.next()){ int id = rs.getInt("id"); String name = rs.getString("name"); String email = rs.getString("email"); String country = rs.getString("country"); String password = rs.getString("password"); System.out.println(id + "," +name+ "," +email+ "," +country+ "," +password); } } catch (SQLException e) { e.printStackTrace(); } } }
Обратите внимание, что мы используем функцию Java 7 try-with-resources, чтобы убедиться, что ресурсы будут закрыты, как только мы выйдем из блока try-catch.
Соединение JDBC, инструкция и набор результатов являются дорогостоящими ресурсами, и мы должны закрыть их, как только закончим их использовать.
Connection.createStatement()
используется для создания объекта оператора, а затем ExecuteQuery()
метод используется для выполнения запроса и получения объекта набора результатов.
Первый вызов набора результатов следующий()
вызов метода перемещает курсор в первую строку, а последующие вызовы перемещают курсор в следующие строки в наборе результатов. Если строк больше нет, то он возвращает значение false и выходит из цикла while. Мы используем метод результирующего набора getXXX()
для получения значений столбцов, а затем записываем их в консоль.
Когда мы запускаем приведенный выше пример тестовой программы jdbc, мы получаем следующий вывод.
1,Pankaj,pankaj@apple.com,India,pankaj123 4,David,david@gmail.com,USA,david123 5,Raman,raman@google.com,UK,raman123
Просто раскомментируйте свойства конфигурации базы данных MySQL из файла db.properties и прокомментируйте детали конфигурации базы данных Oracle, чтобы переключиться на базу данных MySQL. Поскольку данные одинаковы как в таблице пользователей базы данных Oracle, так и в таблице пользователей базы данных MySQL, вы получите один и тот же результат.
Это все для примера JDBC. Вы можете видеть, что API JDBC помогает нам в написании кода, независимого от драйвера базы данных, и облегчает переключение на другие реляционные базы данных.
Загрузите проект по ссылке ниже и запустите различные сценарии для лучшего понимания.