Spring Boot i baza danych H2
Spis treści
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"));
}
}
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 grupe na Facebooku.