codestory

Spring Boot, JPA und H2-Datenbank integrieren

  1. Das Zweck des Artikel
  2. Das Projekt Spring Boot erstellen
  3. Entity Class, DAO, DataInit, Controller
  4. Spring Boot & H2 konfigurieren
  5. Die Applikation laufen
  6. Der Anhang H2

1. Das Zweck des Artikel

H2 ist eine Open source, kompakte relationale Datenbank (Relational database), die in Sprache Java geschrieben wird. Der Installler H2 hat die sehr wenige Kapazität, ca. 8MB.
Eine der interessanten Eigenschaften vom H2 ist, dass Sie können eine Datenbank in Memory Database erstellen statt dessen wird sie in der Festplatte vom PC gespeichert. Das macht die Geschwindigkeit vom Abfragen und der Datenmanipulation sehr schnell. Wenn Sie aber die Eigenschaft "In Memory Database" wählen, existieren die Daten nur wenn die Applikation läuft. Wenn die Applikation geschlossen wird (shut down), werden die Daten aus dem Memory gelöscht.
H2 bietet Sie ein Management Tool mit dem Name von H2 Console an und Sie arbeitet mit ihm durch den Browser
Im Artikel werde ich Sie bei der Erstellung eines Projekt Spring Boot um mit der Datenbank H2(In Memory Database) zu integrieren, und bei der Konfiguration um das Management Tool H2 Console zu verwenden anleiten
Es gibt nicht viele Unterschieden wenn Sie in die im PC installierten Datenbank H2 verbinden möchten (in dem Anhang am Ende des Artikel mehr sehen).

2. Das Projekt Spring Boot erstellen

Auf Eclipse erstellen Sie das Projekt Spring Boot:
OK, Das Projekt wurde erstellt.
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 ist eine Interface, die aus CrudRepository<Person, Long> verweitert wird (extend). Spring Data JPA wird bei dem Start von Applikation Ihnen eine Klasse zur Klasse-Implementiertung erstellen.
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);

}
Die Klasse DataInit implementiert die Interface ApplicationRunner. Sie wird beim Start der Applikation automatisch laufen. In dieser Klasse werden wir ein Rekord in die Tabelle PERSON einfügen.
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 konfigurieren

In diesem Beispiel werde ich Spring Boot konfigurieren um H2 wie eine Datenbank in Memory Database zu verwenden. Das heißt, dass wir die Installation der Datenbank H2 brauchen. Es wird in die PC- Speicherung erstellt und gespeichert.
In einer anderen Situation wenn Sie eine Datenbank H2 auf Ihrem Computer installiert haben und die Spring Boot mit der Datenbank interaktieren möchten, können Sie den Anhang am Ende des Artikel lernen können .
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
Die Konfiguration sagt Spring, das Management Tool von der Datenbank H2 zu beginnen. Und Sie können das Tool auf dem Browser zugreifen:
spring.datasource.url=jdbc:h2:mem:testdb
Die Konfiguration sagt Spring , dass Sie die Datenbank H2 in Memory Database verwenden möchten
spring.jpa.hibernate.ddl-auto=update
Die Strukture sagt Spring , die Struktur der Tabelle von der Klasse Entity zu erstellen oder aktuallisieren. Deshalb wird die Tabelle PERSON nach der Struktur der Klasse Person automatisch erstellt.

5. Die Applikation laufen

Auf Eclipse starten Sie Ihre Applikation
Jetzt wird H2 Console auch mit der Applikation gestartet und Sie können das Management Tool zugreifen:
Die Tabelle PERSON wurde nach der Struktur der Klasse Person automatisch erstellt
Die Tabelle PERSON abfragen (query):

6. Der Anhang H2

Falls Sie H2 (Server) benutzen:
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

Anleitungen Spring Boot

Show More