Подключение к базе данных Java
Java Database Connectivity ( JDBC ) — это интерфейс прикладного программирования (API) для языка программирования Java , который определяет, как клиент может получить доступ к базе данных . Это технология доступа к данным на основе Java, используемая для подключения к базе данных Java. Это часть платформы Java Standard Edition от Oracle Corporation . Он предоставляет методы запроса и обновления данных в базе данных и ориентирован на реляционные базы данных . Мост JDBC- ODBC позволяет подключаться к любому источнику данных, доступному через ODBC, в среде хоста виртуальной машины Java (JVM).
Разработчик(и) | Корпорация Oracle |
---|---|
Стабильная версия | JDBC 4.3
/ 21 сентября 2017 г. |
Операционная система | Кросс-платформенный |
Тип | API доступа к данным |
Веб-сайт | Руководство по API JDBC |
и реализация История
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, а 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-версия | Тип выпуска | Дата выпуска |
---|---|---|---|
1.1 | JDK 1.1 | Основной | 1997-02-19. [1] |
3.0 | J2SE 1.4 | Основной | 2002-05-09 |
4.0 | Ява ЮВ 6 | Основной | 2006-12-11 |
4.1 | Ява ЮВ 7 | Обслуживание | 2011-10-13 |
4.2 | Ява ЮВ 8 | Обслуживание | 2014-03-04 |
4.3 | Ява ЮВ 9 | Обслуживание | 2017-09-21 |
Функциональность [ править ]
Тип данных Oracle | setXXX() Методы
|
---|---|
ЧАР | setString()
|
ВАРЧАР2 | setString()
|
ЧИСЛО | setBigDecimal()
|
setBoolean()
| |
setByte()
| |
setShort()
| |
setInt()
| |
setLong()
| |
setFloat()
| |
setDouble()
| |
ЦЕЛОЕ ЧИСЛО | setInt()
|
ПЛАВАТЬ | setDouble()
|
КЛОБ | setClob()
|
BLOB-объект | setBlob()
|
СЫРОЙ | setBytes()
|
ЛОНГРО | setBytes()
|
ДАТА | setDate()
|
setTime()
| |
setTimestamp()
|
Поскольку JDBC («Подключение к базе данных Java») представляет собой в основном набор определений и спецификаций интерфейсов, он позволяет существовать нескольким реализациям этих интерфейсов и использоваться одним и тем же приложением во время выполнения. 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 {
/* you use the connection here */
} finally {
//It's important to close the connection when you are done with it
try {
conn.close();
} catch (Throwable e) { /* Propagate the original exception
instead of this one that you want just logged */
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")) {
/* you use the connection here */
} // the VM will take care of closing the connection
Как только соединение будет установлено, Statement
можно создать.
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate("INSERT INTO MyTable(name) VALUES ('my name')");
}
Обратите внимание, что Connection
с, Statement
песок ResultSet
Они часто связывают ресурсы операционной системы, такие как сокеты или файловые дескрипторы . В случае Connection
s к удаленным серверам баз данных, на сервере привязываются дополнительные ресурсы, например, курсоры для открытых в данный момент ResultSet
с.
Очень важно 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++) {
// Column numbers start at 1.
// Also, there are many methods on the result set to return
// the column as a particular type. Refer to the Sun documentation
// for the list of valid conversions.
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 = ?")
) {
// In the SQL statement being prepared, each question mark is a placeholder
// that must be replaced with a value you provide through a "set" method invocation.
// The following two method calls replace the two placeholders; the first is
// replaced by a string value, and the second by an integer value.
ps.setString(1, "Poor Yorick");
ps.setInt(2, 8008);
// The ResultSet, rs, conveys the result of executing the SQL statement.
// Each time you call rs.next(), an internal row pointer, or cursor,
// is advanced to the next row of the result. The cursor initially is
// positioned before the first row.
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int numColumns = rs.getMetaData().getColumnCount();
for (int i = 1; i <= numColumns; i++) {
// Column numbers start at 1.
// Also, there are many methods on the result set to return
// the column as a particular type. Refer to the Sun documentation
// for the list of valid conversions.
System.out.println("COLUMN " + i + " = " + rs.getObject(i));
} // for
} // while
} // try
} // try
Если операция с базой данных завершается неудачно, JDBC выдает ошибку. SQLException
. Обычно мало что можно сделать, чтобы исправить такую ошибку, кроме как записать ее в журнал с максимально подробным описанием. Рекомендуется, чтобы SQLException
быть преобразовано в исключение домена приложения (непроверяемое), что в конечном итоге приводит к откату транзакции и уведомлению пользователя.
Следующий код является примером транзакции базы данных :
boolean autoCommitDefault = conn.getAutoCommit();
try {
conn.setAutoCommit(false);
/* You execute statements against conn here transactionally */
conn.commit();
} catch (Throwable e) {
try { conn.rollback(); } catch (Throwable e) { logger.warn("Could not rollback transaction", e); }
throw e;
} finally {
try { conn.setAutoCommit(autoCommitDefault); } catch (Throwable e) { logger.warn("Could not restore AutoCommit setting",e); }
}
Для примера CallableStatement
(для вызова хранимых процедур в базе данных) см. документацию JDBC API Guide .
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Mydb1 {
static String 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("Inserted records into the table...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Драйверы JDBC [ править ]
на стороне клиента Драйверы JDBC — это адаптеры (устанавливаемые на клиентском компьютере, а не на сервере), которые преобразуют запросы от программ Java в протокол, понятный СУБД.
Типы [ править ]
Коммерческие и бесплатные драйверы обеспечивают подключение к большинству серверов реляционных баз данных. Эти драйверы относятся к одному из следующих типов:
- Введите 1 , который вызывает собственный код локально доступного драйвера ODBC. (Примечание. В JDBC 4.2 мост JDBC-ODBC был удален. [15] )
- Тип 2 , который вызывает собственную библиотеку поставщика базы данных на стороне клиента. Затем этот код обращается к базе данных по сети.
- Тип 3 — драйвер чистой Java, который взаимодействует с промежуточным программным обеспечением на стороне сервера, которое затем взаимодействует с базой данных.
- Тип 4 — драйвер чистой Java, использующий собственный протокол базы данных.
Обратите также внимание на тип, называемый внутренним драйвером JDBC — драйвер, встроенный в JRE в базы данных SQL с поддержкой Java. Он используется для хранимых процедур Java . Это не вписывается в приведенную выше схему классификации, хотя, скорее всего, будет напоминать драйвер либо типа 2, либо типа 4 (в зависимости от того, реализована ли сама база данных на Java или нет). Примером этого является драйвер KPRB (Kernel Program Bundled). [16] поставляется с СУБД Oracle . «jdbc:default:connection» предлагает относительно стандартный способ создания такого соединения (по крайней мере, база данных Oracle и Apache Derby поддерживают его). Однако в случае внутреннего драйвера JDBC клиент JDBC фактически работает как часть базы данных, к которой осуществляется доступ, и поэтому может обращаться к данным напрямую, а не через сетевые протоколы.
Источники [ править ]
- Oracle предоставляет список некоторых драйверов и поставщиков JDBC.
- Simba Technologies поставляет SDK для создания пользовательских драйверов JDBC для любого пользовательского/собственного реляционного источника данных.
- CData Software поставляет драйверы JDBC типа 4 для различных приложений, баз данных и веб-API. [17]
- Драйверы JDBC RSSBus Type 4 для приложений, баз данных и веб-сервисов [18]
- DataDirect Technologies предоставляет полный набор быстрых драйверов JDBC типа 4 для всех основных баз данных, которые они рекламируют как типа 5. [19]
- Программное обеспечение IDS предоставляет драйвер JDBC типа 3 для одновременного доступа ко всем основным базам данных. Поддерживаемые функции включают кэширование набора результатов, SSL-шифрование, собственный источник данных, dbShield.
- JDBaccess — это библиотека персистентности Java для MySQL и Oracle , которая определяет основные операции доступа к базе данных с помощью простого в использовании API поверх JDBC.
- JNetDirect предоставляет набор высокопроизводительных драйверов JDBC, полностью сертифицированных Sun J2EE.
- JDBCR4 — это сервисная программа, написанная Скоттом Клементом для обеспечения доступа к JDBC из RPG на IBM i . [20]
- HSQLDB — это СУБД с драйвером JDBC, доступная по лицензии BSD.
- SchemaCrawler [21] — это API с открытым исходным кодом, который использует JDBC и делает метаданные базы данных доступными в виде простых старых объектов Java (POJO).
См. также [ править ]
- Доступ к данным GNU (GDA)
- JDBCFacade
- Открытое подключение к базе данных (ODBC)
- Объектно-реляционное отображение (ORM)
Цитаты [ править ]
- ↑ Перейти обратно: Перейти обратно: а б
«Sun Ships JDK 1.1 — Javabeans включены» . www.sun.com . Сан Микросистемс . 19 февраля 1997 г. Архивировано из оригинала 10 февраля 2008 г. Проверено 15 февраля 2010 г.
19 февраля 1997 г. — JDK 1.1 [...] теперь доступен [...]. Этот выпуск JDK включает в себя: [...] новые надежные функции, включая JDBC для подключения к базе данных.
- ^ Версия спецификации JDBC API: 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 г.
- ↑ Перейти обратно: Перейти обратно: а б с д Бай 2022 , с. 74.
- ^ Bai 2022 , стр. 122–124, §4.2.3.5 Подробнее о методах выполнения.
- ↑ Перейти обратно: Перейти обратно: а б с Bai 2022 , стр. 72–74, §3.2 Компоненты и архитектура JDBC.
- ^ Хорстманн 2022 , §5.5.3 Экранирование SQL.
- ↑ Перейти обратно: Перейти обратно: а б Bai 2022 , стр. 122–124, §4.2.3.5 Компоненты и архитектура JDBC.
- ^ Бай 2022 , с. 83, §3.5.1 Источник данных JDBC.
- ^ «Java JDBC API» . docs.oracle.com . Проверено 22 марта 2018 г.
- ^
Гринвальд, Рик; Стаковяк, Роберт; Стерн, Джонатан (1999). Oracle Essentials: База данных Oracle 10g . Серия Essentials (3-е изд.). Севастополь, Калифорния: O'Reilly Media, Inc. (опубликовано в 2004 г.). п. 318. ИСБН 9780596005856 . Проверено 3 ноября 2016 г.
Драйвер JDBC в базе данных (JDBC KPRB) [:] Java-код использует версию JDBC KPRB (Kernel Program Bundled) для доступа к SQL на том же сервере.
- ^ «Драйверы JDBC — программное обеспечение CData» . Программное обеспечение CData . Проверено 22 марта 2018 г.
- ^ «Драйверы JDBC — программное обеспечение CData» . Программное обеспечение CData . Проверено 22 марта 2018 г.
- ^ «Новый драйвер JDBC типа 5 — DataDirect Connect» .
- ^ «Доступ к внешним базам данных из RPG с помощью JDBCR4, суть дела» . 28 июня 2012 года . Проверено 12 апреля 2016 г.
- ^ Суале Фатехи. «СхемаКраулер» . Гитхаб .
Ссылки [ править ]
- Бай, Ин (2022). Программирование баз данных SQL Server с помощью Java . Чам: Springer International Publishing . дои : 10.1007/978-3-031-06553-8 . ISBN 978-3-030-92686-1 .
- Хорстманн, Кей (15 апреля 2022 г.). CoreJava . Oracle Press Java. ISBN 0-13-787107-4 .
Внешние ссылки [ править ]


- Руководство по API JDBC
java.sql
по API Javadoc Документацияjavax.sql
Документация по API Javadoc- O/R Broker Scala JDBC Платформа
- SqlTool Универсальная клиентская утилита JDBC с открытым исходным кодом, работающая из командной строки. Работает с любой базой данных, поддерживающей JDBC.
- Строки URL JDBC и связанная информация обо всех базах данных.