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,StatementiResultSet— 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
finallynie 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
Connectionw bloku try-with-resources. - Utworzyć obiekt
Statement(lub, jeszcze lepiej,PreparedStatement). - Wywołać
executeQueryi 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.getConnectionotwiera obiektConnection.Statementwysyła SQL;executeQueryzwraca obiektResultSet, aexecuteUpdatezwraca 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ć
SQLExceptionz 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
- Podstawy JDBC
- PreparedStatement
- Transakcje
- Pula połączeń z HikariCP