Kurs JDBC – część 1

Zapraszam na szybki kurs JDBC – najprostszy kurs programowania aplikacji bazodanowych w języku Java z użyciem interfejsu JDBC. W pierwszej części kursu JDBC zapisywanie i odczytywanie danych z tabeli w bazie danych.

Dla niecierpliwych: Jeśli chcesz szybko uruchomić opisywaną w tej części kursu JDBC aplikację bazodanową, pobierz plik .zip wskazany na końcu tego tekstu, a następnie zajrzyj do mojego artykułu o importowaniu istniejącego projektu z plikiem budowania Apache Ant do Eclipse.

Elementy interfejsu JDBC

W pierwszej części kursu JDBC poznamy trzy podstawowe elementy interfejsu JDBC: interfejs Connection, interfejs Statement i interfejs ResultSet. Definicje tych interfejsów znajdują się w pakiecie java.sql zawartym w JDK SE, więc ich używanie nie wymaga instalacji żadnych dodatkowych pakietów oprogramowania. Natomiast definicje konkretnych klas implementujących te interfejsy zależą od konkretnego systemu zarządzania bazami danych, z którym ma współpracować tworzona aplikacja bazodanowa w języku Java, więc ich używanie wymaga instalacji właściwego sterownika JDBC przeznaczonego do komunikacji z odpowiednim serwerem baz danych.

Interfejs java.sql.Connection reprezentuje połączenie z bazą danych. Obiekt tego interfejsu tworzy się zazwyczaj przez wywołanie statycznej metody getConnection(…) klasy java.sql.DriverManager. W tej części kursu JDBC potrzebne nam metody interfejsu java.sql.Connection to: metoda createStatement() tworząca obiekt interfejsu java.sql.Statement oraz metoda close() zamykająca połączenie z bazą danych.

Interfejs java.sql.Statement umożliwia wykonywanie operacji na bazie danych, pobieranie i zapisywanie danych oraz wykonywanie instrukcji SQL. Obiekt tego interfejsu otrzymuje się zazwyczaj w aplikacji bazodanowej w języku Java przez wywołanie metody createStatement() interfejsu java.sql.Connection. W pierwszej części kursu JDBC potrzebne nam metody interfejsu java.sql.Statement to: metoda executeUpdate(…) wykonująca operacje zapisujące dane w bazie danych, metoda executeQuery(…) wykonująca operacje pobierające dane z bazy danych oraz metoda close() zwalniająca używane zasoby.

Interfejs java.sql.ResultSet reprezentuje tabelę z pobranymi danymi z bazy danych, zwykle będącą wynikiem wykonania pewnego zapytania do bazy danych. Obiekt tego interfejsu otrzymuje się zazwyczaj przez wywołanie metody executeQuery(…) interfejsu java.sql.Statement. W tej części kursu JDBC potrzebne nam metody interfejsu java.sql.ResultSet to: metoda next() przechodząca do następnego wiersza pobranej tabeli, metoda getString(…) odczytująca łańcuch znaków z kolumny o podanej nazwie z aktualnego wiersza tabeli oraz metoda close() zwalniająca używane zasoby.

Dokładne informacje o wymienionych interfejsach i ich metodach można znaleźć w dokumentacji pakietu java.sql języka Java.

Struktura bazy danych

Kurs JDBC zaczniemy od prostego programu w języku Java służącego do zarządzania informacjami o programistach. Informacje będą przechowywane w bazie danych w tabeli PROGRAMISTA o kolumnach ID, IMIE i NAZWISKO. Kolumna ID będzie zawierać unikalny identyfikator programisty, kolumna IMIE będzie zawierać imię programisty oraz kolumna NAZWISKO będzie zawierać nazwisko programisty.

W tej części kursu JDBC nie używamy żadnych bardziej zaawansowanych operacji bazodanowych, ani żadnych specyficznych dla konkretnego systemu zarządzania bazami danych instrukcji SQL, więc tworzona przykładowa aplikacja bazodanowa powinna współpracować z dowolną bazą danych. Dla ilustracji w tym kursie JDBC używam systemu zarządzania bazami danych PostgreSQL.

Potrzebną w tej części kursu JDBC tabelę PROGRAMISTA w PostgreSQL można utworzyć za pomocą następującej instrukcji SQL: CREATE TABLE programista (id SERIAL PRIMARY KEY, imie VARCHAR(80), nazwisko VARCHAR(80));. Instrukcja ta określa, że kolumna ID będzie typu SERIAL, dodatkowo będzie kluczem głównym tabeli, a kolumny IMIE i NAZWISKO będą typu VARCHAR(80). Typ SERIAL w PostgreSQL oznacza czterobajtową liczbę całkowitą ze znakiem (INTEGER) o wartościach uzupełnianych automatycznie przez PostgreSQL za pomocą sekwencji związanej z tabelą (o domyślnej nazwie PROGRAMISTA_ID_SEQ w tym przypadku) tworzonej automatycznie wraz z tabelą. Typ VARCHAR(80) w PostgreSQL oznacza łańcuch znaków zmiennej długości o maksymalnej długości 80 znaków.

