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