SlideShare a Scribd company logo
1 of 36
Взаимодействие с базой данных
(JDBC)
Введение в JDBC
JDBC (англ. Java DataBase
Connectivity — соединение с
базами данных на Java) —
позволяет Java приложениям п
олучить доступ к данным
различных СУБД.
Введение в JDBC
JDBC позволяет делать три
простые вещи:
Установить соединение с базой
данных
Посылать запросы и изменять
состояние базы данных
Обрабатывать результаты
запросов
История JDBC
Sun Microsystems выпустила
JDBC как часть JDK 1.1 19-го
февраля 1997 года.
С тех пор он является частью
JSE.
Классы JDBC находятся в
пакетах Java java.sql и javax.sql.
История JDBC
Начиная с версии 3.1, JDBC
разрабатывался в рамках Java
Community Process (JCP),
который включает в себя
стандартизованные
спецификации для Java
разработчиков.
История JDBC
На данный момент технологию JDBC
официально поддерживают следующие
организации:
Oracle, DataDirect Technologies,
BEA, Fujitsu, MySQL, INET,
Software, Novell, Borland, Pointbase
Inc., Macromedia, SAP
Версии JDBC
Стандартный пакет JDBC 2.0 по сравнению с
версией 1.0 включает:
 Пакетные (batch) обновления;
 Скроллируемые (scrollable) ResultSet;
 Опции для улучшения
производительности;
 Поддержка типов данных SQL3;
 Поддержка персистентности объектов;
 Другие мелкие улучшения.
Версии JDBC
Метаданные для параметров
объекта PreparedStatement;
 Поддержка нового типов
данных REF и DATALINK —
для доступа к внешним
данным.
Версии JDBC
API JDBC 4.0 вышел совместно с JDK версии
1.5. :
Возможность управления различными
JDBC драйверами;
 Улучшение управления соединениями;
 Улучшение реализации объектов
RowSet;
 Улучшенную поддержку SQL запросов в
Java коде;
 Поддержка старых версий JDBC.
