betacode

Интеграция Spring Boot, JPA и H2 Database

  1. Цель статьи
  2. Создать проект Spring Boot
  3. Entity Class, DAO, DataInit, Controller
  4. Конфигурировать Spring Boot & H2
  5. Запустить приложение
  6. Приложение H2

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

Show More