Zacznę od tego, że bardzo podobała mi się seria artykułów Elleanor Kerry zatytułowana „REST Review”. Oto linki do tych artykułów:
- Przegląd ODPOCZYNKU. Część 1: Co to jest REST
- Przegląd ODPOCZYNKU. Część 2: Komunikacja pomiędzy klientem a serwerem
- Przegląd ODPOCZYNKU. Część 3: Tworzenie usługi RESTful w Spring Boot
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Aby utworzyć kontroler REST:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
Dla serwera Tomcat:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
Dla PostgreSQLa:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.10</version>
</dependency>
Teraz, gdy już uporządkowaliśmy plik pom.xml, przejdźmy do folderu zasobów i wypełnij plik application.properties w następujący sposób:
spring.datasource.url=jdbc:postgresql://localhost:5432/customers
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database=postgresql
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect
Tutaj wpisaliśmy adres URL naszej bazy danych, podaliśmy do niej login i hasło, zarejestrowaliśmy sterownik dla PostgreSQL, wskazaliśmy, że będziemy używać typu danych PostgreSQL i określiliśmy dialekt dla Hibernacji. Następnie utwórzmy nowy katalog o nazwie baza danych w tym samym folderze zasobów . W tym katalogu utworzymy 2 pliki: initDB.sql i populateDB.sql . Pierwszy będzie odpowiedzialny za tworzenie tabel, drugi za ich wstępne wypełnienie. Otwórzmy plik initDB.sql i zobaczmy u góry zielony pasek z informacją, że dialekt SQL nie jest skonfigurowany . Oznacza to, że dla naszego projektu nie wybraliśmy dialektu SQL (a jest ich kilka). Kliknij po prawej stronie tego samego paska na napis Zmień dialekt na… . W wyskakującym okienku kliknij Project SQL Dialect , a ponieważ naszą bazą danych jest PostgreSQL , wybieramy dialekt o tej samej nazwie. Kliknij OK Przejdźmy do wypełniania naszych plików .sql . Wypełnijmy najpierw plik initDB.sql :
CREATE TABLE IF NOT EXISTS clients
(
id BIGSERIAL PRIMARY KEY ,
name VARCHAR(200) NOT NULL ,
email VARCHAR(254) NOT NULL ,
phone VARCHAR(20) NOT NULL
);
Jeśli po wypełnieniu pliku jakieś słowa inne niż klienci są pisane białą czcionką, kliknij prawym przyciskiem myszy wewnątrz tekstu i ponownie wybierz Zmień dialekt -> PostgreSQL . Jak zapewne już zrozumiałeś, są to te same dane, które uzupełniliśmy podczas ręcznego tworzenia tabeli testowej. Tutaj są sformatowane w dialekcie PostgreSQL języka SQL. Teraz wypełnijmy plik populateDB.sql :
INSERT INTO clients VALUES
(1, 'Vassily Petrov', 'vpetrov@jr.com', '+7 (191) 322-22-33)'),
(2, 'Pjotr Vasechkin', 'pvasechkin@jr.com', '+7 (191) 223-33-22)');
Jeśli nazwa tabeli klientów jest napisana czerwonymi literami, wszystko jest w porządku. Rzecz w tym, że jeszcze tej tabeli nie stworzyliśmy i IDEA jeszcze jej nie rozpoznaje. Aby utworzyć i zapełnić tabelę musimy wrócić do pliku application.properties i dodać tam trzy linie:
spring.datasource.initialization-mode=ALWAYS
spring.datasource.schema=classpath*:database/initDB.sql
spring.datasource.data=classpath*:database/populateDB.sql
W tych wierszach mówimy, że chcemy programowo zainicjować bazę danych i wskazujemy, jakich plików należy w tym celu użyć. Następnie przejdź do głównej metody naszej aplikacji i uruchom ją . Następnie przejdź do pgAdmin --> Serwery --> PostgreSQL 12 --> Bazy danych --> klienci --> Schematy --> public , kliknij prawym przyciskiem myszy „ Tabele ”, „ Aktualizuj ”. Jeśli wszystko poszło dobrze, widzimy utworzoną przez nas tabelę klientów . Następnie wróć do pliku application.properties i skomentuj tę linię.
spring.datasource.data=classpath*:database/populateDB.sql
jak poniżej:
spring.datasource.url=jdbc:postgresql://localhost:5432/customers
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database=postgresql
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect
spring.datasource.initialization-mode=ALWAYS
spring.datasource.schema=classpath*:database/initDB.sql
#spring.datasource.data=classpath*:database/populateDB.sql
Jeśli tego nie zrobimy, przy następnym uruchomieniu programu otrzymamy następujący błąd: org.postgresql.util.PSQLException: BŁĄD: Zduplikowana wartość klucza narusza unikalne ograniczenie „clients_pkey” . Dzieje się tak dlatego, że w tabeli wypełniliśmy już pola o identyfikatorze 1 i 2 (nawet przy pierwszym uruchomieniu). W utworzonej przez nas tabeli pole id jest określone jako bigserial , co odpowiada typowi Long w Javie. Jednak w naszym programie typ tego pola to Integer . Postanowiłem pokazać, jak używać funkcji Long (BIGSERIAL), ponieważ ma ona większy zakres niż Integer. Faktem jest, że w tabelach pole oznaczone jako Klucz podstawowy może służyć nie tylko do przechowywania identyfikatorów użytkowników , ale także do przechowywania indeksów najróżniejszych danych, a liczba takich rekordów może przekroczyć maksymalną wartość Integer. Na przykład, jeśli nasz program co sekundę wykonuje kilka pomiarów i zapisuje dane do tabeli. Aby przepisać nasze klasy tak, aby korzystały z typu danych Long, musimy zmienić typ danych z Integer na Long we wszystkich klasach i metodach korzystających z pola id . Nie będziemy tego robić, ponieważ program został pierwotnie napisany przez autora dla typu id Integer, więc ma to jakiś sens. Aby kontynuować, usuńmy jeszcze raz utworzoną przez nas tabelę klientów z naszej bazy danych, ale teraz spróbujemy zrobić to programowo, a nie ręcznie. W tym celu zakomentuj nasz kod w pliku initDB.sql i dodaj jedną linię:
-- CREATE TABLE IF NOT EXISTS clients
-- (
-- id BIGSERIAL PRIMARY KEY ,
-- name VARCHAR(200) NOT NULL ,
-- email VARCHAR(254) NOT NULL ,
-- phone VARCHAR(20) NOT NULL
-- );
DROP TABLE IF EXISTS clients
Uruchamiamy program, przechodzimy do pgAdmin , klikamy prawym przyciskiem myszy na „ Tabele ” (w bazie naszych klientów ) - -> „ Aktualizuj ” i zobaczymy, że nasza tabela zniknęła. Uwaga! Zachowaj ostrożność podczas korzystania z tego polecenia, w przeciwnym razie ryzykujesz utratę wszystkich danych, które miałeś w tabeli! Wróćmy do pliku initDB.sql i przepiszemy go w następujący sposób:
CREATE TABLE IF NOT EXISTS clients
(
id SERIAL PRIMARY KEY ,
name VARCHAR(200) NOT NULL ,
email VARCHAR(254) NOT NULL ,
phone VARCHAR(50) NOT NULL
);
Tutaj zmieniliśmy typ identyfikatora na SERIAL , który odpowiada typowi całkowitemu , którego używamy dla pola identyfikatora w naszym programie. Dodatkowo zwiększono maksymalną długość pola telefonu, dzięki czemu w jego zapisie możemy swobodnie stosować spacje i znaki specjalne (nawiasy, myślniki itp.). Maksymalna liczba cyfr w numerze telefonu wynosi obecnie 18 cyfr (o ile mnie pamięć nie myli). Dla pewności ustawiłem rozmiar na 50 znaków. Przejdźmy do pliku application.properties i odkomentujmy linię:
spring.datasource.data=classpath*:database/populateDB.sql
Uruchommy nasz program, przejdźmy do pgAdmin, sprawdźmy czy nasza tabela została utworzona i skomentujmy tę linię.
#spring.datasource.data=classpath*:database/populateDB.sql
Na tym prawdopodobnie zakończę pierwszą część artykułu. Mam nadzieję, że wam się spodoba, piszcie komentarze (nawet jeśli wam się nie podobało). W części drugiej przepiszemy nasze klasy, aby mogły współpracować z prawdziwymi bazami danych. Kontynuacja: Dodawanie bazy danych PostgreSQL do usługi RESTful podczas Spring Boot. Część 2 UPD Dziękuję moderatorom za poprawienie moich zdjęć i sformatowania tekstu!
GO TO FULL VERSION