JDBC - szybki przewodnik

Co to jest JDBC?

JDBC oznacza Java Database Connectivity, czyli standardowy interfejs API języka Java zapewniający niezależną od bazy danych łączność między językiem programowania Java a szeroką gamą baz danych.

Biblioteka JDBC zawiera interfejsy API dla każdego z zadań często związanych z użyciem bazy danych:

  • Nawiązywanie połączenia z bazą danych

  • Tworzenie instrukcji SQL lub MySQL

  • Wykonywanie zapytań SQL lub MySQL w bazie danych

  • Przeglądanie i modyfikowanie wynikowych rekordów

Warunek wstępny:

Aby nauczyć się JDBC, musisz dobrze rozumieć następujące dwa tematy:

  • Podstawowe programowanie w języku JAVA

  • Baza danych SQL lub MySQL

JDBC - Konfiguracja środowiska:

Upewnij się, że wykonałeś następującą konfigurację:

  • Instalacja jądra JAVA

  • Instalacja bazy danych SQL lub MySQL

Oprócz powyższego musisz skonfigurować bazę danych, której użyjesz w swoim projekcie. Zakładając, że jest to EMP i utworzyłeś pracowników w tabeli w tej samej bazie danych.

Tworzenie aplikacji JDBC:

Tworzenie aplikacji JDBC obejmuje sześć kroków, które omówię w tym samouczku:

Importuj paczki:

Wymaga to dołączenia pakietów zawierających klasy JDBC potrzebne do programowania bazy danych. Najczęściej użycie importu java.sql. * Jest wystarczające w następujący sposób:

//STEP 1. Import required packages
import java.sql.*;

Zarejestruj sterownik JDBC:

Wymaga to zainicjowania sterownika, aby można było otworzyć kanał komunikacyjny z bazą danych. Poniżej znajduje się fragment kodu, aby to osiągnąć:

//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");

Otwórz połączenie:

Wymaga to użycia metody DriverManager.getConnection () w celu utworzenia obiektu Connection, który reprezentuje fizyczne połączenie z bazą danych w następujący sposób:

//STEP 3: Open a connection
//  Database credentials
static final String USER = "username";
static final String PASS = "password";
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);

Wykonaj zapytanie:

Wymaga to użycia obiektu typu Statement lub PreparedStatement do zbudowania i przesłania instrukcji SQL do bazy danych w następujący sposób:

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

Jeśli wymagana jest instrukcja SQL UPDATE, INSERT lub DELETE, wymagany będzie następujący fragment kodu:

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);

Wyodrębnij dane z zestawu wyników:

Ten krok jest wymagany w przypadku pobierania danych z bazy danych. Możesz użyć odpowiedniej metody ResultSet.getXXX (), aby pobrać dane z zestawu wyników w następujący sposób:

//STEP 5: Extract data from result set
while(rs.next()){
    //Retrieve by column name
    int id  = rs.getInt("id");
    int age = rs.getInt("age");
    String first = rs.getString("first");
    String last = rs.getString("last");

    //Display values
    System.out.print("ID: " + id);
    System.out.print(", Age: " + age);
    System.out.print(", First: " + first);
    System.out.println(", Last: " + last);
}

Oczyść środowisko:

Należy jawnie zamknąć wszystkie zasoby bazy danych zamiast polegać na wyrzucaniu elementów bezużytecznych maszyny JVM w następujący sposób:

//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();

Pierwszy program JDBC:

Na podstawie powyższych kroków możemy mieć następujący skonsolidowany kod przykładowy, którego możemy użyć jako szablonu podczas pisania naszego kodu JDBC:

Ten przykładowy kod został napisany na podstawie ustawień środowiska i bazy danych opisanych w rozdziale Środowisko.

//STEP 1. Import required packages
import java.sql.*;

public class FirstExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/EMP";

   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";
   
   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      stmt = conn.createStatement();
      String sql;
      sql = "SELECT id, first, last, age FROM Employees";
      ResultSet rs = stmt.executeQuery(sql);

      //STEP 5: Extract data from result set
      while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");

         //Display values
         System.out.print("ID: " + id);
         System.out.print(", Age: " + age);
         System.out.print(", First: " + first);
         System.out.println(", Last: " + last);
      }
      //STEP 6: Clean-up environment
      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end FirstExample

Teraz skompilujmy powyższy przykład w następujący sposób:

C:\>javac FirstExample.java
C:\>

Kiedy biegasz FirstExample, daje następujący wynik:

C:\>java FirstExample
Connecting to database...
Creating statement...
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
C:\>

Metody SQLException:

SQLException może wystąpić zarówno w sterowniku, jak iw bazie danych. Gdy wystąpi taki wyjątek, obiekt typu SQLException zostanie przekazany do klauzuli catch.

Przekazany obiekt SQLException ma dostępne następujące metody pobierania dodatkowych informacji o wyjątku:

metoda Opis
getErrorCode () Pobiera numer błędu skojarzony z wyjątkiem.
getMessage () Pobiera komunikat o błędzie sterownika JDBC dotyczący błędu obsługiwanego przez sterownik lub numer błędu Oracle i komunikat o błędzie bazy danych.
getSQLState () Pobiera ciąg XOPEN SQLstate. W przypadku błędu sterownika JDBC ta metoda nie zwraca żadnych przydatnych informacji. W przypadku błędu bazy danych zwracany jest pięciocyfrowy kod XOPEN SQLstate. Ta metoda może zwrócić wartość null.
getNextException () Pobiera następny obiekt Exception w łańcuchu wyjątków.
printStackTrace () Wyświetla bieżący wyjątek lub obiekt do rzucania oraz jego śledzenie wstecz do standardowego strumienia błędów.
printStackTrace (PrintStream s) Drukuje ten obiekt do rzucania i jego śledzenie wstecz do określonego strumienia wydruku.
printStackTrace (PrintWriter w) Drukuje ten obiekt do rzucania i jego ślad w zapisie wydruku, który określisz.

Wykorzystując informacje dostępne w obiekcie Exception, można wychwycić wyjątek i odpowiednio kontynuować program. Oto ogólna forma bloku próbnego:

try {
   // Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
   // Your exception handling code goes between these 
   // curly braces, similar to the exception clause 
   // in a PL/SQL block.
}
finally {
   // Your must-always-be-executed code goes between these 
   // curly braces. Like closing database connection.
}

JDBC - typy danych:

Poniższa tabela zawiera podsumowanie domyślnego typu danych JDBC, na który konwertowany jest typ danych Java po wywołaniu metody setXXX () obiektu PreparedStatement lub CallableStatement albo metody ResultSet.updateXXX ().

SQL JDBC / Java setXXX updateXXX
VARCHAR java.lang.String setString updateString
ZWĘGLAĆ java.lang.String setString updateString
LONGVARCHAR java.lang.String setString updateString
KAWAŁEK boolean setBoolean updateBoolean
NUMERYCZNE java.math.BigDecimal setBigDecimal updateBigDecimal
TINYINT bajt setByte updateByte
SMALLINT krótki setShort updateShort
LICZBA CAŁKOWITA int setInt updateInt
BIGINT długo setLong updateLong
REAL pływak setFloat updateFloat
PŁYWAK pływak setFloat updateFloat
PODWÓJNIE podwójnie setDouble updateDouble
VARBINARY bajt [] setBytes updateBytes
DWÓJKOWY bajt [] setBytes updateBytes
DATA java.sql.Date ustawić datę updateDate
CZAS java.sql.Time setTime czas aktualizacji
ZNAK CZASU java.sql.Timestamp setTimestamp updateTimestamp
CLOB java.sql.Clob setClob updateClob
KROPELKA java.sql.Blob setBlob updateBlob
SZYK java.sql.Array setARRAY updateARRAY
REF java.sql.Ref SetRef updateRef
STRUKTURA java.sql.Struct SetStruct updateStruct

JDBC 3.0 ma ulepszoną obsługę typów danych BLOB, CLOB, ARRAY i REF. Obiekt ResultSet ma teraz metody updateBLOB (), updateCLOB (), updateArray () i updateRef (), które umożliwiają bezpośrednie manipulowanie odpowiednimi danymi na serwerze.

