Połączenie bazy danych z aplikacją Java

Postanowiłem trochę przybliżyć temat połączenia aplikacji Javowych z bazą danych. Aktualnie dużo osób w internecie szuka rozwiązań, bo coś im nie działa. Problem leży w tym, że dużo programistów nawet nie wie jak to powinno działać. Powiedzieć można, że "automagicznie" tworzą się obiekty z bazy i w drugą stronę. Tak mówię już o obiektach, ponieważ teraz w erze hibernate, a nawet spring data jpa, nikt nawet nie zastanawia się jak zwracane są dane. Wystarczy przekopiować działającą konfiguracje i wszystko gotowe.

Połączenie z bazą danych, czyli JDBC.

JDBC (Java DataBase Connectivity) jest to API do komunikacji aplikacji z bazami danych. Wszyscy pewnie zauważyli, że to jest interfejs. Konkretną implementację (zwaną czasem sterownikiem) trzeba szukać pod bazę danych, którą chcemy wykorzystać.

Na co pozwala JDBC?

Posiadając sterownik do bazy możemy:

  • połączyć się z nią,
  • wykonać na niej zapytanie,
  • obsłużyć tranzakcyjność.

Zrobić możemy, na tym etapie, już wszystko, co jest nam potrzebne. Jednakże pisanie aplikacji opartej tylko na JDBC jest uciążliwie. Zapisuje się dużo niezwiązanego z logiką kodu. Przykładem może być np. tworzenie połączeń (czasami puli), a następnie pamiętanie o oddaniu połączenia lub rozłączenie go. Problemem bywały także niezamykane wskaźniki do danej tabeli i wiele innych rzeczy.

Co było dalej?

Programiści wymyślili dodatkowe warstwy oprogramowania, aby skupić się na ważniejszych rzeczach niż sprawdzanie czy na pewno zamykamy połączenie.

DataSource, czyli małe ułatwienie.

Źródło danych to nic innego jak miejsce w którym deklarujemy jak połączenia mają być tworzone z bazą. DataSource ułatwia nam tworzenie połączeń. Nie musimy dzięki temu pisać własnych implementacji (w starych aplikacjach możemy jeszcze zauważyć takie dziwactwa). Wystarczy dobrze skonfigurować i połączenie z bazą pobieramy za pomocą jednej funkcji getConnection(). Nadal jednak musimy pamiętać o zwracaniu połączeń i wskaźników.

JPA sprawia, że programista może skupić się na obiektach.

Tutaj spotykamy się z wielkim skokiem technologicznym w przód. Jest to tzw. ORM (Object-Relational Mapping), czyli mapowanie modelu obiektowego na model relacyjny. W celu ułatwienia pracy programiście stworzony został standard, który pozwalał operować na obiektach przy zapisie oraz odczycie danych z bazy. Umożliwia to programiście skupienie się na ważnych logicznych częściach aplikacji. Obsługuje to wszystko EntityManager. Początkowo można było to osiągnąć po wskazywaniu mu poprzez pliki .xml, które klasy i jak powinień zapisywać do bazy. Aktualnie informacje pobiera także za pomocą adnotacji. Warstwa pozwala na zapomnienie o połączeniach z bazą danych. Jest odpowiedzią na problemy związane z pisaniem powtarzającego się cyklu pobierania i zwalniania połączeń. Z zamienianiem obiektu na zapytania sql i w drugą stronę. To wszystko robi się tutaj już za pomocą kilku funkcji.

Spring Data JPA

I tutaj zaczyna się dopiero ciekawa sprawa. Na tym poziomie możemy zapomnieć nawet o EntityManagerze. Wystarczy stworzyć interfejs, który poprzez nazwy funkcji będzie interpretował, co chcemy zrobić. Posiada nawet gotowy interfejs CRUDRepository, który pozwala na wszystkie operacje związane ze skrótem CRUD (create, read, update, delete). Oczywiście jest to okrojony opis możliwości frameworka, ale tak bardzo pasujący do historii rozwoju operacji na bazach danych.

Podsumowując

Opisałem tutaj przypadki bardzo ogólne. Musimy także pamiętać, że każda następna warstwa działa jedynie z połączeniem warstw poprzednich. Dostawców danego poziomu także mamy dużą ilość, których implementacje są bardziej lub mniej wadliwe, szybsze lub wolniejsze. Ścieżki rozwoju korzystania z baz danych też były różne. Pokazałem najbardziej popularną i najlepiej przyjętą przez programistów.

Comments

Popular posts from this blog

Why TDD is bad practice?

How correctly imitate dependencies?

Software development using Angular 5 with Spring Boot