Java Database Connectivity ( JDBC ) — это интерфейс прикладного программирования (API) для языка программирования Java , который определяет, как клиент может получить доступ к базе данных . Это основанная на Java технология доступа к данным, используемая для подключения к базе данных Java. Она является частью платформы Java Standard Edition от Oracle Corporation . Она предоставляет методы для запроса и обновления данных в базе данных и ориентирована на реляционные базы данных . Мост JDBC- ODBC позволяет подключаться к любому источнику данных, доступному через ODBC, в среде хоста виртуальной машины Java (JVM).
Sun Microsystems выпустила JDBC как часть Java Development Kit (JDK) 1.1 19 февраля 1997 года. [1] С тех пор он является частью Java Platform, Standard Edition (Java SE).
Классы JDBC содержатся в пакете Java java.sql
и javax.sql
.
Начиная с версии 3.1, JDBC разрабатывается в рамках Java Community Process . JSR 54 определяет JDBC 3.0 (включен в J2SE 1.4), JSR 114 определяет дополнения к набору строк JDBC, а JSR 221 представляет собой спецификацию JDBC 4.0 (включена в Java SE 6). [2]
JDBC 4.1 определен в выпуске обслуживания 1 JSR 221 [3] и включен в Java SE 7. [4]
JDBC 4.2 определен в выпуске 2 JSR 221 [5] и включен в Java SE 8. [6]
Последняя версия, JDBC 4.3, указана в выпуске 3 JSR 221 [7] и включена в Java SE 9. [8]
Поскольку JDBC ('Java Database Connectivity') в основном представляет собой набор определений и спецификаций интерфейсов, он позволяет нескольким реализациям этих интерфейсов существовать и использоваться одним и тем же приложением во время выполнения. API предоставляет механизм для динамической загрузки правильных пакетов Java и их регистрации в диспетчере драйверов JDBC ( DriverManager
). DriverManager
используется как Connection
фабрика для создания соединений JDBC.
Подключения JDBC поддерживают создание и выполнение операторов. Подключения JDBC поддерживают операторы обновления, такие как SQL CREATE , INSERT , UPDATE и DELETE , или операторы запросов, такие как SELECT . Кроме того, хранимые процедуры могут быть вызваны через подключение JDBC. JDBC представляет операторы, используя один из следующих классов:
Statement
– Statement
отправляется на сервер базы данных каждый раз. Другими словами, Statement
методы выполняются с использованием операторов SQL для получения ResultSet
объекта, содержащего данные. [9]PreparedStatement
– PreparedStatement
является подинтерфейсом интерфейса Statement
. [9] Оператор кэшируется, а затем путь выполнения заранее определяется на сервере базы данных, что позволяет выполнять его несколько раз эффективным образом. [9] PreparedStatement
используется для выполнения предварительно скомпилированных операторов SQL. [ 9] Запуск предварительно скомпилированных операторов повышает эффективность и производительность выполнения операторов. PreparedStatement
Часто используется для динамических операторов, где некоторые входные параметры должны быть переданы в целевую базу данных. [10]PreparedStatement
позволяет динамическому запросу изменяться в зависимости от параметра запроса. [11]
CallableStatement
– CallableStatement
является подынтерфейсом интерфейса Statement
. [11] Он используется для выполнения хранимых процедур в базе данных. [11] [12] Для хранимых процедур в базу данных должны передаваться как входные, так и выходные параметры. [13]Операторы обновления, такие как INSERT, UPDATE и DELETE, возвращают счетчик обновлений, указывающий количество затронутых строк в базе данных в виде целого числа. [13] Эти операторы не возвращают никакой другой информации.
Операторы запроса возвращают набор результатов строк JDBC. Набор результатов строк используется для обхода набора результатов . Отдельные столбцы в строке извлекаются либо по имени, либо по номеру столбца. В наборе результатов может быть любое количество строк. Набор результатов строк имеет метаданные, которые описывают имена столбцов и их типы.
Существует расширение базового API JDBC в javax.sql
.
Подключения JDBC часто управляются через пул подключений , а не получаются напрямую от драйвера. [14]
Когда приложению Java требуется подключение к базе данных, один из DriverManager.getConnection()
методов используется для создания JDBC Connection
. Используемый URL зависит от конкретной базы данных и драйвера JDBC. Он всегда будет начинаться с протокола "jdbc:", но остальное зависит от конкретного поставщика.
Connection conn = DriverManager . getConnection ( "jdbc: somejdbcvendor: other data needed by some jdbc vendor" , "myLogin" , "myPassword" ); try { /* здесь вы используете соединение */ } finally { // Важно закрыть соединение, когда вы закончите с ним работать try { conn . close (); } catch ( Throwable e ) { /* Распространите исходное исключение вместо того, которое вы хотите только что зарегистрировать */ logger . warn ( "Could not close JDBC Connection" , e ); } }
Начиная с Java SE 7 вы можете использовать оператор Java try-with-resources для упрощения приведенного выше кода:
try ( Connection conn = DriverManager . getConnection ( "jdbc:somejdbcvendor:other data needed by some jdbc vendor" , "myLogin" , "myPassword" )) { /* здесь вы используете соединение */ } // виртуальная машина позаботится о закрытии соединения
После установления соединения Statement
можно создать.
try ( Statement stmt = conn . createStatement ()) { stmt . executeUpdate ( "INSERT INTO MyTable(name) VALUES ('my name')" ); }
Обратите внимание, что Connection
s, Statement
s и ResultSet
s часто связывают ресурсы операционной системы , такие как сокеты или файловые дескрипторы . В случае Connection
s к удаленным серверам баз данных, дополнительные ресурсы связываются на сервере, например курсоры для открытых в данный момент ResultSet
s. Это жизненно важно для close()
любого объекта JDBC, как только он сыграет свою роль; на сборку мусора не следует полагаться. Вышеуказанная конструкция try-with-resources представляет собой шаблон кода, который устраняет это.
Данные извлекаются из базы данных с помощью механизма запроса к базе данных. В примере ниже показано создание оператора и выполнение запроса.
try ( Statement stmt = conn . createStatement (); ResultSet rs = stmt . executeQuery ( "SELECT * FROM MyTable " ) ) { while ( rs . next ()) { int numColumns = rs . getMetaData (). getColumnCount (); for ( int i = 1 ; i <= numColumns ; i ++ ) { // Номера столбцов начинаются с 1. // Кроме того, существует множество методов для набора результатов, возвращающих // столбец как определенный тип. Обратитесь к документации Sun // за списком допустимых преобразований. System . out . println ( "COLUMN " + i + " = " + rs . getObject ( i )); } } }
Следующий код представляет собой пример запроса PreparedStatement
, который использует conn
класс из первого примера:
try ( PreparedStatement ps = conn . prepareStatement ( "SELECT i.*, j.* FROM Omega i, Zappa j WHERE i.name = ? AND j.num = ?" ) ) { // В подготавливаемом операторе SQL каждый вопросительный знак является заполнителем, // который необходимо заменить значением, которое вы предоставляете посредством вызова метода "set". // Следующие два вызова метода заменяют два заполнителя; первый // заменяется строковым значением, а второй - целочисленным значением. ps . setString ( 1 , "Poor Yorick" ); ps . setInt ( 2 , 8008 ); // ResultSet, rs, передает результат выполнения оператора SQL. // Каждый раз, когда вы вызываете rs.next(), внутренний указатель строки, или курсор, // перемещается на следующую строку результата. Первоначально курсор // располагается перед первой строкой. try ( ResultSet rs = ps . executeQuery ()) { while ( rs . next ()) { int numColumns = rs . getMetaData (). getColumnCount (); for ( int i = 1 ; i <= numColumns ; i ++ ) { // Номера столбцов начинаются с 1. // Кроме того, существует множество методов для набора результатов, // возвращающих столбец как определенный тип. Обратитесь к документации Sun // за списком допустимых преобразований. System . out . println ( "COLUMN " + i + " = " + rs . getObject ( i )); } // for } // while } // try } // try
Если операция базы данных завершается неудачей, JDBC выдает SQLException
. Обычно для восстановления после такой ошибки мало что можно сделать, кроме как зарегистрировать ее как можно подробнее. Рекомендуется преобразовать SQLException
в исключение домена приложения (непроверяемое), которое в конечном итоге приводит к откату транзакции и уведомлению пользователя.
Следующий код является примером транзакции базы данных :
boolean autoCommitDefault = conn.getAutoCommit ( ) ; try { conn.setAutoCommit ( false ) ; /* Здесь вы выполняете операторы для conn транзакционно */ conn.commit (); } catch ( Throwable e ) { try { conn.rollback ( ); } catch ( Throwable e ) { logger.warn ( " Не удалось откатить транзакцию" , e ) ; } throw e ; } finally { try { conn.setAutoCommit ( autoCommitDefault ) ; } catch ( Throwable e ) { logger.warn ( " Не удалось восстановить настройку AutoCommit " , e ) ; } }
Пример CallableStatement
(для вызова хранимых процедур в базе данных) см. в документации JDBC API Guide.
импорт java.sql.Connection ; импорт java.sql.DriverManager ; импорт java.sql.Statement ; открытый класс Mydb1 { статический строковый URL = "jdbc:mysql://localhost/mydb" ; public static void main ( String [] args ) { try { Class . forName ( "com.mysql.jdbc.Driver" ); Connection conn = DriverManager.getConnection ( URL , "root" , " root" ); Statement stmt = conn.createStatement (); String sql = " INSERT INTO emp1 VALUES ('pctb5361', 'kiril', 'john', 968666668)" ; stmt.executeUpdate ( sql ) ; System.out.println ( " В таблицу добавлены записи... " ) ; } catch ( Exception e ) { e.printStackTrace ( ) ; } } }
Драйверы JDBC — это клиентские адаптеры (устанавливаемые на клиентской машине, а не на сервере), которые преобразуют запросы от программ Java в протокол, понятный СУБД.
Коммерческие и бесплатные драйверы обеспечивают подключение к большинству серверов реляционных баз данных. Эти драйверы относятся к одному из следующих типов:
Обратите внимание также на тип, называемый внутренним драйвером JDBC — драйвер, встроенный с JRE в базы данных SQL с поддержкой Java. Он используется для хранимых процедур Java . Это не вписывается в схему классификации выше, хотя, скорее всего, он будет напоминать драйвер типа 2 или типа 4 (в зависимости от того, реализована ли сама база данных на Java или нет). Примером этого является драйвер KPRB (Kernel Program Bundled) [16], поставляемый с Oracle RDBMS . "jdbc:default:connection" предлагает относительно стандартный способ создания такого соединения (по крайней мере, база данных Oracle и Apache Derby поддерживают его). Однако в случае внутреннего драйвера JDBC клиент JDBC фактически работает как часть базы данных, к которой осуществляется доступ, и поэтому может получать доступ к данным напрямую, а не через сетевые протоколы.
19 февраля 1997 г. - JDK 1.1 [...] теперь доступен [...]. Этот выпуск JDK включает: [...] Новые надежные функции, включая JDBC для подключения к базам данных
Драйвер JDBC в базе данных (JDBC KPRB) [:] Код Java использует версию JDBC KPRB (Kernel Program Bundled) для доступа к SQL на том же сервере.
java.sql
Документация API Javadocjavax.sql
Документация API Javadoc