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: