JDBC

Standardowe API w Javie do łączenia się z bazami danych i wykonywania zapytań SQL. Zapewnia jednolity sposób dostępu niezależny od silnika bazy.

JDBC (Java Database Connectivity) to standardowe API w Javie, które pozwala Twojemu programowi gadać z bazą danych: nawiązać połączenie, wysłać zapytanie SQL i odebrać wyniki. Najważniejsze jest słowo standardowe — JDBC definiuje zestaw interfejsów (w pakiecie java.sql), a konkretną robotę odwala sterownik (driver) dostarczany przez producenta bazy. Dzięki temu Twój kod wygląda prawie tak samo, czy pod spodem siedzi PostgreSQL, MySQL, Oracle czy SQLite. Zmienia się głównie URL połączenia i biblioteka sterownika.

Jak to działa

Mechanika jest prosta: ładujesz sterownik (od Javy 6 dzieje się to automatycznie, jeśli driver jest na classpath), prosisz o połączenie przez DriverManager.getConnection(url, user, password), a potem dostajesz obiekt Connection. Z niego tworzysz Statement lub PreparedStatement, wykonujesz zapytanie i czytasz wynik z ResultSet — taki kursor po wierszach, po którym idziesz metodą next().

JDBC to warstwa najniższego poziomu. Bywa gadatliwe, dlatego w realnych projektach rzadko piszesz je gołą ręką — częściej używasz nadbudówek typu Hibernate, JPA, MyBatis czy Spring JDBC. Ale wszystkie one i tak siedzą na JDBC, więc znajomość podstaw ratuje Ci skórę, gdy ORM zaczyna robić dziwne rzeczy.

Przykład z praktyki

Załóżmy, że masz PostgreSQL i chcesz pobrać użytkownika po ID. Sterownik dorzucasz jako zależność (np. org.postgresql:postgresql w Mavenie/Gradle), a kod wygląda mniej więcej tak:

  1. URL: jdbc:postgresql://localhost:5432/sklep
  2. Zapytanie z parametrem: SELECT email FROM users WHERE id = ?
  3. Wstawiasz wartość przez ps.setInt(1, userId) i odpalasz ps.executeQuery()

Całość warto opakować w try-with-resourcesConnection, Statement i ResultSet implementują AutoCloseable, więc zamkną się same i nie wyciekną Ci połączenia.

Częste błędy

  • Sklejanie SQL ze stringów — to prosta droga do SQL injection. Zawsze używaj PreparedStatement z placeholderami ?, a nie konkatenacji.
  • Niezamykanie zasobów — porzucone Connection wyczerpuje pulę połączeń i kładzie aplikację. try-with-resources to standard.
  • Otwieranie połączenia na każde zapytanie — drogie. W produkcji używaj puli (connection pool) jak HikariCP zamiast wołać DriverManager za każdym razem.
  • Mit, że JDBC = ORM — nie, JDBC samo nie mapuje wierszy na obiekty. Od tego są właśnie biblioteki wyżej.

Pojęcia powiązane: SQL, JPA, Hibernate, ORM, connection pool (HikariCP), DataSource, PreparedStatement, ODBC (odpowiednik spoza świata Javy).