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.username , spring.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 grupie na Facebooku.