stringtranslate.com

Подключение к базе данных Java

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 представляет операторы, используя один из следующих классов:

PreparedStatementпозволяет динамическому запросу изменяться в зависимости от параметра запроса. [11]

Операторы обновления, такие как 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')" ); }      

Обратите внимание, что Connections, Statements и ResultSets часто связывают ресурсы операционной системы , такие как сокеты или файловые дескрипторы . В случае Connections к удаленным серверам баз данных, дополнительные ресурсы связываются на сервере, например курсоры для открытых в данный момент ResultSets. Это жизненно важно для 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

Драйверы 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 фактически работает как часть базы данных, к которой осуществляется доступ, и поэтому может получать доступ к данным напрямую, а не через сетевые протоколы.

Источники

Смотрите также

Цитаты

  1. ^ ab "Sun Ships JDK 1.1 -- Javabeans Included". www.sun.com . Sun Microsystems . 1997-02-19. Архивировано из оригинала 2008-02-10 . Получено 2010-02-15 . 19 февраля 1997 г. - JDK 1.1 [...] теперь доступен [...]. Этот выпуск JDK включает: [...] Новые надежные функции, включая JDBC для подключения к базам данных
  2. ^ Версия спецификации API JDBC: 4.0.
  3. ^ "Программа Java Community Process(SM) - communityprocess - mrel". jcp.org . Получено 22 марта 2018 г. .
  4. ^ "JDBC 4.1". docs.oracle.com . Получено 22 марта 2018 г. .
  5. ^ "Программа Java Community Process(SM) - communityprocess - mrel". jcp.org . Получено 22 марта 2018 г. .
  6. ^ "JDBC 4.2". docs.oracle.com . Получено 22 марта 2018 г. .
  7. ^ "Программа Java Community Process(SM) - communityprocess - mrel". jcp.org . Получено 22 марта 2018 г. .
  8. ^ "java.sql (Java SE 9 и JDK 9)". docs.oracle.com . Получено 22 марта 2018 г. .
  9. ^ abcd Bai 2022, стр. 74.
  10. ^ Бай 2022, стр. 122–124, §4.2.3.5 Подробнее о методах казни.
  11. ^ abc Bai 2022, стр. 72–74, §3.2 Компоненты и архитектура JDBC.
  12. ^ Хорстманн 2022, §5.5.3 Экранирования SQL.
  13. ^ ab Bai 2022, стр. 122–124, §4.2.3.5 Компоненты и архитектура JDBC.
  14. ^ Бай 2022, стр. 83, §3.5.1 Источник данных JDBC.
  15. ^ "Java JDBC API". docs.oracle.com . Получено 22 марта 2018 г. .
  16. ^ Гринвальд, Рик; Стаковяк, Роберт; Стерн, Джонатан (1999). Oracle Essentials: Oracle Database 10g. Essentials Series (3-е изд.). Севастополь, Калифорния: O'Reilly Media, Inc. (опубликовано в 2004 г.). стр. 318. ISBN 9780596005856. Получено 2016-11-03 . Драйвер JDBC в базе данных (JDBC KPRB) [:] Код Java использует версию JDBC KPRB (Kernel Program Bundled) для доступа к SQL на том же сервере.
  17. ^ "Драйверы JDBC - Программное обеспечение CData". Программное обеспечение CData . Получено 22 марта 2018 г. .
  18. ^ "JDBC Drivers - CData Software". CData Software . Архивировано из оригинала 22 декабря 2015 г. Получено 22 марта 2018 г.
  19. ^ «Новый драйвер JDBC типа 5 — DataDirect Connect».
  20. ^ "Доступ к внешним базам данных из RPG с помощью JDBCR4 Meat of the Matter". 28 июня 2012 г. Получено 12 апреля 2016 г.
  21. ^ Суалех Фатехи. "SchemaCrawler". GitHub .

Ссылки

Внешние ссылки