Интеграция Spring Boot, JPA и H2 Database
1. Цель статьи
H2 это реляционная база данных (Relational database), открытый исходный код, легкий, написанный с помощью языка Java. Установка H2 имеет очень маленький объем, примерно 8MB.
Один из интересных свойств у H2 это вы можете создать базу данных в оперативной памяти (In Memory Database) вместо того, чтобы хранить на жестком диске компьютера. Это делает скорость запроса и манипуляцию с данными очень быстрой. При это если вы выбираете свойство "In Memory Database" данные существуют только когда приложение работает, когда приложение отключено (shutdown), данные так же будут удалены из памяти.
H2 предоставляет вам административный инструмент с названием H2 Console, и вы работаете с ним через браузер.
В данной статье я покажу вам как созать проект Spring Boot для взаимодействия с базой данных H2, и использовать свойство "In Memory Database", конфигурацию для использования административного инструмента H2 Console.
Не так уж много разницы если вы хотите подключиться к базе данных H2 установленный на компьютере (Смотрите приложение в конце данной статьи).
2. Создать проект Spring Boot
На Eclipse создать проект Spring Boot:
OK, проект создан.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>SpringBootJpaH2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringBootJpaH2</name>
<description>Spring Boot + Jpa + H2</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
SpringBootJpaH2Application.java
package org.o7planning.springbooth2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootJpaH2Application {
public static void main(String[] args) {
SpringApplication.run(SpringBootJpaH2Application.class, args);
}
}
3. Entity Class, DAO, DataInit, Controller
Person.java
package org.o7planning.springbooth2.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "PERSON")
public class Person {
@Id
@GeneratedValue
@Column(name = "Id", nullable = false)
private Long id;
@Column(name = "Full_Name", length = 64, nullable = false)
private String fullName;
@Temporal(TemporalType.DATE)
@Column(name = "Date_Of_Birth", nullable = false)
private Date dateOfBirth;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}
PersonDAO это расширенный (extends) интерфейс из CrudRepository<Person, Long>. Spring Data JPA сам создаст для вас класс применения (implements) данного интерфейса во время старта приложения.
Смотрите так же:
PersonDAO.java
package org.o7planning.springbooth2.dao;
import java.util.Date;
import java.util.List;
import org.o7planning.springbooth2.entity.Person;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PersonDAO extends CrudRepository<Person, Long> {
public List<Person> findByFullNameLike(String name);
public List<Person> findByDateOfBirthGreaterThan(Date date);
}
Класс DataInit выполняет интерфейс ApplicationRunner, он будет автоматически работать во время старта приложения. В данном классе мы вставим некоторые записи (record) в таблицу PERSON.
DataInit.java
package org.o7planning.springbooth2.init;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.o7planning.springbooth2.dao.PersonDAO;
import org.o7planning.springbooth2.entity.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class DataInit implements ApplicationRunner {
private PersonDAO personDAO;
private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
@Autowired
public DataInit(PersonDAO personDAO) {
this.personDAO = personDAO;
}
@Override
public void run(ApplicationArguments args) throws Exception {
long count = personDAO.count();
if (count == 0) {
Person p1 = new Person();
p1.setFullName("John");
Date d1 = df.parse("1980-12-20");
p1.setDateOfBirth(d1);
//
Person p2 = new Person();
p2.setFullName("Smith");
Date d2 = df.parse("1985-11-11");
p2.setDateOfBirth(d2);
personDAO.save(p1);
personDAO.save(p2);
}
}
}
MainController.java
package org.o7planning.springbooth2.controller;
import org.o7planning.springbooth2.dao.PersonDAO;
import org.o7planning.springbooth2.entity.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MainController {
@Autowired
private PersonDAO personDAO;
@ResponseBody
@RequestMapping("/")
public String index() {
Iterable<Person> all = personDAO.findAll();
StringBuilder sb = new StringBuilder();
all.forEach(p -> sb.append(p.getFullName() + "<br>"));
return sb.toString();
}
}
4. Конфигурировать Spring Boot & H2
В данном примере я конфигурирую Spring Boot чтобы использовать H2 как базу данных в оперативной памяти (In memory Database), это значит нам не нужно устанавливать базу данных H2, она будет автоматически создана и сохранена в памяти компьютера.
В другом случае, если вы уже установили базу данных H2 на ваш компьютер, и хотите взаимодействовать приложение Spring Boot с этой базой данных, вы можете просмотреть приложение в конце данной статьи.
application.properties
# To See H2 Console in Browser:
# http://localhost:8080/h2-console
# Enabling H2 Console
spring.h2.console.enabled=true
# ===============================
# DB
# ===============================
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# ===============================
# JPA / HIBERNATE
# ===============================
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
Данная конфигурация говорит Spring стартовать административный инструмент H2. И вы можете войти в данный инструмент на браузере:
spring.datasource.url=jdbc:h2:mem:testdb
Данная конфигурация говорит Spring что вы хотите использовать базу данных H2 в оперативной памяти (In Memory Database).
spring.jpa.hibernate.ddl-auto=update
Данная конфигурация говорит Spring создать (Или обновить) структуру таблицы по структуре классов Entity. Таким образом таблица PERSON будет автоматически создана по структуре класса Person.
5. Запустить приложение
На Eclipse запустите ваше приложение:
На данный момент, H2 Console стартует вместе с приложением, и вы можете получить доступ в данный административный инструмент:
Таблица PERSON автоматически создана основываясь на структуре класса Person.
Запрос (query) таблицы PERSON:
6. Приложение H2
В случае если вы используете H2 (Server):
application.properties (H2 Server)
# To See H2 Console in Browser:
# http://localhost:8080/h2-console
# Enabling H2 Console
spring.h2.console.enabled=true
# ===============================
# DB
# ===============================
spring.datasource.url=jdbc:h2:tcp://localhost/~/testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# ===============================
# JPA / HIBERNATE
# ===============================
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
Руководства Spring Boot
- Установите Spring Tool Suite для Eclipse
- Руководство Spring для начинающих
- Руководство Spring Boot для начинающих
- Общие свойства Spring Boot
- Руководство Spring Boot и Thymeleaf
- Руководство Spring Boot и FreeMarker
- Руководство Spring Boot и Groovy
- Руководство Spring Boot и Mustache
- Руководство Spring Boot и JSP
- Руководство Spring Boot, Apache Tiles, JSP
- Используйте Logging в Spring Boot
- Мониторинг приложений с помощью Spring Boot Actuator
- Создание веб-приложения с несколькими языками с помощью Spring Boot
- Используйте несколько ViewResolver в Spring Boot
- Используйте Twitter Bootstrap в Spring Boot
- Руководство Spring Boot Interceptor
- Руководство Spring Boot, Spring JDBC и Spring Transaction
- Руководство Spring JDBC
- Руководство Spring Boot, JPA и Spring Transaction
- Руководство Spring Boot и Spring Data JPA
- Руководство Spring Boot, Hibernate и Spring Transaction
- Интеграция Spring Boot, JPA и H2 Database
- Руководство Spring Boot и MongoDB
- Используйте несколько DataSources с Spring Boot и JPA
- Используйте несколько DataSource с Spring Boot и RoutingDataSource
- Создайте приложение для входа с Spring Boot, Spring Security, Spring JDBC
- Создайте приложение для входа с Spring Boot, Spring Security, JPA
- Создайте приложение регистрации пользователей с помощью Spring Boot, Spring Form Validation
- Пример OAuth2 Social Login в Spring Boot.
- Запускать фоновые запланированные задачи в Spring
- Пример CRUD Restful Web Service c Spring Boot
- Пример Spring Boot Restful Client c RestTemplate
- Пример CRUD с Spring Boot, REST и AngularJS
- Защита Spring Boot RESTful Service используя Basic Authentication
- Защита Spring Boot RESTful Service используя Auth0 JWT
- Пример Upload file c Spring Boot
- Пример Download file c Spring Boot
- Пример Upload file c Spring Boot и jQuery Ajax
- Пример Upload file c Spring Boot и AngularJS
- Создание веб-приложения для корзины покупок с помощью Spring Boot, Hibernate
- Руководство Spring Email
- Создайте простое приложение Chat с Spring Boot и Websocket
- Разверните приложение Spring Boot на Tomcat Server
- Развертывание приложения Spring Boot на Oracle WebLogic Server
- Установите бесплатный сертификат Let's Encrypt SSL для Spring Boot
- Настройте Spring Boot для перенаправления HTTP на HTTPS
Show More