Personalizare ResultSet

API-ul modern JDBC vă permite să personalizați foarte mult obiectele.AfirmațieȘisetul de rezultate. De exemplu, folosindsetul de rezultateputeți schimba rândurile din baza de date.

Când creăm un obiect declarație, putem transmite o mulțime de dorințe în el. Aceste dorințe pot fi împărțite în trei grupuri:

  • Tip conexiune de bază
  • Controlul accesului simultan
  • Persistență și tranzacții

Acești parametri pot fi transferați la crearea unui obiectAfirmațiesauDeclarație pregătită. Exemplu:

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);

Nu vom studia aceste lucruri în profunzime, dar vreau să știți că acest lucru este posibil dacă întâlniți ceva similar în codul altcuiva.

Tipuri ResultSet

ResultSet poate fi de un anumit tip. Tipul definește unele dintre caracteristicile și capacitățile ResultSet-ului.

Nu toate tipurile sunt acceptate de toate bazele de date și driverele JDBC. Va trebui să vă verificați baza de date și driverul JDBC pentru a vedea dacă acesta acceptă tipul pe care doriți să îl utilizați. Metoda DatabaseMetaData.supportsResultSetType(int type) returnează adevărat sau fals , în funcție de dacă tipul dat este acceptat sau nu.

La momentul scrierii, există trei tipuri de ResultSet:

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

Tipul implicit este TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY înseamnă că ResultSet poate fi mutat numai înainte. Adică vă puteți deplasa doar de pe rândul 1, rândul 2, rândul 3 etc. Într-un ResultSet, nu vă puteți deplasa înapoi: nu puteți citi date de pe al 9-lea rând după ce ați citit al zecelea.

TYPE_SCROLL_INSENSITIVE înseamnă că ResultSet poate fi mutat (defilat) înainte sau înapoi. De asemenea, puteți să vă mutați într-o poziție relativă la poziția curentă sau să vă mutați într-o poziție absolută.

Un ResultSet de acest tip este insensibil la modificările aduse sursei de date subiacente în timp ce ResultSet este deschis. Adică, dacă o intrare din ResultSet este modificată în baza de date de către un alt fir sau proces, aceasta nu se va reflecta în fișierul deja deschis.setul de rezultatede acest tip.

TYPE_SCROLL_SENSITIVE înseamnă că ResultSet poate fi mutat (defilat) înainte sau înapoi. De asemenea, puteți să vă mutați într-o poziție relativă la poziția curentă sau să vă mutați într-o poziție absolută.

Un ResultSet de acest tip este sensibil la modificările sursei de date subiacente în timp ce ResultSet este deschis. Adică, dacă o intrare din ResultSet este modificată în baza de date de către un alt fir sau proces, aceasta se va reflecta în lista deja deschisă.setul de rezultatede acest tip.

Concurență

Concurența unui ResultSet determină dacă ResultSet poate fi actualizat sau doar citit.

Unele baze de date și drivere JDBC acceptă actualizarea unui ResultSet, dar nu toate. Metoda DatabaseMetaData.supportsResultSetConcurrency(int concurrency) returnează adevărat sau fals , în funcție de dacă modul de concurență dat este acceptat sau nu.

ResultSet poate avea unul dintre cele două niveluri de concurență:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY înseamnă că Setul de rezultate poate fi citit numai.

CONCUR_UPDATABLE înseamnă că ResultSet poate fi citit și modificat.

Un exemplu de modificare a datelor din baza de date

Cu acești parametri, puteți controla declarația generată și Setul de rezultate ale acestuia.

De exemplu, puteți crea un ResultSet actualizabil și îl puteți utiliza pentru a schimba baza de date. Când creați o declarație, este important să respectați următoarele condiții:

  • este specificat un singur tabel
  • nu conține clauze de alăturare sau grupare după
  • coloanele de interogare trebuie să conțină o cheie primară

Când sunt îndeplinite condițiile de mai sus, ResultSet-ul actualizat poate fi utilizat pentru a actualiza un tabel din baza de date. Când creați un obiect Statement, trebuie să specificați următorii parametri:

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

Rezultatul executării unei astfel de instrucțiuni este un set de rezultate actualizabil. Metoda de actualizare este să mutați cursorul ResultSet pe rândul pe care doriți să îl actualizați și apoi să apelați metoda updateXXX() .

Metoda updateXXX funcționează similar cu metoda getXXX() . Metoda updateXXX() are doi parametri. Primul este numărul coloanei care se actualizează, care poate fi un nume de coloană sau un număr de serie. Al doilea sunt datele care trebuie actualizate, iar acest tip de date trebuie să fie același cu XXX.

Pentru a actualiza efectiv rândul din baza de date, trebuie să apelați metoda updateRow() înainte ca cursorul ResultSet să părăsească rândul modificat, altfel modificările nu vor intra în baza de date.

De asemenea, puteți adăuga rânduri noi la tabel:

Mai întâi trebuie să mutați cursorul pe o linie goală. Pentru a face acest lucru, apelați metoda moveToInsertRow() .

Apoi trebuie să completați acest rând cu date folosind metoda updateXXX() .

Apoi trebuie să apelați metoda inserterRow() pentru a adăuga rândul la bază.

Și, în sfârșit, trebuie să întoarceți cursorul înapoi apelând metoda moveToCurrentRow() .

Important! Nu toate SGBD-urile acceptă aceste opțiuni pentru declarația extinsă. În caz de probleme, consultați documentația oficială a unui anumit SGBD.