jdbc

36
Взаимодействие с базой данных (JDBC)

Upload: unguryan-vitaliy

Post on 05-Apr-2017

47 views

Category:

Education


0 download

TRANSCRIPT

Page 1: JDBC

Взаимодействие с базой данных (JDBC)

Page 2: JDBC

Введение в JDBC

JDBC (англ. Java DataBase Connectivity — соединение с

базами данных на Java) — позволяет Java приложениям п

олучить доступ к данным различных СУБД.

Page 3: JDBC

Введение в JDBC

JDBC позволяет делать три простые вещи:Установить соединение с базой данныхПосылать запросы и изменять состояние базы данныхОбрабатывать результаты запросов

Page 4: JDBC

История JDBC

Sun Microsystems выпустила JDBC как часть JDK 1.1 19-го февраля 1997 года. С тех пор он является частью JSE. Классы JDBC находятся в пакетах Java java.sql и javax.sql.

Page 5: JDBC

История JDBC

Начиная с версии 3.1, JDBC разрабатывался в рамках Java

Community Process (JCP), который включает в себя

стандартизованные спецификации для Java

разработчиков.

Page 6: JDBC

История JDBC

На данный момент технологию JDBC официально поддерживают следующие организации: Oracle, DataDirect Technologies, BEA, Fujitsu, MySQL, INET, Software, Novell, Borland, Pointbase Inc., Macromedia, SAP

Page 7: JDBC

Версии JDBC

Стандартный пакет JDBC 2.0 по сравнению с версией 1.0 включает:

Пакетные (batch) обновления; Скроллируемые (scrollable) ResultSet; Опции для улучшения

производительности; Поддержка типов данных SQL3; Поддержка персистентности объектов; Другие мелкие улучшения.

Page 8: JDBC

Версии JDBC

Метаданные для параметров объекта PreparedStatement;

Поддержка нового типов данных REF и DATALINK — для доступа к внешним данным.

Page 9: JDBC

Версии JDBC

API JDBC 4.0 вышел совместно с JDK версии 1.5. :

Возможность управления различными JDBC драйверами;

Улучшение управления соединениями; Улучшение реализации объектов

RowSet; Улучшенную поддержку SQL запросов в

Java коде; Поддержка старых версий JDBC.

Page 10: JDBC

Драйвер

Поскольку каждая СУБД является отдельным программным продуктом, для подключения к ней Java использует специальный драйвер, который пишется разработчиками данного СУБД. На официальном сайте как правило доступно скачивание соответствующих драйверов под каждую из версий СУБД.

Page 11: JDBC

Типы драйверов

Тип 1К этому типу относятся драйверы реализованные поверх ODBC драйверов. Фактически все вызовы API JDBC транслируются в вызовы ODBC, а дальше обработку вызова ведет API ODBC. Иногда еще 1-й тип драйверов называется "JDBC-ODBC bridge".

Page 12: JDBC

Типы драйверов

Тип 2 Ко второму типу относятся драйверы использующие программные части написанные на других языках. Обычно в этом случае для доступа к базе данных используются библиотеки разработанные производителем, а для их вызова используется JNI — Java интерфейс вызова нативных функций. Примером такого драйвера является т.н. «толстый» OCI-JDBC драйвер для Oracle.

Page 13: JDBC

Типы драйверов

Тип 3В отличие от предыдущих типов драйверов данный тип драйвера полностью реализуется на Java, но при этом вызовы JDBC транслируются в сетевой протокол (RMI, HTTP и т.д.), который далее транслируется в специфичный протокол базы данных.

Page 14: JDBC

Типы драйверов

Тип 4Также как и драйверы 3-го типа реализуется полностью на Java, но вызовы реализуются напрямую с использованием протокола базы данных, минуя сетевой протокол.

Page 15: JDBC

Загрузка драйвера

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

Класс DriverManager

Класс DriverManager используется для установления соединения с базой данных. Для этого необходимо указать ему специальный URL адрес, а также логин и пароль пользователя, зарегистрированного в СУБД.  URL — это специальная строка, имеющая следующий формат:jdbc:<subprotocol>:<subname>

Page 17: JDBC

Класс DriverManager

где <subprotocol> — имя драйвера или имя механизма подключения,<subname> — это строка, в которой указывается хост, порт, имя базы данных.

Например, для MySQL URL может быть таким:jdbc:mysql://localhost:3306/MyDataBaseName

Page 18: JDBC

Получение соединения с базой

