Bazy danychORMWeb application

Spring Boot #15 – Integracja z bazą danych

Spring Boot

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ć:

  1. Zależności
  2. Konfigurację z bazą danych
  3. Encję
  4. 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:

  1. findById – pobieranie elementu po id;
  2. findAll – pobranie wszystkich elementów;
  3. save – zapis elementu do bazy;
  4. 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:

Tags:
Show Buttons
Hide Buttons