Metody setXXX () i updateXXX () umożliwiają konwersję określonych typów Java do określonych typów danych JDBC. Metody setObject () i updateObject () umożliwiają odwzorowanie prawie każdego typu Java na typ danych JDBC.

Obiekt ResultSet zapewnia odpowiednią metodę getXXX () dla każdego typu danych w celu pobrania wartości kolumny. Każda metoda może być używana z nazwą kolumny lub jej pozycją porządkową.

SQL JDBC / Java setXXX getXXX
VARCHAR java.lang.String setString getString
ZWĘGLAĆ java.lang.String setString getString
LONGVARCHAR java.lang.String setString getString
KAWAŁEK boolean setBoolean getBoolean
NUMERYCZNE java.math.BigDecimal setBigDecimal getBigDecimal
TINYINT bajt setByte getByte
SMALLINT krótki setShort getShort
LICZBA CAŁKOWITA int setInt getInt
BIGINT długo setLong getLong
REAL pływak setFloat getFloat
PŁYWAK pływak setFloat getFloat
PODWÓJNIE podwójnie setDouble getDouble
VARBINARY bajt [] setBytes getBytes
DWÓJKOWY bajt [] setBytes getBytes
DATA java.sql.Date ustawić datę getDate
CZAS java.sql.Time setTime uzyskać czas
ZNAK CZASU java.sql.Timestamp setTimestamp getTimestamp
CLOB java.sql.Clob setClob getClob
KROPELKA java.sql.Blob setBlob getBlob
SZYK java.sql.Array setARRAY getARRAY
REF java.sql.Ref SetRef getRef
STRUKTURA java.sql.Struct SetStruct getStruct

JDBC - przetwarzanie wsadowe:

Przetwarzanie wsadowe umożliwia grupowanie powiązanych instrukcji SQL we wsad i przesyłanie ich jednym wywołaniem do bazy danych.

Wysyłając jednocześnie kilka instrukcji SQL do bazy danych, zmniejszasz obciążenie komunikacyjne, poprawiając w ten sposób wydajność.

  • Do obsługi tej funkcji nie są wymagane sterowniki JDBC. Aby określić, czy docelowa baza danych obsługuje przetwarzanie aktualizacji wsadowych, należy użyć metody DatabaseMetaData.supportsBatchUpdates () . Metoda zwraca wartość „prawda”, jeśli sterownik JDBC obsługuje tę funkcję.

  • Plik addBatch()Metoda Statement, PreparedStatement i CallableStatement służy do dodawania poszczególnych instrukcji do partii. PlikexecuteBatch() służy do rozpoczęcia wykonywania wszystkich zgrupowanych instrukcji.

  • Plik executeBatch() zwraca tablicę liczb całkowitych, a każdy element tablicy reprezentuje liczbę aktualizacji dla odpowiedniej instrukcji update.

  • Tak jak możesz dodać instrukcje do partii w celu przetworzenia, możesz je usunąć za pomocą clearBatch()metoda. Ta metoda usuwa wszystkie instrukcje dodane za pomocą metody addBatch (). Nie możesz jednak wybiórczo wybrać, które oświadczenie chcesz usunąć.

JDBC - przesyłanie strumieniowe danych:

Obiekt PreparedStatement ma możliwość używania strumieni wejściowych i wyjściowych do dostarczania danych parametrów. Umożliwia to umieszczanie całych plików w kolumnach bazy danych, które mogą zawierać duże wartości, takie jak typy danych CLOB i BLOB.

Istnieją następujące metody, których można użyć do strumieniowego przesyłania danych:

  • setAsciiStream(): Ta metoda służy do dostarczania dużych wartości ASCII.

  • setCharacterStream(): Ta metoda służy do dostarczania dużych wartości UNICODE.

  • setBinaryStream(): Ta metoda służy do dostarczania dużych wartości binarnych.

Metoda setXXXStream () wymaga dodatkowego parametru, rozmiaru pliku, oprócz symbolu zastępczego parametru. Ten parametr informuje sterownik, ile danych należy przesłać do bazy danych za pomocą strumienia.

Aby uzyskać szczegółowe informacje na temat wszystkich tych koncepcji, musisz przejść przez cały samouczek.