Зная URL, логин и пароль пользователя, а также имея зарегистрированный в системе драйвер, установить подключение можно так:

Connection c = DriverManager.getConnection("URL", "User_Login", "User_Password");

Объект класса Connection представляет собой соединение с базой данных.

Page 19: JDBC

Класс Statement

После того, как соединение с базой данных установлено, мы можем отправлять запросы. Для этого нам понадобиться класс Statement. Объект Statement предназначен для хранения SQL команд и может быть создан следующим образом:

Statement statement = connection.createStatement();

Page 20: JDBC

Изменение базы данных

Изменени баз данных. String sqlForInsert = "INSERT INTO DUMMY_DATA (id, name VALUES (1, “Ivan”)";int count = statement.executeUpdate(sqlForInsert);

Page 21: JDBC

Пакетное выполнение

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

ResultSet

После этого мы можем выполнять запросы. Результаты запроса будут храниться в объекте класса ResultSet.

ResultSet rs = statement.executeQuery(" SELECT * FROM Table_Name");

Page 23: JDBC

Строки и курсоры

ResultSet содержит курсор, который указывает на текущую строку данных. Каждый раз, когда выполняется метод next(), курсор перемещается на одну строку вниз. Изначально курсор позиционирован перед первой строкой, и первый вызов next() перемещает его на первую строку (она становится текущей).

Page 24: JDBC

Строки и курсоры

С каждым успешным вызовом next() курсор перемещается вниз на одну строку, начиная с самой верхней в ResultSet. Курсор сохраняется до тех пор, пока не закроется объект ResultSet или его родительский объект Statement.

Page 25: JDBC

Строки и курсоры

В SQL курсор для результирующей таблицы имеет имя. Если БД поддерживает позиционированные обновления или позиционированные удаления, то командам обновления или удаления можно передать в качестве параметра имя курсора. Это имя может быть получено с помощью вызова getCursorName.

Page 26: JDBC

Строки и курсоры

Не все СУБД поддерживают позиционированные обновления или удаления. Чтобы узнать, поддерживает ли данное соединение эти операции или нет, можно вызвать методы DatabaseMetaData.supportsPositionedDelete и supportsPositionedUpdate.

Page 27: JDBC

Класс 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

Класс CallableStatement

Для вызова функции или процедуры используется класс CallableStatement:CallableStatement cst = c.prepareCall("CALL proc_name(?,?)"); //В процедуру также можно передавать параметрыcst.setInt(1, 100);cst.setString(2, "String");ResultSet rs = cst.executeQuery();

Page 29: JDBC

Обработка результатов запроса

Для перехода по строкам вперёд и назад в классе ResultSet используются методы next() и previous(). Для перехода к первой или последней строке first() и last() соответственно. Обработка результатов в цикле будет выглядеть примерно следующим образом:while(rs.next()){ //обработка результатов}

Page 30: JDBC

Получение значения колонки

Для получения значений из определённой колонки текущей строки можно получить методами getInteger(<param>), getString(<param>), getDouble(<param>),getDate(<param>) и так далее, где <param> — это номер колонки, если типа int или название колонки, если типа String.

Page 31: JDBC

Получение значения колонки

Например://Вернет строку, находящуюся во втором столбце текущей строкиrs.getString(2);  //Вернет значение типа double, находящееся в колонке с именем "average_score".rs.getDouble("average_score");

Page 32: JDBC

NULL

Поскольку данные в БД могут иметь значение null, имеет смысл перед их извлечением проверить это, чтобы не получить исключение. Данная проверка осуществляется методом isNull(<param>), который вернет true или false.

Page 33: JDBC

Использование потоков для очень больших значений

В JDBC API есть три отдельных метода для получения потоков:getBinaryStream возвращает поток байтов "как есть", без какого-либо предварительного преобразования 

Page 34: JDBC

Использование потоков для очень больших значений

getAsciiStream возвращает поток, состоящий из однобайтовых ASCII-символов. 

getUnicodeStream возвращает поток двухбайтных символов Unicode. 

Page 35: JDBC

Метаданные 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

Метаданные базы данных

Класс DatabaseMetaData предоставляет методы, описывающие таблицы базы данных, поддержку SQL, хранимые процедуры и другие сведения, относящиеся к базе данных и данному Connection, которые не относятся непосредственно к выполнению команд и извлечению результирующих наборов. Метод создает экземпляр класса DatabaseMetaData для данного Connection.

DatabaseMetaData metadata= connection.getMetaData();