Database
 sql >> Baza danych >  >> RDS >> Database

Jak utworzyć przewijalny, aktualizowalny obiekt ResultSet w JDBC?

Pobierając listę rekordów za pomocą zapytań, często musimy przechowywać je w obiekcie, który umożliwia przechodzenie tam iz powrotem, aktualizując w razie potrzeby. Ten artykuł ilustruje tę powszechnie potrzebną technikę programowania baz danych za pomocą jawnych kodów i przykładowych scenariuszy.

O Zestawie wyników

Zestaw wyników to interfejs zdefiniowany w java.sql pakiet. Reprezentuje tabelę danych zwracanych przez Oświadczenie obiekt. Oświadczenie obiekt służy do wykonywania zapytań SQL do bazy danych. Obiekt ResultSet utrzymuje kursor wskazujący na bieżący rekord w tabeli bazy danych. W rezultacie można go skutecznie wykorzystać do pozycjonowania w różnych rzędach, tam iz powrotem za pomocą first() , poprzedni() , następny() i last() metody zgodnie z wymaganiami. Początkowo Zestaw wyników obiekt znajduje się w miejscu przed pierwszym rzędem. To jest powód, dla którego ResultSet przemierzanie zawsze zaczyna się w następujący sposób:

while(resultSet.next()) {

   // ...

}

Pamiętaj, że Zestaw wyników obiekt jest umieszczany w pierwszym wierszu przez wykonanie next() metody podczas wchodzenia do pętli, ponieważ, jak już wspomniano, ResultSet obiekt znajduje się początkowo na pozycji tuż przed pierwszym rzędem. Tak więc musi być umieszczony przynajmniej w pierwszym wierszu, na przykład, aby uzyskać poprawny rekord. Może być traktowana jako wartość -1 w pozycji tablicy, na którą wskazuje wskaźnik/indeks. Aby uzyskać jakąkolwiek prawidłową wartość z tablicy, należy ją najpierw przenieść co najmniej do położenia 0.

Teraz, jak wspomnieliśmy, możemy przewijać rekordy za pomocą ResultSet obiekt. Ale ta umiejętność nie jest dostępna domyślnie. Domyślne zachowanie ResultSet obiekt jest taki, że nie można go aktualizować, a kursor, którego jest właścicielem, porusza się w jednym kierunku, tylko do przodu. Oznacza to, że możemy przeglądać rekordy tylko raz i tylko w przód. Istnieją jednak sposoby na uczynienie go elastycznym, tak aby ResultSet można nie tylko aktualizować, ale także przewijać.

Zobaczymy je za minutę w dwóch osobnych programach.

Przewijalny Zestaw wyników

Najpierw utwórzmy ResultSet obiekt przewijalny. Przewijalny oznacza, że ​​po zestawie wyników obiekt został utworzony, możemy przechodzić przez pobrane rekordy w dowolnym kierunku, do przodu i do tyłu, jak chcemy. Zapewnia to możliwość odczytania ostatniego rekordu, pierwszego rekordu, następnego rekordu i poprzedniego rekordu.

package org.mano.example;
import java.sql.*;
public class App
{
   static final String JDBC_DRIVER =
      "com.mysql.cj.jdbc.Driver";
   static final String DB_URL =
      "jdbc:mysql://localhost:3306/employees";
   static final String USER = "root";
   static final String PASS = "secret";
   static final String SQL =
      "SELECT * FROM employees ORDER BY first_name";

