Подключение к базе данных Java ( JDBC ) - это интерфейс прикладного программирования (API) для языка программирования Java , который определяет, как клиент может получить доступ к базе данных . Это основанная на Java технология доступа к данным, используемая для подключения к базе данных Java. Это часть платформы Java Standard Edition от Oracle Corporation . Он предоставляет методы для запроса и обновления данных в базе данных и ориентирован на реляционные базы данных . Мост JDBC- ODBC позволяет подключаться к любому ODBC-доступному источнику данных в среде хоста виртуальной машины Java (JVM).
Разработчики) | Корпорация Oracle |
---|---|
Стабильный выпуск | JDBC 4.3 / 21 сентября 2017 г. |
Операционная система | Кроссплатформенность |
Тип | API доступа к данным |
Веб-сайт | Руководство по JDBC API |
История и реализация
Sun Microsystems выпустила JDBC как часть Java Development Kit (JDK) 1.1 19 февраля 1997 года. [1] С тех пор он стал частью платформы Java Standard Edition (Java SE).
Классы JDBC содержатся в пакете Java java.sql
и javax.sql
.
Начиная с версии 3.1, JDBC разрабатывался в рамках процесса сообщества Java . JSR 54 определяет JDBC 3.0 (включенный в J2SE 1.4), JSR 114 определяет дополнения JDBC Rowset, а 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») позволяет нескольким реализациям существовать и использоваться одним и тем же приложением. API предоставляет механизм для динамической загрузки правильных пакетов Java и их регистрации в диспетчере драйверов JDBC. Диспетчер драйверов используется как фабрика соединений для создания соединений JDBC.
Соединения JDBC поддерживают создание и выполнение операторов. Это могут быть операторы обновления, такие как SQL CREATE , INSERT , UPDATE и DELETE , или операторы запроса, такие как SELECT . Кроме того, хранимые процедуры могут быть вызваны через соединение JDBC. JDBC представляет операторы с использованием одного из следующих классов:
Statement
- выписка каждый раз отправляется на сервер базы данных.PreparedStatement
- оператор кэшируется, а затем путь выполнения предварительно определяется на сервере базы данных, что позволяет эффективно выполнять его несколько раз.CallableStatement
- используется для выполнения хранимых процедур в базе данных.
Операторы обновления, такие как INSERT, UPDATE и DELETE, возвращают счетчик обновлений, который указывает, сколько строк было затронуто в базе данных. Эти заявления не содержат никакой другой информации.
Операторы запроса возвращают набор результатов строки JDBC. Набор результатов строки используется для обхода набора результатов . Отдельные столбцы в строке извлекаются либо по имени, либо по номеру столбца. В наборе результатов может быть любое количество строк. В результирующем наборе строк есть метаданные, описывающие имена столбцов и их типы.
Расширение базового JDBC API есть в javax.sql
.
Соединения JDBC часто управляются через пул соединений, а не получаются напрямую от драйвера.
Тип данных Oracle | setXXX() Методы |
---|---|
СИМВОЛ | setString() |
VARCHAR2 | setString() |
НОМЕР | setBigDecimal() |
setBoolean() | |
setByte() | |
setShort() | |
setInt() | |
setLong() | |
setFloat() | |
setDouble() | |
ЦЕЛОЕ | setInt() |
ПЛАВАТЬ | setDouble() |
CLOB | setClob() |
BLOB | setBlob() |
СЫРОЙ | setBytes() |
LONGRAW | setBytes() |
ДАТА | setDate() |
setTime() | |
setTimestamp() |
Примеры
Когда приложению Java требуется соединение с базой данных, DriverManager.getConnection()
для создания соединения JDBC используется один из методов. Используемый URL-адрес зависит от конкретной базы данных и драйвера JDBC. Он всегда будет начинаться с протокола «jdbc:», а остальное зависит от конкретного поставщика.
Подключение сопп = DriverManager . getConnection ( "jdbc: somejdbcvendor: другие данные, необходимые для некоторых поставщиков jdbc" , "myLogin" , "myPassword" ); try { / * здесь вы используете соединение * / } finally { // Важно закрыть соединение, когда вы закончите с ним try { conn . закрыть (); } catch ( Throwable e ) { / * Распространение исходного исключения вместо того, которое вы хотите просто зарегистрировать * / logger . warn ( «Не удалось закрыть соединение JDBC» , e ); } }
Начиная с Java SE 7, вы можете использовать оператор Java try-with-resources, чтобы упростить приведенный выше код:
попробуйте ( Connection соед = DriverManager . GetConnection ( "JDBC: somejdbcvendor: другие данные , необходимые некоторым JDBC поставщика" , "myLogin" , "MyPassword" )) { / * вы используете соединение здесь * / } // ВМ будет заботиться закрытия связи
Как только соединение установлено, можно создать заявление.
попробуйте ( Заявление STMT = подкл . createStatement ()) { STMT . executeUpdate ( " ВСТАВИТЬ В MyTable (имя) ЗНАЧЕНИЯ ('мое имя')" ); }
Обратите внимание, что Connections, Statements и ResultSets часто связывают ресурсы операционной системы, такие как сокеты или дескрипторы файлов . В случае подключений к удаленным серверам баз данных на сервере привязываются дополнительные ресурсы, например курсоры для открытых в данный момент ResultSets. Это жизненно важно для close()
любого объекта JDBC, как только он сыграл свою роль; Не следует полагаться на сборку мусора . Вышеупомянутая конструкция try-with-resources - это шаблон кода, который устраняет это.
Данные извлекаются из базы данных с помощью механизма запросов к базе данных. В приведенном ниже примере показано создание оператора и выполнение запроса.
попробуйте ( Заявление STMT = подкл . createStatement (); ResultSet RS = STMT . ExecuteQuery ( "SELECT * FROM MyTable" ) ) { в то время как ( RS . следующая ()) { Int numColumns = RS . getMetaData (). getColumnCount (); for ( int i = 1 ; i <= numColumns ; i ++ ) { // Номера столбцов начинаются с 1. // Также есть много методов в наборе результатов для возврата // столбца как определенного типа. Обратитесь к документации Sun // за списком допустимых преобразований. Система . из . println ( "КОЛОНКА" + i + "=" + rs . getObject ( i )); } } }
Пример PreparedStatement
запроса с использованием conn
класса и из первого примера.
попробуйте ( PreparedStatement пс = подкл . prepareStatement ( "SELECT I. *, J. * FROM Omega я Заппа J ГДЕ i.name =? И j.num =?" ) ) { // В операторе SQL подготавливается, каждый вопросительный знак - это заполнитель, // который должен быть заменен значением, которое вы предоставляете через вызов метода "set". // Следующие два вызова метода заменяют два заполнителя; // первое заменяется строковым значением, а второе - целым числом. пс . setString ( 1 , «Бедный Йорик» ); пс . setInt ( 2 , 8008 ); // ResultSet, rs, передает результат выполнения оператора SQL. // Каждый раз, когда вы вызываете rs.next (), внутренний указатель строки или курсор // перемещается к следующей строке результата. Курсор изначально помещается // перед первой строкой. попробуйте ( ResultSet rs = ps . executeQuery ()) { while ( rs . next ()) { int numColumns = rs . getMetaData (). getColumnCount (); for ( int i = 1 ; i <= numColumns ; i ++ ) { // Номера столбцов начинаются с 1. // Также есть много методов в наборе результатов для возврата // столбца как определенного типа. Обратитесь к документации Sun // за списком допустимых преобразований. Система . из . println ( "КОЛОНКА" + i + "=" + rs . getObject ( i )); } // for } // while } // try } // попробуем
Если операция с базой данных завершается неудачно, JDBC создает файл SQLException
. Обычно очень мало что можно сделать для восстановления после такой ошибки, кроме как зарегистрировать ее как можно более подробно. Рекомендуется преобразовать SQLException в исключение домена приложения (непроверенное), которое в конечном итоге приведет к откату транзакции и уведомлению пользователя.
Пример транзакции базы данных :
булево autoCommitDefault = Conn . getAutoCommit (); попробуйте { соед . setAutoCommit ( ложь ); / * Здесь вы выполняете операторы против conn транзакционно * / соед . совершить (); } catch ( Throwable e ) { попробуйте { соед . откат (); } catch ( Throwable e ) { регистратор . warn ( «Не удалось откатить транзакцию» , д ); } throw e ; } наконец { попробуйте { соед . setAutoCommit ( autoCommitDefault ); } catch ( Throwable e ) { регистратор . warn ( «Не удалось восстановить настройку AutoCommit» , e ); } }
Пример CallableStatement
(для вызова хранимых процедур в базе данных) см. В документации JDBC API Guide .
import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.Statement ;открытый класс Mydb1 { статический строковый URL = "jdbc: mysql: // localhost / mydb" ; public static void main ( String [] args ) { попробуйте { Class . forName ( "com.mysql.jdbc.Driver" ); Подключение сопп = DriverManager . getConnection ( URL , «корень» , «корень» ); Заявление stmt = conn . createStatement (); String sql = "ВСТАВИТЬ В ЗНАЧЕНИЯ emp1 ('pctb5361', 'kiril', 'john', 968666668)" ; stmt . executeUpdate ( sql ); Система . из . println ( "Вставлены записи в таблицу ..." ); } catch ( исключение e ) { e . printStackTrace (); } } }
Драйверы JDBC
Драйверы JDBC - это клиентские адаптеры (установленные на клиентском компьютере, а не на сервере), которые преобразуют запросы из программ Java в протокол, понятный СУБД.
Типы
Коммерческие и бесплатные драйверы обеспечивают подключение к большинству серверов реляционных баз данных. Эти драйверы делятся на один из следующих типов:
- Тип 1, который вызывает собственный код локально доступного драйвера ODBC. (Примечание: в JDBC 4.2 мост JDBC-ODBC был удален [9] )
- Тип 2, который вызывает собственную библиотеку поставщика базы данных на стороне клиента. Затем этот код обращается к базе данных по сети.
- Тип 3 , драйвер на чистом java, который взаимодействует с промежуточным программным обеспечением на стороне сервера, которое затем обращается к базе данных.
- Тип 4 , драйвер на чистом Java, использующий собственный протокол базы данных.
Обратите внимание также на тип, называемый внутренним драйвером JDBC - драйвер, встроенный с JRE в базы данных SQL с поддержкой Java. Он используется для хранимых процедур Java . Это не вписывается в приведенную выше схему классификации, хотя, вероятно, будет напоминать драйвер типа 2 или 4 (в зависимости от того, реализована ли сама база данных на Java или нет). Примером этого является драйвер KPRB (Kernel Program Bundled) [10], поставляемый с Oracle RDBMS . "jdbc: default: connection" предлагает относительно стандартный способ создания такого соединения (по крайней мере, база данных Oracle и Apache Derby поддерживают его). Однако в случае внутреннего драйвера JDBC клиент JDBC фактически работает как часть базы данных, к которой осуществляется доступ, и поэтому может обращаться к данным напрямую, а не через сетевые протоколы.
Источники
- Oracle предоставляет список некоторых драйверов и поставщиков JDBC.
- Simba Technologies поставляет SDK для создания настраиваемых драйверов JDBC для любого настраиваемого / проприетарного источника реляционных данных.
- CData Software поставляет драйверы JDBC типа 4 для различных приложений, баз данных и веб-API. [11]
- Драйверы JDBC RSSBus Type 4 для приложений, баз данных и веб-служб [12]
- DataDirect Technologies предоставляет полный набор быстрых драйверов JDBC типа 4 для всех основных баз данных, которые они рекламируют как тип 5 [13]
- IDS Software предоставляет драйвер JDBC типа 3 для одновременного доступа ко всем основным базам данных. Поддерживаемые функции включают кеширование набора результатов, шифрование SSL, настраиваемый источник данных, dbShield.
- JDBaccess - это библиотека сохраняемости Java для MySQL и Oracle, которая определяет основные операции доступа к базе данных в удобном API над JDBC.
- JNetDirect предоставляет набор полностью сертифицированных Sun J2EE высокопроизводительных драйверов JDBC.
- JDBCR4 - это служебная программа, написанная Скоттом Клементом для обеспечения доступа к JDBC из RPG на IBM i . [14]
- HSQLDB - это СУБД с драйвером JDBC, доступная по лицензии BSD.
- SchemaCrawler [15] - это API с открытым исходным кодом, который использует JDBC и делает метаданные базы данных доступными в виде простых старых объектов Java (POJO).
Смотрите также
- Доступ к данным GNU (GDA)
- JDBCFacade
- Открытое подключение к базе данных (ODBC)
Рекомендации
- ^ "Sun Ships JDK 1.1 - включая Javabeans" . www.sun.com . Sun Microsystems . 1997-02-19. Архивировано из оригинала на 2008-02-10 . Проверено 15 февраля 2010 .
19 февраля 1997 г. - JDK 1.1 [...] теперь доступен [...].
Этот выпуск JDK включает: [...] новые надежные функции, включая JDBC для подключения к базе данных.
- ^ Версия спецификации API JDBC: 4.0 .
- ^ "Программа Java Community Process (SM) - communityprocess - mrel" . jcp.org . Проверено 22 марта 2018 .
- ^ «JDBC 4.1» . docs.oracle.com . Проверено 22 марта 2018 .
- ^ "Программа Java Community Process (SM) - communityprocess - mrel" . jcp.org . Проверено 22 марта 2018 .
- ^ «JDBC 4.2» . docs.oracle.com . Проверено 22 марта 2018 .
- ^ "Программа Java Community Process (SM) - communityprocess - mrel" . jcp.org . Проверено 22 марта 2018 .
- ^ "java.sql (Java SE 9 и JDK 9)" . docs.oracle.com . Проверено 22 марта 2018 .
- ^ «Java JDBC API» . docs.oracle.com . Проверено 22 марта 2018 .
- ^ Гринвальд, Рик; Стаковяк, Роберт; Стерн, Джонатан (1999). Oracle Essentials: Oracle Database 10g . Essentials Series (3-е изд.). Севастополь, Калифорния: O'Reilly Media, Inc. (опубликовано в 2004 г.). п. 318. ISBN 9780596005856. Проверено 3 ноября 2016 .
Драйвер JDBC в базе данных (JDBC KPRB) [:] Java-код использует версию JDBC KPRB (пакетная программа ядра) для доступа к SQL на том же сервере.
- ^ «Драйверы JDBC - Программное обеспечение CData» . Программное обеспечение CData . Проверено 22 марта 2018 .
- ^ «Драйверы JDBC - Программное обеспечение CData» . Программное обеспечение CData . Проверено 22 марта 2018 .
- ^ «Новый драйвер JDBC типа 5 - DataDirect Connect» .
- ^ «Доступ к внешним базам данных из RPG с JDBCR4 Meat of the Matter» . 28 июня 2012 . Проверено 12 апреля +2016 .
- ^ Суале Фатехи. "SchemaCrawler" . SourceForge .
Внешние ссылки
- Руководство по JDBC API В этой документации есть примеры, в которых ресурсы JDBC не закрываются должным образом (поглощение первичных исключений и возможность вызвать NullPointerExceptions) и содержат код, подверженный SQL-инъекциям [ необходима ссылка ]
java.sql
Документация API Javadocjavax.sql
Документация API Javadoc- Фреймворк O / R Broker Scala JDBC
- SqlTool Универсальная клиентская утилита JDBC с открытым исходным кодом, командной строки. Работает с любой базой данных, поддерживающей JDBC.
- Строки URL-адресов JDBC и соответствующая информация обо всех базах данных.