
- •7.05010301, 8.05010301 - "Програмне забезпечення систем”
- •7.05010302, 8.05010302 - "Інженерія програмного забезпечення”
- •1. Вступ
- •2. Мета та завдання
- •3. Завдання на курсову роботу
- •4. Склад, обсяг і структура курсової роботи
- •5.1. Класи
- •5.1.1. Розширення класу
- •5.2. Абстрактні класи
- •5.3. Інтерфейси
- •6. Робота із реляційними базами даних
- •4. Виконання запиту
- •5. Обробка результатів
- •6. Закриття з’єднання
- •6.3. Пул з’єднань
5. Обробка результатів
Об’єкт классу ResultSet, який повертається методом executeQuery() дозволяє ітерувати по результатам запиту. Об’єкт має метод next() для отримання наступного рядка та набір методів (getString(),getInt(), тощо) для отримання значень полів.
Приклад:
ResultSet result = query2.executeQuery();
while(result.next()){
String name = result.getString(2);
int course = result.getInt("course");
int student_id = result.getInt("id");
System.out.println(name+" "+course+" "+student_id );
}
6. Закриття з’єднання
Об’єкт запиту (Statement) після його виконання необхідно закривати для економії ресурсів програми. При закритті запиту закривається його ResultSet. При написанні коду, що взаємодіє із СУБД за допомогою JDBC слід враховувати, що на будь якому етапі можемо отримати SQLException. Таким чином, обробка виключної ситуації має бути в блоці try… catch, а закриття запиту – в окремому блоці try… finally.
Приклад:
try{
Statement stmt = null;
try{
stmt = myConnection.createStatement();
ResultSet rs = stmt.executeQuery("Select * from student" );
while(rs.next()){
String name = rs.getString("name");
int course = rs.getInt("course");
int student_id = rs.getInt("id");
System.out.println(name+" "+course+" "+student_id );
}
rs.close();
} finally{
if( stmt!=null )
stmt.close();
}
}catch(SQLException ex){
System.out.println(ex);
}catch(Exception ex){
System.out.println(ex);
}
6.2. Data Access Objects (DAO)
Іноді необхідно абстрагуватись від джерел даних. Це має сенс тоді, коли архітектура програми розділяється на шари. Шар доступу до даних можна зробити незалежним від реалізації доступу до фізичних носіїв. Традиційно такі шари будуються за принципом CRUD (Create, Read, Update, Delete). Оголошується інтерфейс та робиться одна або кілька його реалізацій, залежних від БД, Наприклад:
public interface StudentsDAO {
List<Student> getAllStudents();
Student find(int id);
int insert(Student s );
void update(Student s);
void delete(int id);
}
public class MySQLStudentsDAO implements StudentsDAO{
public List<Student> getAllStudents() {
…
}
public int insert(Student s) {
…
}
public void update(Student s) {
…
}
public Student find(int id) {
…
}
public void delete(int id) {
…
}
}
Для кожної сутності створюється свій набір з інтерфейсу та реалізації (або реалізацій під різні СУБД). Отримання екземпляру найчастіше здійснюється через фабрики.
6.3. Пул з’єднань
Робота з базою даних на сервері додатків (веб-сервері) має деяку специфіку. Із сервером додатків можуть взаємодіяти кілька тисяч користувачів. Їх запити до динамічного контенту найчастіше призводитимуть до запитів до сервера БД. Але для кожного користувача мати окреме з’єднання з пулом з’єднань є недоцільним, бо користувач не буде надсилати запити постійно, а утримання з’єднання вимагатиме зайвих ресурсів. Крім того з’єднання з БД не завжди є швидкою процедурою. З іншого боку є недоцільним всі запити користувачів обробляти через одне з’єднання. Тому використовують пул з’єднань – колекцію, яка містить об’єкти з’єднань з БД. Якщо програмі на веб-сервері необхідно виконати запит до БД то вона отримує з’єданння з пулу, виконує запит до БД, повертає з’єданння до пулу. Пул з’єднань автоматично змінює кількість з’єднань в залежності від інтенсивності роботи з ними. Можна використовувати власні пули з’єднань, але найчастіше достатньо користуватися вже створеними класами пулів з’єднань.
Розглянемо налаштування пула з’єднань на сервері додатків glassfish.
1. Заходимо на адміністративну сторінку (найчастіше http://localhost:4848)
2. Переходимо Resources->JDBC->JDBC Connection Pools, натискаємо New….
3. Вводимо назву пулу, вибираємо тип ресурсу, найчастіше – javax.sql.DataSource, та постачальника БД, натискаємо Next.
4. На наступній сторінці задаємо хост, порт, користувача та пароль БД.
5. Створюємо JNDI ресурс, який відповідає пулу з’єднань.
6. Драйвер БД необхідно розмістити JAR із JDBC драйвером у папці для зовнішніх бібліотек сервера додатків (для glassfish- GLASSFISH_DIR\glassfish\domains\domain1\lib\ext\ ).
7. Перезавантажуємо web-сервер.
У веб-застосунку пул з’єднань отримуємо за використовуючи пошук по JNDI:
InitialContext context = new InitialContext();
DataSource ds=(DataSource)context.lookup("jdbc/MySqlPool");//назва ресурсу
Connection conn = ds.getConnection()
Отримане з’єднання можна використовувати аналогічно до попередніх прикладів. При виклику методу close() з'єднання повертається в пул.