Автор оригинала: 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 помогает нам в написании кода, независимого от драйвера базы данных, и облегчает переключение на другие реляционные базы данных.
Загрузите проект по ссылке ниже и запустите различные сценарии для лучшего понимания.