Spring Boot i baza danych H2

Aplikacje tworzone z użyciem Spring Boota często korzystają z relacyjnych baz danych. W produkcyjnej wersji aplikacji zazwyczaj wykorzystuje się takie silniki baz danych jak Oracle, MySQL, czy PostgreSQL, jednak oprócz tego programiści zazwyczaj konfigurują dodatkowy profil deweloperski z wbudowaną bazą danych, działającą w pamięci podręcznej.

Najpopularniejszą bazą danych wykorzystywaną do takich celów w Javie jest H2. Może ona działać w kilku trybach, m.in. tylko w pamięci, ale przy odpowiedniej konfiguracji dane mogą być także zapisywane w pliku na dysku twardym.

 

Konfiguracja projektu i zależności

Jeżeli tworzysz projekt z wykorzystaniem środowiska takiego, jak np. IntelliJ IDEA, to wybierz starter Spring Data JPA oraz sterownik bazy H2.

Możesz też po prostu dodać dwie zależności:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Sterownik nie jest wymagany na etapie kompilacji, dlatego ma wartość <scope> ustawioną na runtime.

 

Domyślna konfiguracja

Spring Boot zapewnia domyślną konfigurację, więc po uruchomieniu projektu możesz korzystać z repozytoriów Spring Data i zapisywać w bazie obiekty encji. np.

@Entity
class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String firstName;
    private String lastName;

    public Person() {
    }

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
//gettery, settery
}
package pl.javastart.springbooth2;

import org.springframework.data.repository.CrudRepository;

interface PersonRepository extends CrudRepository<Person, Long> {
}
@SpringBootApplication
public class SpringBootH2Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringBootH2Application.class, args);
        PersonRepository personRepository = context.getBean(PersonRepository.class);
        personRepository.save(new Person("Jan", "Kowalski"));
    }

}

Kurs Spring

Dostęp do konsoli H2

Jeżeli chcesz mieć możliwość wygodnego przeglądania danych znajdujących się w bazie, to możesz skorzystać z konsoli H2, czyli webowego interfejsu, który umożliwi Ci podłączenie się do bazy i wykonywanie na niej zapytań. To coś jak MySQL Workbench, ale nie trzeba go instalować.

W celu włączenia konsoli, do pliku konfiguracyjnego musisz dodać zależność do startera Spring Web.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

W pliku application.properties, lub properties.yml należy włączyć konsolę, ustawiając własność spring.h2.console.enabled.

application.properties

spring.h2.console.enabled=true

application.yml

spring:
  h2:
    console:
      enabled: true

Domyślnie konsola H2 dostępna jest pod adresem /h2-console, ale możesz to zmienić, konfigurując własność spring.h2.console.path, np.:

application.yml

spring:
  h2:
    console:
      enabled: true
      path: /konsola-h2

Jeżeli konsola H2 jest włączona, to adres bazy danych wygenerowany przez Spring Boota znajdziesz w logach podczas uruchamiania aplikacji:

Adres ten możesz podać w konsoli H2, aby połączyć się z bazą.

 

Konfiguracja połączenia

Nazwa bazy danych domyślnie jest generowana przez Spring Boota, domyślna nazwa użytkownika to sa (system admin), a hasło jest puste, ale oczywiście tę konfigurację także możemy zmodyfikować dodając odpowiednie wpisy w pliku application.properties, albo application.yml. Interesują nas własności spring.datasource.usernamespring.datasource.password i spring.datasource.url.

application.yml

spring:
  h2:
    console:
      enabled: true
      path: /konsola-h2
  datasource:
    username: custom_user
    password: strongPassword
    url: jdbc:h2:mem:my_database

Korzystając z prefixu jdbc:h2:mem wskazujemy, że korzystamy z bazy w pamięci, która zostanie stworzona przy starcie aplikacji i zniszczona przy jej zatrzymaniu. Oprócz tego możemy wykorzystać zapis do pliku, wtedy adres może wyglądać np. tak:

jdbc:h2:file:/data/sample

 

Hibernate i bazy wbudowane

Jeżeli w projekcie Spring Boota korzystamy z bazy wbudowanej takiej, jak H2, to Hibernate automatycznie wygeneruje tabele na podstawie klas encji. Odpowiada za to własność spring.sql.init.mode, która domyślnie ma wartość embedded. Przestawiając ją na wartość never sprawimy, że schemat bazy danych nie zostanie automatycznie wygenerowany, a w przypadku wartości always, schemat będzie generowany także dla niewbudowanych silników baz danych, takich jak np. MySQL.

application.yml

spring:
  h2:
    console:
      enabled: true
      path: /konsola-h2
  datasource:
    username: custom_user
    password: strongPassword
    url: jdbc:h2:mem:my_database
  sql:
    init:
      mode: always

 

Wykonywanie zapytań w konsoli H2

Konsola H2 daje Ci możliwość wygodnego przeglądania tabel, ale także wstawiania i aktualizowania danych. Jest to więc bardzo przydatne narzędzie, które ułatwia proces testowania aplikacji. Wystarczy, że połączysz się z bazą danych i wpiszesz dowolne zapytanie SQL w dedykowanym oknie.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzieliś spostrzeżeniami? Zapraszamy dyskusji na naszej grupe na Facebooku.