Персонализиране на ResultSet

Модерният JDBC API ви позволява значително да персонализирате обекти.ИзявлениеИнабор от резултати. Например, използвайкинабор от резултатиможете да променяте редове в базата данни.

Когато създаваме обект на изявление, можем да предадем куп наши желания в него. Тези желания могат да бъдат разделени на три групи:

  • Базов тип връзка
  • Едновременен контрол на достъпа
  • Устойчивост и транзакции

Тези параметри могат да бъдат предадени при създаване на обектИзявлениеorPreparedStatement. Пример:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

Няма да изучаваме тези неща в дълбочина, но искам да знаете, че това е възможно, ако срещнете нещо подобно в codeа на някой друг.

Типове ResultSet

ResultSet може да бъде от определен тип. Типът определя някои от характеристиките и възможностите на ResultSet.

Не всички типове се поддържат от всички бази данни и JDBC драйвери. Ще трябва да проверите вашата база данни и JDBC драйвера, за да видите дали поддържа типа, който искате да използвате. Методът DatabaseMetaData.supportsResultSetType(int type) връща true or false в зависимост от това дали дадения тип се поддържа or не.

Към момента на писане има три вида ResultSet:

  • ResultSet.TYPE_FORWARD_ONLY
  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.TYPE_SCROLL_SENSITIVE

Типът по подразбиране е TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY означава, че ResultSet може да бъде преместен само напред. Тоест можете да се движите само от ред 1, ред 2, ред 3 и т.н. В ResultSet не можете да се движите назад: не можете да четете данни от 9-ия ред след четене на десетия.

TYPE_SCROLL_INSENSITIVE означава, че ResultSet може да се премества (превърта) напред or назад. Можете също така да се преместите на позиция спрямо текущата позиция or да се преместите на абсолютна позиция.

ResultSet от този тип е нечувствителен към промени в основния източник на данни, докато ResultSet е отворен. Тоест, ако запис в ResultSet бъде променен в базата данни от друга нишка or процес, той няма да бъде отразен във вече отворениянабор от резултатиот този тип.

TYPE_SCROLL_SENSITIVE означава, че ResultSet може да се премества (превърта) напред or назад. Можете също така да се преместите на позиция спрямо текущата позиция or да се преместите на абсолютна позиция.

ResultSet от този тип е чувствителен към промени в основния източник на данни, докато ResultSet е отворен. Тоест, ако запис в ResultSet бъде променен в базата данни от друга нишка or процес, той ще бъде отразен във вече отворениянабор от резултатиот този тип.

Паралелност

Паралелността на ResultSet определя дали ResultSet може да се актуализира or само да се чете.

Някои бази данни и JDBC драйвери поддържат актуализиране на ResultSet, но не всички. Методът DatabaseMetaData.supportsResultSetConcurrency(int concurrency) връща true or false в зависимост от това дали дадения режим на едновременност се поддържа or не.

ResultSet може да има едно от двете нива на паралелност:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY означава, че ResultSet може само да се чете.

CONCUR_UPDATABLE означава, че ResultSet може да бъде прочетен и модифициран.

Пример за промяна на данни в базата данни

С тези параметри можете да контролирате генерирания Statement и неговия ResultSet.

Например, можете да създадете обновяем ResultSet и да го използвате, за да промените базата данни. Когато създавате Изявление, е важно да спазвате следните условия:

  • посочена е само една table
  • не съдържа клаузи за присъединяване or групиране
  • колоните на заявката трябва да съдържат първичен ключ

Когато горните условия са изпълнени, актуализираният ResultSet може да се използва за актуализиране на table в базата данни. Когато създавате обект Statement, трябва да посочите следните параметри:

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

Резултатът от изпълнението на такъв израз е набор от резултати, който може да се актуализира. Методът за актуализиране е да преместите курсора ResultSet до реда, който искате да актуализирате, и след това да извикате метода updateXXX() .

Методът updateXXX работи подобно на метода getXXX() . Методът updateXXX() има два параметъра. Първият е номерът на колоната, която се актуализира, което може да бъде име на колона or сериен номер. Второто са данните, които трябва да бъдат актуализирани и този тип данни трябва да е същият като XXX.

За да актуализирате действително реда в базата данни, трябва да извикате метода updateRow(), преди курсорът ResultSet да напусне променения ред, в противен случай промените няма да влязат в базата данни.

Можете също да добавите нови редове към tableта:

Първо трябва да преместите курсора на празен ред. За да направите това, извикайте метода moveToInsertRow() .

След това трябва да попълните този ред с данни, като използвате метода updateXXX() .

След това трябва да извикате метода inserterRow() , за да добавите реда към основата.

И накрая, трябва да върнете курсора обратно, като извикате метода moveToCurrentRow() .

важно! Не всички СУБД поддържат тези опции за разширения оператор. В случай на проблеми вижте официалната documentация на конкретна СУБД.