   public static void main( String[] args )
   {
      Connection connection = null;
      ResultSet rs = null;
      try {
         Class.forName(JDBC_DRIVER);
         connection = DriverManager.getConnection
            (DB_URL, USER, PASS);
         System.out.println("n1. Connection established");
      }catch(Exception ex) {
         ex.printStackTrace();
      }

      try (PreparedStatement pstmt =
            connection.prepareStatement(SQL,
         ResultSet.TYPE_SCROLL_INSENSITIVE,
         ResultSet.CONCUR_READ_ONLY);){
            System.out.println("n2.
               Executing SQL query...");
            rs = pstmt.executeQuery();
            System.out.println("n3.
               ResultSet object created successfully.");
            System.out.println("n4.
               Now some RecordSet scrolling starts...");

            rs.first();
            show(rs);
            rs.last();
            show(rs);
            rs.previous();
            rs.previous();
            show(rs);
            rs.next();
            show(rs);

            System.out.println("nn5. That's all.
               RecordSet scrolling ends.");
      }catch(SQLException ex){
         ex.printStackTrace();
      }finally{
         try {
            connection.close();
         }catch(SQLException ex){
         }
      }
   }
   public static void show(ResultSet rs) throws
         SQLException{
      System.out.printf
         ("n--------------------------------"+
            "-------------------------------------");
      System.out.printf("n%7d | %10s | %10s | %s
         | %s | %s ",rs.getLong("emp_no"),
         rs.getString("first_name"),
         rs.getString("last_name"),
         rs.getDate("birth_date").toString(),
         rs.getDate("hire_date"),
         rs.getString("gender"));
      System.out.printf
         ("n---------------------------------"+
         "------------------------------------");
   }
}

Wyjście

  1. Połączenie nawiązane.
  2. Wykonywanie zapytania SQL…
  3. Obiekt ResultSet został pomyślnie utworzony.
  4. Teraz zaczyna się przewijanie RecordSet…
    -------------------------------------------------------------
     497615 |  Aamer  |  McDermid   | 1954-11-18 | 1985-04-24 | M
    -------------------------------------------------------------
    -------------------------------------------------------------
     484995 |  Zvonko |  Lakshmanan | 1964-11-04 | 1992-12-04 | M
    -------------------------------------------------------------
    -------------------------------------------------------------
     482000 |  Zvonko |  Cannata    | 1960-11-23 | 1986-08-13 | M
    -------------------------------------------------------------
    -------------------------------------------------------------
     483497 |  Zvonko |  Pollacia   | 1961-12-26 | 1985-08-01 | M
    -------------------------------------------------------------
    
  5. To wszystko. Przewijanie RecordSet kończy się.

Zwróć uwagę, że przewijany Zestaw wyników obiekt jest wynikiem wykonania executeQuery() metoda uzyskana przez instancję Statement lub Przygotowane oświadczenie . Typ zestawu wyników obiekt, który chcemy utworzyć, musi być wyraźnie zadeklarowany w Oświadczenie obiektu przez zdefiniowane stałe typu przewijania.

  • ResultSet.TYPE_FORWARD_ONLY: To jest typ domyślny.
  • ResultSet.TYPE_SCROLL_INSENSITIVE: Umożliwia ruch w przód iw tył, ale jest niewrażliwy na ResultSet aktualizacje.
  • ResultSet.TYPE_SCROLL_SENSITIVE: Umożliwia ruch w przód iw tył, ale jest wrażliwy na ResultSet aktualizacje.

Używane są inne stałe, takie jak CONCUR_READ_ONLY , co oznacza, że ​​ResultSet nie można aktualizować. Istnieje inna stała, CONCUR_UPDATABLE , co oznacza coś przeciwnego, czyli ResultSet można aktualizować.

Aktualizowany Zestaw wyników

Tworzenie aktualizowalnego zestawu wyników oznacza, że ​​rekord, na który wskazuje, jest nie tylko możliwy do przebycia, ale także do aktualizacji. Zmiany zostaną natychmiast utrwalone w bazie danych i odzwierciedlone przez ResultSet obiekt w czasie rzeczywistym.

package org.mano.example;
import java.sql.*;
public class App
{
   static final String JDBC_DRIVER =
      "com.mysql.cj.jdbc.Driver";
   static final String DB_URL =
      "jdbc:mysql://localhost:3306/employees";
   static final String USER = "root";
   static final String PASS = "secret";
   static final String SQL =
      "SELECT * FROM employees WHERE emp_no = ?";
   public static void main( String[] args )
   {
      Connection connection = null;
      ResultSet rs = null;
      long emp_no = 484995;
      try {
         Class.forName(JDBC_DRIVER);
         connection = DriverManager.getConnection
            (DB_URL, USER, PASS);
         System.out.println("n1.
            Connection established");
      }catch(Exception ex) {
         ex.printStackTrace();
      }
      try(PreparedStatement pstmt =
            connection.prepareStatement(SQL,
         ResultSet.TYPE_SCROLL_SENSITIVE,
         ResultSet.CONCUR_UPDATABLE);){
            pstmt.setLong(1,emp_no);
            System.out.println("n2.
               Executing SQL query...");
            rs = pstmt.executeQuery();
            System.out.println("n3.
               ResultSet object created successfully.");
            while(rs.next()){
               show(rs);
               String fname = rs.getString("first_name");
               System.out.println("n4.
                  Updating name "+fname+" to Subham");
               rs.updateString("first_name", "Subham");
               rs.updateRow();
            }
            System.out.println("nn5.
               Record updated. See below.");
            rs.previous();
            show(rs);
      }catch(SQLException ex){
         ex.printStackTrace();
      }finally{
      try {
         rs.close();
         connection.close();
      }catch(SQLException ex){
      }
      }
   }
   public static void show(ResultSet rs)
         throwsSQLException{
      System.out.printf
         ("n--------------------------------"+
            "-------------------------------------");
      System.out.printf("n%7d | %10s | %10s | %s
            | %s | %s ",rs.getLong("emp_no"),
         rs.getString("first_name"),
         rs.getString("last_name"),
         rs.getDate("birth_date").toString(),
         rs.getDate("hire_date"),
         rs.getString("gender"));
         System.out.printf
            ("n---------------------------------"+
               "------------------------------------");
   }
}

Aktualizowany Zestaw wyników jest szczególnie przydatne, gdy chcemy zaktualizować pewne wartości po dokonaniu porównania poprzez przechodzenie tam iz powrotem przez pobrane rekordy. Proces tworzenia jest podobny do poprzedniego programu, ale ResultSet użyte tutaj stałe to TYPE_SCROLL_SENSITIVE i CONCUR_UPDATABLE .

Wniosek

W przeciwieństwie do domyślnego zachowania ResultSet umożliwia obiektowi większą elastyczność. Ta funkcja może być wykorzystana przez aplikację nie tylko do przeglądania rekordów, ale także do ich aktualizacji, aby zapewnić lepszą obsługę. Chociaż standardowe zachowanie zestawu wyników wydaje się dość nieefektywne w porównaniu z przewijalnym ResultSet , ma swoje własne zastosowanie i dlatego jest niezastąpiony.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. „Czy to jest tajemnica? Czy to bezpieczne?” Postępowanie z danymi wrażliwymi w modelowaniu danych

  2. Tłumaczenie danych Salesforce na format EDI

  3. Schemat płatka śniegu

  4. Co to jest indeks w SQL?

  5. Naucz się podstawowej analizy danych za pomocą funkcji okna SQL