Драйвер
Поскольку каждая СУБД является
отдельным программным продуктом,
для подключения к ней Java использует
специальный драйвер, который
пишется разработчиками данного
СУБД. На официальном сайте как
правило доступно скачивание
соответствующих драйверов под
каждую из версий СУБД.
Типы драйверов
Тип 1
К этому типу относятся драйверы
реализованные поверх ODBC
драйверов. Фактически все вызовы API
JDBC транслируются в вызовы ODBC, а
дальше обработку вызова ведет API
ODBC. Иногда еще 1-й тип драйверов
называется "JDBC-ODBC bridge".
Типы драйверов
Тип 2 Ко второму типу относятся драйверы
использующие программные части
написанные на других языках. Обычно в этом
случае для доступа к базе данных
используются библиотеки разработанные
производителем, а для их вызова
используется JNI — Java интерфейс вызова
нативных функций. Примером такого
драйвера является т.н. «толстый» OCI-JDBC
драйвер для Oracle.
Типы драйверов
Тип 3
В отличие от предыдущих типов
драйверов данный тип драйвера
полностью реализуется на Java, но при
этом вызовы JDBC транслируются в
сетевой протокол (RMI, HTTP и т.д.),
который далее транслируется в
специфичный протокол базы данных.
Типы драйверов
Тип 4
Также как и драйверы 3-го типа
реализуется полностью на Java, но
вызовы реализуются напрямую с
использованием протокола базы
данных, минуя сетевой протокол.
Загрузка драйвера
Class.forName("полное имя класса").newInstance();
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").ne
wInstance();
DriverManager.registerDriver(new
com.microsoft.sqlserver.jdbc.SQLServerDriver());
Class.forName(“полное имя класса”);
Имя драйвера также можно найти на сайте разработчиков.
Например для Oracle имя драйвера
будет oracle.jdbc.driver.OracleDriver,
для MySQLcom.mysql.jdbc.Driver.
Класс DriverManager
Класс DriverManager используется для
установления соединения с базой данных.
Для этого необходимо указать ему
специальный URL адрес, а
также логин и пароль пользователя,
зарегистрированного в СУБД. URL — это
специальная строка, имеющая следующий
формат:
jdbc:<subprotocol>:<subname>
Класс DriverManager
где <subprotocol> — имя драйвера или имя
механизма подключения,
<subname> — это строка, в которой
указывается хост, порт, имя базы данных.
Например, для MySQL URL может быть
таким:
jdbc:mysql://localhost:3306/MyDataBaseName
Получение соединения с базой
Зная URL, логин и пароль пользователя, а
также имея зарегистрированный в
системе драйвер, установить подключение
можно так:
Connection c = DriverManager.getConnection("U
RL", "User_Login", "User_Password");
Объект класса Connection представляет
собой соединение с базой данных.
Класс Statement
После того, как соединение с базой
данных установлено, мы можем отправлять
запросы. Для этого нам понадобиться
класс Statement. Объект Statement
предназначен для хранения SQL команд
и может быть создан следующим образом:
Statement statement =
connection.createStatement();
Изменение базы данных
Изменени баз данных.
String sqlForInsert = "INSERT INTO
DUMMY_DATA (id, name VALUES (1,
“Ivan”)";
int count =
statement.executeUpdate(sqlForInsert);
Пакетное выполнение
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();
ResultSet
После этого мы можем выполнять
запросы. Результаты запроса будут
храниться в объекте класса ResultSet.
ResultSet rs = statement.executeQuery("
SELECT * FROM Table_Name");
Строки и курсоры
ResultSet содержит курсор,
который указывает на текущую строку
данных. Каждый раз, когда выполняется
метод next(), курсор перемещается на
одну строку вниз. Изначально курсор
позиционирован перед первой строкой,
и первый вызов next() перемещает его
на первую строку (она становится
текущей).
Строки и курсоры
С каждым успешным вызовом next()
курсор перемещается вниз на одну
строку, начиная с самой верхней
в ResultSet.
Курсор сохраняется до тех пор, пока не
закроется объект ResultSet или его
родительский объект Statement.
Строки и курсоры
В SQL курсор для результирующей
таблицы имеет имя. Если БД
поддерживает позиционированные
обновления или позиционированные
удаления, то командам обновления или
удаления можно передать в качестве
параметра имя курсора. Это имя может
быть получено с помощью
вызова getCursorName.
Строки и курсоры
Не все СУБД поддерживают
позиционированные обновления или
удаления. Чтобы узнать, поддерживает
ли данное соединение эти операции
или нет, можно вызвать методы
DatabaseMetaData.supportsPositionedDel
ete и supportsPositionedUpdate.
Класс PreparedStatement
Для параметризованного SQL запроса
используется класс PreparedStatement. Он может
быть использован, например, так:
PreparedStatement pst = c.prepareStatement("select *
from MoCoUser where login = ?");
//? - это параметр
//установление значения параметра.
pst.setString(1, "user");
Обратите внимание: нумерация параметров
начинается не с 0, а с 1!
ResultSet prs = pst.executeQuery();
Класс CallableStatement
Для вызова функции или процедуры
используется класс CallableStatement:
CallableStatement cst = c.prepareCall("CA
LL proc_name(?,?)"); //В процедуру
также можно передавать параметры
cst.setInt(1, 100);
cst.setString(2, "String");
ResultSet rs = cst.executeQuery();
Обработка результатов запроса
Для перехода по строкам вперёд и назад в
классе ResultSet используются методы
next() и previous(). Для перехода к первой
или последней строке first() и last()
соответственно. Обработка результатов в
цикле будет выглядеть примерно следующим
образом:
while(rs.next()){
//обработка результатов
}
Получение значения колонки
Для получения значений из
определённой колонки текущей строки
можно получить методами
getInteger(<param>), getString(<param>),
getDouble(<param>),getDate(<param>) и
так далее, где <param> — это номер
колонки, если типа int или название
колонки, если типа String.
Получение значения колонки
Например:
//Вернет строку, находящуюся во
втором столбце текущей строки
rs.getString(2);
//Вернет значение типа double,
находящееся в колонке с именем
"average_score".
rs.getDouble("average_score");
NULL
Поскольку данные в БД могут иметь
значение null, имеет смысл перед их
извлечением проверить это, чтобы не
получить исключение. Данная проверка
осуществляется
методом isNull(<param>), который
вернет true или false.
Использование потоков для очень
больших значений
В JDBC API есть три отдельных
метода для получения потоков:
getBinaryStream возвращает поток
байтов "как есть", без какого-либо
предварительного преобразования
Использование потоков для очень
больших значений
getAsciiStream возвращает поток,
состоящий из однобайтовых ASCII-
символов.
getUnicodeStream возвращает
поток двухбайтных символов
Unicode.
Метаданные ResultSet
ResultSet rs =
stmt.executeQuery("SELECT a, b, c
FROM TABLE2");
ResultSetMetaData rsmd =
rs.getMetaData();
int numberOfColumns =
rsmd.getColumnCount();
boolean b = rsmd.isSearchable(1);
Метаданные базы данных
Класс DatabaseMetaData предоставляет методы,
описывающие таблицы базы данных, поддержку SQL,
хранимые процедуры и другие сведения,
относящиеся к базе данных и данному Connection,
которые не относятся непосредственно к
выполнению команд и извлечению результирующих
наборов. Метод создает экземпляр класса
DatabaseMetaData для данного Connection.
DatabaseMetaData metadata=
connection.getMetaData();

More Related Content

What's hot

Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJSYura Bogdanov
 
Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.Unguryan Vitaliy
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Fedor Lavrentyev
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8Technopark
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в javaUnguryan Vitaliy
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.Igor Shkulipa
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовtvaleev
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.Unguryan Vitaliy
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью. Unguryan Vitaliy
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.Igor Shkulipa
 
RAD на Java: как устроена CUBA Platform?
RAD на Java: как устроена  CUBA Platform?RAD на Java: как устроена  CUBA Platform?
RAD на Java: как устроена CUBA Platform?Aleksey Stukalov
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8Technopark
 
Аннотации в java
Аннотации в javaАннотации в java
Аннотации в javaUnguryan Vitaliy
 
Aleksey Mashanov Rit
Aleksey  Mashanov RitAleksey  Mashanov Rit
Aleksey Mashanov Ritrit2010
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.Igor Shkulipa
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.Igor Shkulipa
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8Technopark
 

What's hot (19)

Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
 
Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
 
Stream API
Stream APIStream API
Stream API
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
 
RAD на Java: как устроена CUBA Platform?
RAD на Java: как устроена  CUBA Platform?RAD на Java: как устроена  CUBA Platform?
RAD на Java: как устроена CUBA Platform?
 
Jdbc in java
Jdbc in javaJdbc in java
Jdbc in java
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8
 
Аннотации в java
Аннотации в javaАннотации в java
Аннотации в java
 
Aleksey Mashanov Rit
Aleksey  Mashanov RitAleksey  Mashanov Rit
Aleksey Mashanov Rit
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8
 

Similar to JDBC

Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Javametaform
 
Java осень 2012 лекция 8
Java осень 2012 лекция 8Java осень 2012 лекция 8
Java осень 2012 лекция 8Technopark
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7Technopark
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. DatabasesSergey Nemchinsky
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Fedor Lavrentyev
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderАлександр Брич
 
Bloch, bodoff руководство. сервлеты
Bloch, bodoff   руководство. сервлетыBloch, bodoff   руководство. сервлеты
Bloch, bodoff руководство. сервлетыalexey1991
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данныхmcroitor
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIПротокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIEkaterina Kuchinskaya
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)Noveo
 
0041
00410041
0041JIuc
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данныхAlex Polorotov
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данныхVitaliy Trenkenshu
 

Similar to JDBC (20)

Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Java
 
Java осень 2012 лекция 8
Java осень 2012 лекция 8Java осень 2012 лекция 8
Java осень 2012 лекция 8
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 
Lec 13
Lec 13Lec 13
Lec 13
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, Loader
 
Bloch, bodoff руководство. сервлеты
Bloch, bodoff   руководство. сервлетыBloch, bodoff   руководство. сервлеты
Bloch, bodoff руководство. сервлеты
 
PT Hackday#2
PT Hackday#2PT Hackday#2
PT Hackday#2
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данных
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIПротокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
0041
00410041
0041
 
servlets1.pdf
servlets1.pdfservlets1.pdf
servlets1.pdf
 
servlets.pdf
servlets.pdfservlets.pdf
servlets.pdf
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данных
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
 
Управление данными (sql)
Управление данными (sql)Управление данными (sql)
Управление данными (sql)
 

More from Unguryan Vitaliy

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование. Unguryan Vitaliy
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVCUnguryan Vitaliy
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектамиUnguryan Vitaliy
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версийUnguryan Vitaliy
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Unguryan Vitaliy
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoFUnguryan Vitaliy
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в javaUnguryan Vitaliy
 
Java. Интерфейс Reference - типы ссылок
Java. Интерфейс Reference -  типы ссылокJava. Интерфейс Reference -  типы ссылок
Java. Интерфейс Reference - типы ссылокUnguryan Vitaliy
 
Java. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьJava. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьUnguryan Vitaliy
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Unguryan Vitaliy
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Unguryan Vitaliy
 

More from Unguryan Vitaliy (17)

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование.
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектами
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
XML
XMLXML
XML
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в java
 
java 8
java 8java 8
java 8
 
Java. Интерфейс Reference - типы ссылок
Java. Интерфейс Reference -  типы ссылокJava. Интерфейс Reference -  типы ссылок
Java. Интерфейс Reference - типы ссылок
 
Java. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьJava. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередь
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.
 
List - списки
List - списки List - списки
List - списки
 

JDBC

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