Spring Data
To jeden z kluczowych dodatków do Spring, który umożliwia integrację aplikacji z bazą danych. Domyślna implementacja bazuje na Hibernate, dlatego znajomość tego frameworka jest niezbędna do dalszych działań.
Kroki
Do stworzenia aplikacji należy wykonać:
- Zależności
- Konfigurację z bazą danych
- Encję
- Repozytorium
Dodanie zależności
Aby mieć możliwość korzystania z API dostarczanego przez Spring Data należy dodać zależność:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
Drugą niezbędna zależnością jest sterownik bazy danych. Jest ona zależna od bazy danych z jaką będzie dokonywana integracja. W tym przykładzie dodawana jest baza danych H2, dlatego zależność będzie następująca:
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency>
Możliwe jest również wybranie tych zależności prosto z poziomu kreatora projektu Spring Initializr.
Konfiguracja z bazą danych
Do pliku konfiguracyjnego application.properties należy umieścić następujące wpisy:
spring.jpa.properties.hibernate.hbm2ddl.auto=create spring.datasource.url=jdbc:h2:file:./bazaDanych spring.h2.console.enabled=true spring.h2.console.path=/console
Pierwsza linia mówi o strategii generowanego schematu bazy danych.
Druga dotyczy lokalizacji bazy danych. Ponieważ H2 umożliwia tworzenie lokalnych baz danych, to jej struktura znajdować się będzie w systemie plików. Uruchamia się ona razem z aplikacją. W przypadku zdalnej bazy danych, w tym miejscu należy podać adres hosta.
Dwie ostatnie linie w konfiguracji związane są z bazą danych H2. Linia trzecia pozwala na dostęp do konsoli bazy danych, natomiast ostatnia wskazuje ścieżkę, na której ma być ona dostępna. W tym przypadku będzie ona widoczna pod adresem:
localhost:8080/console
Encja
Na temat zasad tworzenia encji przeczytasz we wpisie dotyczącym definiowania encji JPA.
Przykładowa klasa encji może wyglądać w ten sposób:
@Entity
public class VideoCassette {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private Long id;
private String title;
private LocalDate productionYear;
public VideoCassette() {
}
public VideoCassette(Long id, String title, LocalDate productionYear) {
this.id = id;
this.title = title;
this.productionYear = productionYear;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public LocalDate getProductionYear() {
return productionYear;
}
public void setProductionYear(LocalDate productionYear) {
this.productionYear = productionYear;
}
}
Repozytorium
Repozytorium umożliwia zarządzanie obiektami encji. Dzięki niemu możliwe jest:
- dodawanie;
- usuwanie;
- modyfikowanie;
- pobieranie;
- dokonywanie innych operacji.
Implementacja jest prosta. Wystarczy stworzyć interfejs, posiadający adnotacje @Repository i rozszerzający interfejs CrudRepository. CrudRepository przyjmuje dwa parametry. Pierwszym z nich jest encja, którą zarządza, a drugim jest typ id w encji zarządzanej.
@Repository
public interface VideoCassetteRepo extends CrudRepository<VideoCassette, Long> {
}
Wykorzystanie
Ostatnim krokiem jest wstrzyknięcie repozytorium i wykorzystanie jego metod. Przykładowo mogą być to:
- findById – pobieranie elementu po id;
- findAll – pobranie wszystkich elementów;
- save – zapis elementu do bazy;
- deleteById – usunięcie elementu po id;
@Service
public class VideoCassetteManager {
private VideoCassetteRepo videoCassetteRepo;
@Autowired
public VideoCassetteManager(VideoCassetteRepo videoCassetteRepo) {
this.videoCassetteRepo = videoCassetteRepo;
}
public Optional<VideoCassette> findById(Long id) {
return videoCassetteRepo.findById(id);
}
public Iterable<VideoCassette> findAll() {
return videoCassetteRepo.findAll();
}
public VideoCassette save(VideoCassette videoCassette) {
return videoCassetteRepo.save(videoCassette);
}
public void deleteById(Long id) {
videoCassetteRepo.deleteById(id);
}
@EventListener(ApplicationReadyEvent.class)
public void fillDB() {
save(new VideoCassette(1L,"Titanic", LocalDate.of(1995, 1,1)));
save(new VideoCassette(2L,"Pulp Fiction", LocalDate.of(1990, 2,2)));
}
}
Materiały dodatkowe
Kod aplikacji jest dostępny w repozytorium:
https://github.com/bykowski/spring-video-app-livestream
Wideo prezentującę jak krok po kroku (z objaśnieniami) zbudować aplikację webową z bazą danych znajdziesz na moim kanale YouTube:
Szkolenia live dla developerów • praktyczna wiedza, realne case’y, zero lania wody 

