W tym poście przedstawię jak możemy łatwo wystawić REST API w połączeniu z bazą MySQL. Klientem API będzie aplikacja napisana w Angular 6. Środowisko pracy to Intellij IDEA wersja Ultimate.

Wraz z kolejnymi częściami ulegną modyfikacji klasy i metody w całym projekcie tak, aby projekt wraz z czasem miał postać wersji produkcyjnej tzw. real-life 🙂

Teraz rozpoczniemy od podstaw i ten post będzie o tym jak rozpocząć pracę z projektem i bazą danych. Zapraszam 🙂

Tworzymy projekt:

Dodajemy klasy i metody do projektu:

Zawartość klasy głównej.  W moim przypadku nazwa klasy to ‚DemoApplication’.

Tworzymy teraz pakiet ‚model’, a w nim klasę ‚Book’. Dodajemy pola prywatne do klasy oraz adnotacje: 

W normalnej sytuacji, musielibyśmy dodać ‚gettery’ i ‚settery’ do pól prywatnych. Adnotacja @Data z biblioteki Lombok  załatwia za nas tą robotę. 

Dodamy jednak jeden konstruktor:

Stworzyliśmy konstruktor nie zawierający pola „id”. W normalnym przypadku należy zrobić obiekt DAO (Data Access Object) i utworzyć klasę mapującą obiekt podstawowy na obiekt bazodanowy. Będziemy ten projekt rozszerzać w kolejnych wpisach.

A tym czasem:

Tworzymy nowy pakiet o nazwie ‚repository’. Następnie tworzymy w nim interfejs BookRepository. BookRepository rozszerza interfejs JpaRepository. Jest to interfejs z pakietu Spring Data. 

Tworzymy pakiet ‚controller’, a w nim klasę BookController. 

Dzięki JpaRepository z pakietu Spring Data mamy do dyspozycji metody pozwalające na operacje na encjach, np. zwróć wszystkie rekordy ‚findAll()’. Metoda ta zwróci listę rekordów bazy danych. Każdy rekord to obiekt klasy Book. 

Co oznaczają powyższe adnotacje nad nazwą klasy?

@CrossOrigin, to adnotacja pozwalająca na dostęp do serwisu z poziomu lokalnej przeglądarki na lokalny serwer. Docelowo będziemy uruchamiać dwa lokalne serwery. Jeden na porcie 8080 dla naszego kontenera servletów, czyli Tomcata, drugi to serwer Node dla aplikacji Angular na porcie 4200. 

@RestController, to adnotacja Springowa. Podczas uruchamiania aplikacji Spring skanuje klasy projektu i szuka oznaczeń, które wskazują, że jest to komponent aplikacji. Aby skorzystać z mechanizmu zarządzania zależnościami przez kontener Spring należy wskazać taką klasę poprzez jej oznaczenie adnotacją. 

Adnotacje, które mamy do dyspozycji to:

  • @Component – wspomniany na początku najbardziej ogólny
  • @ Repository – dedykowana dla klas, których zdaniem jest przechowywanie / agregowane danych
  • @Service – dedykowana klasom, które dostarczają usługi
  • @Controller – dedykowany dla warstwy prezentacji lub/i dla API aplikacji
  • @RestController –  dedykowany dla API aplikacji.

@Autowired – to wstrzykiwanie zależności. Dzieki tej adnotacji, nie musimy ręcznie dodawać Bean’a w pliku XML. Robi to za nas ta adnotacja. Natomiast zalecane jest wstrzykiwanie zależności przez konstruktor, a nie pole klasy. Co to daje? Na pewno większą czytelność kodu. Wyraźnie wówczas widać zależności klasy. W tym wpisie nie będziemy komplikować kodu. Zostaniemy przy polu klasy.

@GetMapping – to adnotacja określająca typ zapytania pochodzącego z przeglądarki. W tym przykładzie servlet aplikacji otrzymując żądanie GET z przeglądarki o URL kończącym się na „books” (u nas będzie to: http://localhost:8080/api/books) skieruje to żądanie do metody „getBooks()”.   

Pozostajemy w klasie BookRepository, ponieważ dodamy teraz metodę dodawania książki do bazy. Dla ułatwienia poniżej jeszcze raz cała klasa BookRepository z metodą addBook() :

Nad metodą addBook() uzyliśmy adnotacji @PostMapping, ponieważ chcemy przekazać nasz obiekt książki w ciele metody POST (metody HTTP). Nie chcemy, aby właściwości obiektu jaki przesyłamy na serwer były widoczne w pasku przeglądarki. Nasz obiekt książki zostanie wysłany  w formacie JSON i z tego powodu użyliśmy adnotacji @RequestBody. Mówiąc w skrócie andotacja ta, pozwala na zmapowanie obiektu w formacie JSON do obiektu Javy na podstawie kluczy i wartości.

Konfiguracja pliku application.properties

Przejdźmy teraz do pliku application.properties. Znajdziesz go w folderze resources. Plik ten pozwala nam na zarządzanie niestandardowymi ustawieniami aplikacji Spring Boot. 

Dla przykładu: uruchamiając projekt zauważymy, że standardowo Spring podniesie nam aplikację na porcie 8080. Aby zmienić to ustawienie domyślne wystarczy wpisać w pliku application.properties taką linijkę:

Ustawiamy jednak port 8080, kasujemy powyższy komentarz i przechodzimy dalej.

Teraz uzupełnimy ustawienia dotyczące bazy lokalnej MySQL. Domyślnie baza danych pracuje na porcie 3306. Podczas instalacji MySQL podawaliśmy login i hasło główne dostępu do bazy. Jeszcze raz wgląd w cały plik application.properties:

Skonfigurowaliśmy tzw. dialekt, czyli komunikację frameworka Hibernate z odpowiednią wersją bazy MySQL. Następnie ustawiliśmy login i hasło dostępu do bazy. Ostatnia linijka to ścieżka dostępu do bazy.  Słowo „book_store” w ścieżce to nasza nazwa bazy danych. „useSLL-false” każe ignorować fakt, że korzystamy z protokołu http zamiast bezpiecznego https. 

Stwórzmy teraz bazę danych o nazwie „demo”. Ja Zamist skorzystać z graficznej nakładki jaką jest MySQL Workbench, skorzystam z linii komend Windowsa. W wyszukiwarce paska Start piszę „cmd”. Natępnie loguję się do MySQL.mysql.

Naciskam enter i wpisuję hasło. Ponownie enter.

Dodaję bazę danych wpisując „create database book_store„. 

Sprawdzam czy baza została dodana wpisując „show databases;

Wracam do pliku application.properites i uzupełniam konfiguracje dla Hibernate. Dla ułatwienia poniżej cały aktualny plik:

Dodaliśmy trzy nowe konfiguracje. Wyświetlamy zapytania, które tworzy hibernate „spring.jpa.show-sql=true„. Ustalamy, że przy każdym restarcie aplikacji hibernate będzie aktualizował konstrukcję bazy danych: „spring.jpa.hibernate.ddl-auto=update” Do wyboru jest jeszcze „drop”, „create-drop”. Ta ostatnia opcja mówi o tym, że przy każdym restarcie aplikacji hibernate będzie niszczył strukturę bazy book_store i tworzył od nowa. 

Uruchamiamy aplikację.

Jeśli wszystko poszło ok, to możemy wpisać w przeglądarkę: http://localhost:8080/api/books

Zobaczymy tylko „[ ]” Odpowiedź z serwera wskazuje na pustą kolekcję. 

Dodajmy teraz książkę do bazy book_store za pomocą linii komend Windowsa 😉 Można oczywiście zrobić to milion sposobów, np. dodać obiekt za pomocą aplikacja Postman wysyłając obiekt JSON’em na serwer. Albo tak jak będziemy robić to docelowo, czyli stworzoną przez nas aplikacją w Angular 6 😉 O tym wszystkim w kolejnej części 😉 A tym czasem otwieramy linię komend:

Upewniamy się, że przełączyliśmy się na bazę book_store. Następnie wyświetlamy kolumny i nagłówki kolumn (dwie komendy, po każdej enter):

Skoro wszystko jest ok, wpisujemy pierwszy rekord do tabeli:

Jak widać za pierwszym razem nie udało mi się wpisać rekordu, ponieważ źle skonstruowałem polecenie SQL. Nie wpisałem typu varchar w cudzysłowach. Za drugim razem wszystko poszło ok.

polecenie SQL:  insert into books(id,author,isbn,title) values(1,”Adam Mickiewicz”,”ISBN-12-1234″,”Pan Tadeusz”);

Wróćmy do naszej przeglądarki i odświeżmy stronę:

Mamy nasz pierwszy rekord w bazie 😉

Mam nadzieję, że wszystko jak do tej pory było jasne. W kolejnej części rozbudujemy aplikacje o nowe metody (PUT, DELETE) i użyjemy Postmana do obsługi naszego REST API. 

Kod źródłowy dostępny do pobrania  tutaj

4 komentarze

  1. Mogłem zrobić konstruktor z polem ‚id’. W tym przypadku nie ma to znaczenia. Chciałem mieć możliwość ‚na później’ wprowadzać obiekty ręcznie bez podawania pola id, które generuje za mnie baza danych.

    devlab

Możliwość komentowania jest wyłączona.