Після реєстрації драйвера з допомогою диспетчера драйверів його можна застосувати для під’єднання до бази даних. Про створення нового під’єднання треба повідомити диспетчера. Отримавши повідомлення, диспетчер викличе відповідний драйвер і поверне вказівник на встановлене під’єднання.. Для створення під’єднання необхідно вказати місце розташування бази даних, ім’я коистувача та пароль. Створення під’єднання відбувається за допомогою об’єкту класу Connection:
Згідно встановленим правилам Internet, база даних і засоби її обслуговування ідентифікуються за допомогою URL, який задається у форматі:
jdbc:дод– протокол:дод– ім’я
де “дод– протокол” – назва драйвера, їх набору або механізму встановлення з'єднання з базою даних; “дод– ім’я” –додаткова інформація для вказаного набору. Наприклад, при застосуванні ODBC в URL– рядок підставляється ця назва та DSN– назва (Data Source Name) джерела з ODBC.INI файла: jdbc:odbc:dBase
Якщо замість ODBC використовується ім'я мережевого сервісу до бази даних, то до адреси URL входить назва сервера, порт, назва директорії, файла тощо.
Завдяки універсальності і доступності механізм JDBC– ODBC– міст використовується частіше. Він реалізований у вигляді JdbcOdbc.class (для платформи Windows JdbcOdbc.dll) і входить у різні версії JDK. Крім JdbcOdbc– бібліотек існують спеціальні драйвера, які реалізують безпосередній доступ до баз даних через стандартний інтерфейс ODBC. Як правило, вони описуються в файлі ODBC.INI. На внутрішньому рівні JDBC– ODBC– Міст відображає методи Java у виклики ODBC і цим дозволяє використати будь– які існуючі драйвери ODBC.
Доступ до таблиць баз даних з Java– програми здійснюється з допомогою методів класу Statement. Об’єкти цього класу призначені для зберігання SQL– команд і вони створюються методом createStatement класу Connection. Після пересилання об’єкту типу Statementдо бази даних з допомогою встановленого під’єднання СУБД виконає отриману SQL– команду і поверне результат її виконання у виді об’єкту класу ResultSet(рис.2).
Рис.2. Класи взаємодії програми з СУБД
Методи класу Statementповинні завжди виконуватись в межах блоку try{ } catch . Розглянемо приклад встановлення вказівника на номер запису (рядка) в таблиці перегляду при виконанні SQL–запиту. Драйвер фізично копіює з бази даних запис з цим номером (для клієнта – fetch size). Цей параметр призначений для підвищення ефективності програми перегляду таблиць. Вказвник можна визначити методом getFetchSize, задавати методом setFetchSize(int fetchSize) і ним же перевизначити у вихідному об’єкті результатів класу ResultSet. Розглянемо приклад роботи з вказівником:
try {
Statement stmt = connection.createStatement();
int fetchSize = stmt.getFetchSize();// вказівник на біжучий запис
stmt.setFetchSize(100); // вказівник на 100– ий запис ResultSet resultSet = stmt.executeQuery("SELECT * FROM my_table"); // об’єкт результату, як результат виконання executeQuery
resultSet.setFetchSize(100); // вказівник на запис 100
} catch (SQLException e) {
}
Розглянемо тепер приклад доступу до конкретних даних (рядків, стовпців, клітинок) з результуючого об’єкту класу ResultSet, надісланого драйвером. Доступ до полів рядка є можливий, якщо останній є біжучим. Рядок, означений вказівником, вважається біжучим. Початкове положення вказівника на запис знаходиться перед першим рядком. Після виклику методу next вказівник встановлюється на перший рядок, який стає біжучим. Можливими є два способи отримати дані з біжучого рядка. Перший використовує індекс стовпчика, починаючи з першого. Другий використовує назву стовпця. Наприклад, для запиту SELECT col1, col2 FROM my_tableзначення з стовпця col2 можна отримати за індексом стовпця 2 або за його назвою col2. Наведений приклад демонструє ці два способи.
try {
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM my_table");
while (rs.next()) { // зміна номеру запису
String s = rs.getString(2);// дані з клітинки (за індексом стовпця)
s = rs.getString(" col2 ");// дані з рядка за назвою стовпця
}
} catch (SQLException e) {
}
Кожна база даних характеризується типами даних, які можна зберігати у таблицях. Нижче наведено приклад виділення даних з типами СУБД MySQL (назви типів вказані при описі змінних та об’єктів, як і в назвах відповідних методів).
try {Statement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM mysql_all_table");while (rs.next()) {boolean bool = rs.getBoolean("col_boolean");byte b = rs.getByte("col_byte");short s = rs.getShort("col_short");int i = rs.getInt("col_int");long l = rs.getLong("col_long");float f = rs.getFloat("col_float");double d = rs.getDouble("col_double");BigDecimal bd = rs.getBigDecimal("col_bigdecimal");String str = rs.getString("col_string");Date date = rs.getDate("col_date");Time t = rs.getTime("col_time");Timestamp ts = rs.getTimestamp("col_timestamp");InputStream ais = rs.getAsciiStream("col_asciistream");InputStream bis = rs.getBinaryStream("col_binarystream"); Blob blob = rs.getBlob("col_blob"); }} catch (SQLException e) { }
Наряду з вибором даних з таблиць об’єкти класу Statementвикористовуються для внесення змін до відповідних таблиць, наприклад при внесенні змін до рядка (при цьому слід пам’ятати про стан вказівника на рядки таблиці) :
try {
Statement stmt = connection.createStatement();
String sql = "INSERT INTO my_table (col_string) VALUES('a string')";
stmt.executeUpdate(sql); // внести зміни до таблиці
} catch (SQLException e) {
}
Якщо програма містить SQL – запит, який має виконуватись декілька разів, але з різними значеннями, то для підвищення ефективності роботи програми слід використати апарат “попередньо підготовлених команд”. Наприклад, якщо з web– сторінки з допомогою запиту ведеться пошук інформації про товари на основі їх ідентифікаторів, то у цьому випадку має використовуватись попередньо підготовлена команда. Для того, щоб інтерпретація SQL– команди здійснювалась тільки один раз диспетчери баз даних підтримують концепцію “попередньо скомпільованої команди”. Пакет java.sql для підвищення ефективності роботи з базами даних передбачає використанням класуPrepareStatement. Розглянемо спосіб його використання наприкладі занесення рядка у таблицю бази даних.
Запит в попередньо підготовленій команді містить символи '?' замість потрібних значень полів. Необхідно спочатку занести значення, а потім виконати команду:
try {
String sql = "INSERT INTO my_table (col_string) VALUES(?)";