Operacje w bazie danych

Po utworzeniu tabeli PROGRAMISTA w bazie danych, możemy przystąpić do napisania programu w języku Java z wykorzystaniem interfejsu JDBC, który połączy się z bazą danych i wykona podstawowe operacje bazodanowe na tabeli PROGRAMISTA. Zaczniemy od utworzenia klasy KursJDBC01, zapisanej oczywiście w pliku KursJDBC01.java, i metody main, w której zaimplementujemy całość programu. Dokładny kod całej klasy przedstawiam poniżej.

package pl.iprogramujesz.bazy.danych.kurs.jdbc;

import java.sql.*;

/*
	UWAGA 1: Przed kompilowaniem programu nalezy sprawdzic czy ustawienia polaczenia z baza danych sa poprawne (wiersz 15).
	UWAGA 2: Przed uruchomieniem programu nalezy utworzyc w bazie danych tabele PROGRAMISTA. Mozna zrobic to za pomoca nastepujacej instrukcji SQL (dla serwera baz danych PostgreSQL): CREATE TABLE programista (id SERIAL PRIMARY KEY, imie VARCHAR(80), nazwisko VARCHAR(80));
*/

public class KursJDBC01 {

	public static void main(String[] args) {
		try {
			DriverManager.registerDriver(new org.postgresql.Driver());
			Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "iProgramujesz.pl");
			Statement stmt = conn.createStatement();

			stmt.executeUpdate("INSERT INTO programista(imie, nazwisko) VALUES ('Andrzej', 'Kowalski')");
			stmt.executeUpdate("INSERT INTO programista(imie, nazwisko) VALUES ('Jan', 'Nowak')");

			ResultSet rs = stmt.executeQuery("SELECT * FROM programista");
			while(rs.next()) {
				System.out.println(rs.getString("imie") + " " + rs.getString("nazwisko"));
			}
			rs.close();

			stmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

Na początku rejestrujemy właściwy sterownik JDBC do komunikacji z odpowiednim serwerem baz danych używając statycznej metody registerDriver(…) klasy java.sql.DriverManager. Dla systemu zarządzania bazami danych PostgreSQL sterownik JDBC implementowany jest przez klasę org.postgresql.Driver (można go pobrać ze strony https://jdbc.postgresql.org/). Następnie nawiązujemy połączenie z bazą danych używając statycznej metody getConnection(…) klasy java.sql.DriverManager z 4 parametrami: adresem URL serwera baz danych (jest on zainstalowany na tym samym komputerze co aplikacja, a połączenia przychodzące odbiera na standardowym dla PostgreSQL porcie 5432), nazwą bazy danych (standardową dla PostgreSQL bazą o nazwie postgres), nazwą użytkownika bazy danych (standardowym dla PostgreSQL użytkownikiem o nazwie postgres) i hasłem użytkownika (hasło dla użytkownika postgres jest ustalane podczas instalacji systemu zarządzania bazami danych, ja ustaliłem hasło iProgramujesz.pl). Metoda getConnection(…) klasy java.sql.DriverManager zwraca obiekt interfejsu java.sql.Connection reprezentujący nawiązane połączenie.

Używając metody createStatement() obiektu conn reprezentującego nawiązane połączenie, tworzymy obiekt stmt interfejsu java.sql.Statement służący do wykonywania operacji na bazie danych. Używając metody executeUpdate(…) obiektu stmt wykonujemy instrukcje SQL wstawiające nowe wiersze do tabeli PROGRAMISTA. Używając metody executeQuery(…) obiektu stmt wykonujemy zapytanie do bazy danych pobierające zawartość tabeli PROGRAMISTA. Metoda executeQuery(…) interfejsu java.sql.Statement zwraca obiekt interfejsu java.sql.ResultSet zawierający wynik wykonania zapytania do bazy danych.

Iteracyjnie odczytujemy pobrane z bazy danych wiersze tabeli PROGRAMISTA, używając metody
next() obiektu rs, która umożliwia przechodzenie pobranej tabeli wiersz po wierszu, jak również metody getString(…) obiektu rs, która odczytuje łańcuch znaków z kolumny o podanej nazwie z aktualnego wiersza tabeli.

Na końcu wykonujemy metody close() używanych obiektów rs, stmt i conn w celu zwolnienia używanych zasobów i zamknięcia połączenia z bazą danych.

Podsumowanie pierwszej części kursu JDBC

Jako podsumowanie tej części kursu JDBC, przygotowałem plik .zip zawierający całość aplikacji bazodanowej z JDBC. Jeśli nie wiesz jak szybko uruchomić pobraną aplikację przeczytaj mój artykuł o importowaniu istniejącego projektu z plikiem budowania Apache Ant do Eclipse.