
Реляційний доступ до даних
Окрім об’єктного доступу, Caché також надає декілька способів реляційного отримання даних з БД:
Методи-запити класу;
Динамічні запити;
Вбудований SQL ().
Використання методів-запитів
Caché автоматично генерує методи для кожного запиту в класі та додає до Java проекції. Для роботи із методами-запитами використовується клас com.intersys.objects.CacheQuery. Результат виконання запиту повертається у об’єкт класу java.sql.ResultSet, який дозволяє переміщуватися по записах, отримувати дані та метадані.
Примітка. Для того, щоб метод-запит класу повертав значення у застосування, він повинен містити ключове слово SqlProc.
Наприклад, якщо у класі Library.Type міститься метод-запит GetAllTypes, то для отримання даних, які він повертає потрібно використати наступний код:
DefaultTableModel dt = new DefaultTableModel();
try
{
CacheQuery query = new CacheQuery(db, "Library.Type", "GetAllTypes");
java.sql.ResultSet rs=query.execute();
while (rs.next()){
row[0] = rs.getString(1);
row[1] = rs.getString(2);
row[2] = rs.getString(3);
dt.addRow(row);
}
}
catch (CacheException e){System.out.println(e.getMessage());}
catch(SQLException e){System.out.println(e.getMessage());}
Для роботи із результатами запиту використовується стандартний клас обробки запитів java.sql.ResultSet, який може повертати виключну ситуацію класу SQLException, яку потрібно обробити.
Динамічні запити
Є два шляхи виконання динамічних запитів із Java застосування:
використовуючи метод інтерфейсу Database openByQuery;
використовуючи об’єкт класу CacheQuery.
Інтерфейс Database містить метод openByQuery, в який потрібно передати строку із SQL-виразом для виконання і параметри запиту. Метод повертає об’єкт класу java.util.Iterator, який містить результат виконання запиту. Це дозволяє працювати із результатами запиту використовуючи стандартні об’єкти. Є декілька правил запису SQL-виразу:
перша колонка запиту має містити повне ім’я %ID колонки таблиці;
розділ ORDER BY має використовувати імена колонок для зазначення послідовності.
Наприклад:
public static void displayPhoneNumbersByTypeOBQ(Database db, String id, String type) throws CacheException{
Object[] args = {id, type};
String sql = "SELECT JavaTutorial.PhoneNumber.%ID FROM " +
"JavaTutorial.PhoneNumber WHERE Contact = ? AND PhoneNumberType = ?";
Iterator iter = db.openByQuery(sql, args);
while (iter.hasNext()){
PhoneNumber pn = (PhoneNumber)iter.next();
System.out.println("Type: " + pn.getPhoneNumberType() +
" Number: " + pn.getNumber());
}
}
Java клієнт також може виконувати динамічні запити використовуючи об’єкт класу CacheQuery. При цьому в конструктор об’єкта передається SQL-вираз. Метод execute даного об’єкту повертає об’єкт класу java.sql.ResultSet. Наприклад:
public static void displayPhoneNumbersByType(Database db,
String id, String type) throws CacheException, SQLException {
Id ID= new Id(id);
String SQL = "SELECT Number FROM JavaTutorial.PhoneNumber" +
" WHERE Contact='"+id +"' AND PhoneNumberType='" + type +"'";
CacheQuery query = new CacheQuery(db, SQL);
java.sql.ResultSet rs= query.execute();
while (rs.next()){
System.out.println(rs.getString(1));
}
}