jdbc
TRANSCRIPT
![Page 1: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/1.jpg)
Взаимодействие с базой данных (JDBC)
![Page 2: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/2.jpg)
Введение в JDBC
JDBC (англ. Java DataBase Connectivity — соединение с
базами данных на Java) — позволяет Java приложениям п
олучить доступ к данным различных СУБД.
![Page 3: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/3.jpg)
Введение в JDBC
JDBC позволяет делать три простые вещи:Установить соединение с базой данныхПосылать запросы и изменять состояние базы данныхОбрабатывать результаты запросов
![Page 4: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/4.jpg)
История JDBC
Sun Microsystems выпустила JDBC как часть JDK 1.1 19-го февраля 1997 года. С тех пор он является частью JSE. Классы JDBC находятся в пакетах Java java.sql и javax.sql.
![Page 5: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/5.jpg)
История JDBC
Начиная с версии 3.1, JDBC разрабатывался в рамках Java
Community Process (JCP), который включает в себя
стандартизованные спецификации для Java
разработчиков.
![Page 6: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/6.jpg)
История JDBC
На данный момент технологию JDBC официально поддерживают следующие организации: Oracle, DataDirect Technologies, BEA, Fujitsu, MySQL, INET, Software, Novell, Borland, Pointbase Inc., Macromedia, SAP
![Page 7: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/7.jpg)
Версии JDBC
Стандартный пакет JDBC 2.0 по сравнению с версией 1.0 включает:
Пакетные (batch) обновления; Скроллируемые (scrollable) ResultSet; Опции для улучшения
производительности; Поддержка типов данных SQL3; Поддержка персистентности объектов; Другие мелкие улучшения.
![Page 8: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/8.jpg)
Версии JDBC
Метаданные для параметров объекта PreparedStatement;
Поддержка нового типов данных REF и DATALINK — для доступа к внешним данным.
![Page 9: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/9.jpg)
Версии JDBC
API JDBC 4.0 вышел совместно с JDK версии 1.5. :
Возможность управления различными JDBC драйверами;
Улучшение управления соединениями; Улучшение реализации объектов
RowSet; Улучшенную поддержку SQL запросов в
Java коде; Поддержка старых версий JDBC.
![Page 10: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/10.jpg)
Драйвер
Поскольку каждая СУБД является отдельным программным продуктом, для подключения к ней Java использует специальный драйвер, который пишется разработчиками данного СУБД. На официальном сайте как правило доступно скачивание соответствующих драйверов под каждую из версий СУБД.
![Page 11: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/11.jpg)
Типы драйверов
Тип 1К этому типу относятся драйверы реализованные поверх ODBC драйверов. Фактически все вызовы API JDBC транслируются в вызовы ODBC, а дальше обработку вызова ведет API ODBC. Иногда еще 1-й тип драйверов называется "JDBC-ODBC bridge".
![Page 12: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/12.jpg)
Типы драйверов
Тип 2 Ко второму типу относятся драйверы использующие программные части написанные на других языках. Обычно в этом случае для доступа к базе данных используются библиотеки разработанные производителем, а для их вызова используется JNI — Java интерфейс вызова нативных функций. Примером такого драйвера является т.н. «толстый» OCI-JDBC драйвер для Oracle.
![Page 13: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/13.jpg)
Типы драйверов
Тип 3В отличие от предыдущих типов драйверов данный тип драйвера полностью реализуется на Java, но при этом вызовы JDBC транслируются в сетевой протокол (RMI, HTTP и т.д.), который далее транслируется в специфичный протокол базы данных.
![Page 14: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/14.jpg)
Типы драйверов
Тип 4Также как и драйверы 3-го типа реализуется полностью на Java, но вызовы реализуются напрямую с использованием протокола базы данных, минуя сетевой протокол.
![Page 15: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/15.jpg)
Загрузка драйвера
Class.forName("полное имя класса").newInstance();
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
Class.forName(“полное имя класса”);Имя драйвера также можно найти на сайте разработчиков. Например для Oracle имя драйвера будет oracle.jdbc.driver.OracleDriver, для MySQLcom.mysql.jdbc.Driver.
![Page 16: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/16.jpg)
Класс DriverManager
Класс DriverManager используется для установления соединения с базой данных. Для этого необходимо указать ему специальный URL адрес, а также логин и пароль пользователя, зарегистрированного в СУБД. URL — это специальная строка, имеющая следующий формат:jdbc:<subprotocol>:<subname>
![Page 17: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/17.jpg)
Класс DriverManager
где <subprotocol> — имя драйвера или имя механизма подключения,<subname> — это строка, в которой указывается хост, порт, имя базы данных.
Например, для MySQL URL может быть таким:jdbc:mysql://localhost:3306/MyDataBaseName
![Page 18: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/18.jpg)
Получение соединения с базой
Зная URL, логин и пароль пользователя, а также имея зарегистрированный в системе драйвер, установить подключение можно так:
Connection c = DriverManager.getConnection("URL", "User_Login", "User_Password");
Объект класса Connection представляет собой соединение с базой данных.
![Page 19: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/19.jpg)
Класс Statement
После того, как соединение с базой данных установлено, мы можем отправлять запросы. Для этого нам понадобиться класс Statement. Объект Statement предназначен для хранения SQL команд и может быть создан следующим образом:
Statement statement = connection.createStatement();
![Page 20: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/20.jpg)
Изменение базы данных
Изменени баз данных. String sqlForInsert = "INSERT INTO DUMMY_DATA (id, name VALUES (1, “Ivan”)";int count = statement.executeUpdate(sqlForInsert);
![Page 21: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/21.jpg)
Пакетное выполнение
Statement st = con.createStatement();st.addBatch("INSERT INTO CUSTOMER VALUES (10, 'John', 1000)");st.addBatch("UPDATE CUSTOMER SET SALARYs = 250 WHERE ID = 1");st.addBatch("UPDATE CUSTOMER SET SALARY = 350 WHERE ID = 2");int[] results = st.executeBatch();
![Page 22: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/22.jpg)
ResultSet
После этого мы можем выполнять запросы. Результаты запроса будут храниться в объекте класса ResultSet.
ResultSet rs = statement.executeQuery(" SELECT * FROM Table_Name");
![Page 23: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/23.jpg)
Строки и курсоры
ResultSet содержит курсор, который указывает на текущую строку данных. Каждый раз, когда выполняется метод next(), курсор перемещается на одну строку вниз. Изначально курсор позиционирован перед первой строкой, и первый вызов next() перемещает его на первую строку (она становится текущей).
![Page 24: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/24.jpg)
Строки и курсоры
С каждым успешным вызовом next() курсор перемещается вниз на одну строку, начиная с самой верхней в ResultSet. Курсор сохраняется до тех пор, пока не закроется объект ResultSet или его родительский объект Statement.
![Page 25: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/25.jpg)
Строки и курсоры
В SQL курсор для результирующей таблицы имеет имя. Если БД поддерживает позиционированные обновления или позиционированные удаления, то командам обновления или удаления можно передать в качестве параметра имя курсора. Это имя может быть получено с помощью вызова getCursorName.
![Page 26: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/26.jpg)
Строки и курсоры
Не все СУБД поддерживают позиционированные обновления или удаления. Чтобы узнать, поддерживает ли данное соединение эти операции или нет, можно вызвать методы DatabaseMetaData.supportsPositionedDelete и supportsPositionedUpdate.
![Page 27: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/27.jpg)
Класс PreparedStatement
Для параметризованного SQL запроса используется класс PreparedStatement. Он может быть использован, например, так:PreparedStatement pst = c.prepareStatement("select * from MoCoUser where login = ?"); //? - это параметр//установление значения параметра.pst.setString(1, "user"); Обратите внимание: нумерация параметров начинается не с 0, а с 1!ResultSet prs = pst.executeQuery();
![Page 28: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/28.jpg)
Класс CallableStatement
Для вызова функции или процедуры используется класс CallableStatement:CallableStatement cst = c.prepareCall("CALL proc_name(?,?)"); //В процедуру также можно передавать параметрыcst.setInt(1, 100);cst.setString(2, "String");ResultSet rs = cst.executeQuery();
![Page 29: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/29.jpg)
Обработка результатов запроса
Для перехода по строкам вперёд и назад в классе ResultSet используются методы next() и previous(). Для перехода к первой или последней строке first() и last() соответственно. Обработка результатов в цикле будет выглядеть примерно следующим образом:while(rs.next()){ //обработка результатов}
![Page 30: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/30.jpg)
Получение значения колонки
Для получения значений из определённой колонки текущей строки можно получить методами getInteger(<param>), getString(<param>), getDouble(<param>),getDate(<param>) и так далее, где <param> — это номер колонки, если типа int или название колонки, если типа String.
![Page 31: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/31.jpg)
Получение значения колонки
Например://Вернет строку, находящуюся во втором столбце текущей строкиrs.getString(2); //Вернет значение типа double, находящееся в колонке с именем "average_score".rs.getDouble("average_score");
![Page 32: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/32.jpg)
NULL
Поскольку данные в БД могут иметь значение null, имеет смысл перед их извлечением проверить это, чтобы не получить исключение. Данная проверка осуществляется методом isNull(<param>), который вернет true или false.
![Page 33: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/33.jpg)
Использование потоков для очень больших значений
В JDBC API есть три отдельных метода для получения потоков:getBinaryStream возвращает поток байтов "как есть", без какого-либо предварительного преобразования
![Page 34: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/34.jpg)
Использование потоков для очень больших значений
getAsciiStream возвращает поток, состоящий из однобайтовых ASCII-символов.
getUnicodeStream возвращает поток двухбайтных символов Unicode.
![Page 35: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/35.jpg)
Метаданные ResultSet
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2"); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); boolean b = rsmd.isSearchable(1);
![Page 36: JDBC](https://reader033.vdocuments.site/reader033/viewer/2022042907/58e49d371a28abf5428b5693/html5/thumbnails/36.jpg)
Метаданные базы данных
Класс DatabaseMetaData предоставляет методы, описывающие таблицы базы данных, поддержку SQL, хранимые процедуры и другие сведения, относящиеся к базе данных и данному Connection, которые не относятся непосредственно к выполнению команд и извлечению результирующих наборов. Метод создает экземпляр класса DatabaseMetaData для данного Connection.
DatabaseMetaData metadata= connection.getMetaData();