0Pricing
Java Academy · Lekcja

Podstawy JDBC

Połączenia, instrukcje i zestawy wyników

Podstawy JDBC to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Czym jest JDBC?

JDBC (Java Database Connectivity) to standardowe API służące do komunikacji z relacyjnymi bazami danych z poziomu Javy.

  • Znajduje się w pakiecie java.sql.
  • Każda baza danych jest dostarczana ze sterownikiem, który implementuje interfejsy JDBC.
  • Kod pisze się z użyciem interfejsów takich jak Connection, Statement i ResultSet — nigdy bezpośrednio z użyciem klas dostawcy.

Ta abstrakcja pozwala, aby ten sam kod działał z bazami PostgreSQL, MySQL, H2 lub Oracle.

Najważniejsze interfejsy

Trzy interfejsy wykonują większość pracy:

  • Connection — otwarta sesja z bazą danych.
  • Statement / PreparedStatement — wysyła instrukcje SQL.
  • ResultSet — kursor przechodzący po wierszach zwróconych przez zapytanie.

Obiekt Connection uzyskuje się z DriverManager lub DataSource.

Otwieranie połączenia

DriverManager.getConnection(url, user, password) zwraca aktywne połączenie Connection.

Adres URL JDBC identyfikuje bazę danych, na przykład jdbc:postgresql://localhost:5432/shop. Nowoczesne sterowniki rejestrują się automatycznie, dlatego nie trzeba już wywoływać Class.forName(...).

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
            System.out.println("Connected: " + !conn.isClosed());
        } catch (SQLException e) {
            System.out.println("Connection failed: " + e.getMessage());
        }
    }
}

try-with-resources

Connection, Statement i ResultSet implementują AutoCloseable.

Zawsze należy otwierać je wewnątrz bloku try-with-resources, aby zamykały się automatycznie — nawet w przypadku zgłoszenia wyjątku. Pozostawione bez zamknięcia połączenia szybko wyczerpują dostępne połączenia z bazą danych.

  • Zasoby zamykane są w odwrotnej kolejności.
  • Blok finally nie jest potrzebny.

Wykonywanie zapytania

W przypadku prostego SELECT należy utworzyć obiekt Statement i wywołać executeQuery, które zwraca obiekt ResultSet.

Przykład korzysta z symulacji w pamięci, aby można było zobaczyć cały przebieg bez rzeczywistej bazy danych. W środowisku produkcyjnym instrukcja SQL byłaby wykonywana za pośrednictwem połączenia.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Simulated result of: SELECT name FROM users
        List<String> names = List.of("Ada", "Linus", "Grace");
        System.out.println("Query returned " + names.size() + " rows:");
        for (String name : names) {
            System.out.println(" - " + name);
        }
    }
}

Odczytywanie obiektu ResultSet

Obiekt ResultSet rozpoczyna się przed pierwszym wierszem. Należy wywoływać rs.next() w pętli; zwraca ono false, gdy nie ma już kolejnych wierszy.

Kolumny można odczytywać po nazwie lub za pomocą indeksu liczonego od 1, korzystając z typowanych metod odczytu:

  • rs.getInt("id")
  • rs.getString("name")
  • rs.getDouble("price")
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret");
             Statement st = conn.createStatement();
             ResultSet rs = st.executeQuery("SELECT id, name FROM users")) {
            while (rs.next()) {
                System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

executeUpdate w przypadku zapisów

W przypadku INSERT, UPDATE i DELETE należy używać executeUpdate. Zwraca ono wartość typu int: liczbę zmodyfikowanych wierszy.

Metody execute należy używać tylko wtedy, gdy z góry nie wiadomo, czy instrukcja zwróci zbiór wyników.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret");
             Statement st = conn.createStatement()) {
            int rows = st.executeUpdate("DELETE FROM sessions WHERE expired = true");
            System.out.println("Deleted " + rows + " rows");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

Mapowanie wierszy na obiekty

Większość aplikacji przekształca każdy wiersz w obiekt domenowy. Należy przejść po obiekcie ResultSet i utworzyć instancje.

Oto schemat przedstawiony w symulacji, aby można go było uruchomić samodzielnie. record ułatwia zwięzłe mapowanie.

import java.util.ArrayList;
import java.util.List;

public class Main {
    record User(int id, String name) {}

    public static void main(String[] args) {
        // Stand-in for iterating a ResultSet
        String[][] rows = {{"1", "Ada"}, {"2", "Linus"}};
        List<User> users = new ArrayList<>();
        for (String[] row : rows) {
            users.add(new User(Integer.parseInt(row[0]), row[1]));
        }
        users.forEach(System.out::println);
    }
}

Obsługa SQLException

Niemal każda metoda JDBC zgłasza sprawdzany wyjątek SQLException.

Zawiera on przydatne informacje diagnostyczne:

  • getMessage() — tekst zrozumiały dla człowieka.
  • getSQLState() — standardowy 5-znakowy kod stanu.
  • getErrorCode() — kod zależny od dostawcy.

Należy rejestrować te informacje zamiast je ignorować.

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        SQLException e = new SQLException("duplicate key", "23505", 7);
        System.out.println("Message: " + e.getMessage());
        System.out.println("SQLState: " + e.getSQLState());
        System.out.println("ErrorCode: " + e.getErrorCode());
    }
}

DatabaseMetaData

conn.getMetaData() zwraca obiekt DatabaseMetaData opisujący samą bazę danych.

Może podać nazwę i wersję produktu, obsługiwane funkcje, a nawet listę tabel i kolumn. W ten sposób działają narzędzia takie jak przeglądarki schematów — bez wpisywania na sztywno informacji o dostawcy.

Połączenie wszystkich elementów

Przykładowy przebieg odczytu:

  • Otworzyć obiekt Connection w bloku try-with-resources.
  • Utworzyć obiekt Statement (lub, jeszcze lepiej, PreparedStatement).
  • Wywołać executeQuery i iterować za pomocą rs.next().
  • Zmapować kolumny na obiekty.
  • Pozostawić zamknięcie wszystkich zasobów blokowi try-with-resources.

W następnej lekcji poznają Państwo sposób zabezpieczania zapytań przed wstrzyknięciem.

Szybkie sprawdzenie

Co zwraca Statement.executeUpdate?

Podsumowanie

Znają już Państwo podstawowy przebieg pracy z JDBC:

  • DriverManager.getConnection otwiera obiekt Connection.
  • Statement wysyła SQL; executeQuery zwraca obiekt ResultSet, a executeUpdate zwraca liczbę zmodyfikowanych wierszy.
  • Należy iterować za pomocą rs.next() i typowanych metod odczytu.
  • Zawsze należy używać konstrukcji try-with-resources oraz obsługiwać SQLException z uwzględnieniem jej kodu stanu i kodów błędów.

Często zadawane pytania

Czy lekcja „Podstawy JDBC” jest bezpłatna?

Tak — pełny tekst „Podstawy JDBC” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Podstawy JDBC”?

Połączenia, instrukcje i zestawy wyników Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Podstawy JDBC”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy JDBC
  2. PreparedStatement
  3. Transakcje
  4. Pula połączeń z HikariCP
← Powrót do Java Academy