[JAVA] DB-Umgebungskonstruktion mit DBFlute Intro + H2-Datenbank

Einführung

Wenn Sie versuchen, eine Anwendung zu erstellen, die eine Verbindung zu einer Datenbank herstellt, ist dies im Hinblick auf die Erstellung der Umgebung häufig problematisch. Selbst wenn Sie den O / R-Mapper eine Weile ausprobieren, können Sie den DB-Server lokal installieren, eine Tabelle erstellen und Daten eingeben. In letzter Zeit scheint es möglich zu sein, eine Umgebung mithilfe von Containertechnologie wie Docker einfach zu erstellen. Wenn Sie jedoch Beispielanwendungen für Bildungszwecke usw. verteilen möchten, erstellen Sie die Umgebung so einfach wie möglich und führen Sie sie so schnell wie möglich aus Die Schwelle wird etwas höher sein.

Wenn möglich, möchte ich eine Umgebung, die einfach in einer kleinen Kapazität zu verteilen ist und sofort ausgeführt werden kann ... ** H2DB ** scheint ein solches Problem zu lösen.

Was ist H2DB?

H2DB ist eine leichte RDB, die vollständig aus Java besteht. Es kann problemlos nur mit Dateizugriff oder Speicherzugriff ausgeführt werden und eignet sich sehr gut für Schulungen und die Verteilung von Beispielanwendungen. Da es auch über eine Serverfunktion verfügt, ist es außerdem möglich, eine Verbindung von mehreren Apps aus herzustellen (überprüfen Sie beispielsweise den Inhalt der Tabelle von der Konsole aus, während Sie über die Web-App eine Verbindung zur Datenbank herstellen).

Was ist DBFlute?

Es ist ein Tool zur Unterstützung der RDB-Entwicklung und hat die folgenden zwei Funktionen.

Dieser Artikel befasst sich hauptsächlich mit dem zweiten Tool zur Unterstützung der DB-Verwaltung. Auf diese Weise können Sie eine Tabelle erstellen und Daten in einem Stapel eingeben. Außerdem werde ich einen kleinen Beispielcode als O / R-Mapper schreiben.

Was ist DBFlute Intro?

DBFlute hat verschiedene Funktionen und es gibt eine spezielle Engine, um sie auszuführen. Wenn Sie DBFlute zum ersten Mal verwenden, müssen Sie daher die Engine herunterladen und die Umgebung festlegen. Es ist jedoch ein Tool, mit dem Sie eine solche Umgebung einfach vorbereiten können. Es wird in einem ausführbaren JAR-Format verteilt und kann sofort in jeder Java-Umgebung ausgeführt werden (https://github.com/dbflute/dbflute-intro/releases).

O / R-Mapper zum Ausprobieren

Versuchen Sie nach der Vorbereitung der DB-Zugriffsumgebung, die folgenden drei Arten von O / R-Mappern als Testversion zu verwenden.

Über die Version

Dieser Artikel verwendet die folgenden Versionen.

Verfahren

0. Eclipse herunterladen

Da es eine große Sache ist, werde ich zunächst die Codierungsumgebung und die Ausführungsumgebung vorbereiten. Es muss nicht Eclipse sein, aber um Ihnen Ärger zu ersparen, werde ich mich hier auf Plejaden All in One verlassen. Laden Sie die Java Full Edition mit jkd für Windows oder Mac von http://mergedoc.osdn.jp/ herunter.

1. Erstellen Sie ein Projekt aus Spring Initializer

Erstellen Sie ein Spring Boot-Projekt unter https://start.spring.io/. Fügen Sie zu diesem Zeitpunkt der Spring Boot-Abhängigkeit Folgendes hinzu.

image.png

Entpacken Sie die heruntergeladene Datei an einen geeigneten Ort (z. B. unter dem Arbeitsbereich, wenn Sie Eclipse verwenden). sample-dbaccess-h2 ├─ .gitignore ├─ .mvn ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src

2. Herunterladen und Bereitstellen von DBFlute Intro

Holen Sie sich die JAR-Datei von Github. https://github.com/dbflute/dbflute-intro/releases

Platzieren Sie die heruntergeladene Datei direkt unter dem Spring-Projekt, das Sie zuvor entpackt haben. sample-dbaccess-h2 ├─ .gitignore ├─ .mvn ├─ dbflute-intro.jar ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src

3. Führen Sie DBFlute Intro aus

Führen Sie die Datei dbflute-intro.jar aus. Wenn der Java-Pfad später nicht übergeben wird, übergeben Sie ihn.

set PATH=%PATH%;C:\path\to\eclipse_java\11\bin
java -jar dbflute-intro.jar

Bei der Ausführung wird ein lokaler Server intern gestartet und im Browser geöffnet. image.png

4. Ersteinrichtung der DBFlute-Engine

Geben Sie die erforderlichen Informationen ein und führen Sie die Ersteinrichtung durch. Klicken Sie nach Abschluss der Eingabe auf dem Bildschirm auf die Schaltfläche "Erstellen", um sie auszuführen. image.png

Die folgenden Punkte sollten bei der Eingabe beachtet werden.

Da DBFlute als Beispiel für einen O / R-Mapper verwendet wird, klicken Sie auf der rechten Seite des Bildschirms auf "O / R-Mapper-Einstellungen", um die Eingabe vorzubereiten, und geben Sie Folgendes ein.

Wenn Sie auf die Schaltfläche "Erstellen" klicken und die Ausführung erfolgreich ist, wird der folgende Bildschirm angezeigt. !! image.png

Das Projekt enthält weitere Dateien. sample-dbaccess ├─ .gitignore ├─ .mvn ├─ dbflute-intro.jar ├─ dbflute_sample_dbaccess_h2 ├─ mydbflute ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src

--mydbflute: DBFlute-Engine. Grundsätzlich bearbeiten Sie hier nicht. --dbflute _ * xxx *: Dieser Ordner enthält DBFlute-Einstellungen für jedes Projekt. "Xxx" ist der "Projektname", der bei der Ersteinrichtung eingegeben wurde.

5. DDL-Erstellung

Geben Sie die DDL wie die Tabellenerstellungsanweisung in replace-schema.sql in den zuvor erstellten projektspezifischen DBFlute-Ordner "dbflute_sample_dbaccess_h2" ein.

dbflute_sample_dbaccess_h2/playsql/replace-schema.sql


create table DEPARTMENT (
	DEPARTMENT_ID int not null,
	DEPARTMENT_NAME varchar(100) not null,
	constraint PK_DEPARTMENT primary key(DEPARTMENT_ID),
	constraint FK_DEPARTMENT_1 FOREIGN KEY (DEPARTMENT_ID) references DEPARTMENT(DEPARTMENT_ID)
);

create table EMPLOYEE (
	EMPLOYEE_ID int not null,
	EMPLOYEE_NAME varchar(100) not null,
	DEPARTMENT_ID int not null,
	constraint PK_EMPLOYEE primary key(EMPLOYEE_ID),
	constraint FK_EMPLOYEE_1 FOREIGN KEY (DEPARTMENT_ID) references DEPARTMENT(DEPARTMENT_ID)
);

6. Registrierungsdaten erstellen

Dieses Mal erstellen wir Registrierungsdaten im tsv-Format (Datenformat mit Tabulatoren als Trennzeichen). Bei der Registrierung von Daten gelten besondere Regeln, und Verzeichnis- und Dateinamen sollten besonders berücksichtigt werden. Weitere Informationen finden Sie unter "Datenregistrierung (TSV)".

dbflute_sample_dbaccess_h2/playsql/data/ut/tsv/UTF-8/01-department.tsv


DEPARTMENT_ID	DEPARTMENT_NAME
1 Abteilung 1
2 Abteilung 2
3 Abteilung 3

dbflute_sample_dbaccess_h2/playsql/data/ut/tsv/UTF-8/02-employee.tsv


EMPLOYEE_ID	EMPLOYEE_NAME	DEPARTMENT_ID
11 Mitarbeiter 11 1
12 Mitarbeiter 12 1
13 Mitarbeiter 13 1
21 Mitarbeiter 21 2
22 Mitarbeiter 22 2
23 Mitarbeiter 23 2
31 Mitarbeiter 31 3
32 Mitarbeiter 32 3
33 Mitarbeiter 33 3

7. Schemaerstellung und Dateneingabe

Wählen Sie im Bildschirm DBFlute Intro das erstellte Projekt aus und klicken Sie auf die Schaltfläche Schema ersetzen, um die Schemaerstellung und Dateneingabe auszuführen. image.png

Alternativ können Sie die Datei manage.bat ausführen. Beachten Sie, dass der Java-Pfad vorhanden ist.

cd dbflute_sample_dbaccess_h2
manage.bat 0

Die Datendatei für h2 wurde direkt unter dem Projekt vergrößert. Der hier erstellte Dateiname (\ * .mv.db) wird durch die Verbindungs-URL angegeben, die bei der Ersteinrichtung von DBFlute Intro eingegeben wurde. sample-dbaccess-h2 ├─ .gitignore ├─ .mvn ├─ _h2  ├─ h2data.mv.db ├─ dbflute-intro.jar ├─ dbflute_sample_dbaccess_h2 ├─ mydbflute ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src

8. Automatische Quellcodegenerierung

Die automatische Quellcodegenerierung für DBFlute konnte nicht über den DBFlute-Intro-Bildschirm ausgeführt werden. Führen Sie sie daher über die Befehlszeile aus. Führen Sie manage.bat mit dem Argument "2: regenerate" aus (oder führen Sie es ohne Argumente aus und geben Sie es später ein). Weitere Informationen finden Sie unter Aufgaben verwalten.

cd dbflute_sample_dbaccess
manage.bat 2

Bei Erfolg wird der automatisch generierte Code unter dem in 4. DBFlute Engine Initial Setup eingegebenen Paket ausgegeben.

9. Fügen Sie die Federeinstellungen hinzu

Fügen Sie Einstellungen hinzu, um den O / R-Mapper für Spring zu verwenden.

Bearbeiten Sie zuerst pom.xml. Passen Sie die Java-Version an, um DBFlute-Abhängigkeiten hinzuzufügen.

pom.xml


<properties>
    <java.version>1.11</java.version>
</properties>
<!--Unterlassung-->
<dependencies>
    <!--Zu verschiedenen vorhandenen Abhängigkeiten hinzufügen-->
    <dependency>
        <groupId>org.dbflute</groupId>
        <artifactId>dbflute-runtime</artifactId>
        <version>1.2.0</version>
    </dependency>
</dependencies>

src/main/resources/application.yml


#Allgemeine DB-Verbindungsinformationen
spring:
  datasource:
    url: jdbc:h2:file:./_h2/h2data
    username: sa
    driverClassName: org.h2.Driver

#Einstellungen für My Batis. lower_Ordnen Sie den Namen der Fallspalte der Eigenschaft camelCase zu
mybatis:
  configuration:
    mapUnderscoreToCamelCase: true

Hinweis 1. Informationen zur Verbindungszeichenfolge

Die Verbindungszeichenfolge für h2 lautet "h2: Datei: Dateipfad". Geben Sie hier für den Dateipfad den relativen Pfad aus dem Basisverzeichnis an, wenn Sie Java ausführen (wenn Sie aus Eclipse direkt unter dem Projekt ausführen) oder den absoluten Pfad.

Hinweis 2. Informationen zum Dateipfad

Wenn Sie in der Dateipfadeinstellung von h2 "url: jdbc: h2: file: _h2 / h2data" anstelle von "url: jdbc: h2: file: ./_h2 / h2data" festlegen, tritt zur Laufzeit der folgende Fehler auf.

Datenbank-URL mit relativem Dateipfad aus dem impliziten aktuellen Verzeichnis("jdbc:h2:file:_h2/h2data")Es ist nicht erlaubt, in anzugeben. Absoluter oder relativer Pfad stattdessen( ~/name, ./name)Oder geben Sie baseDir an.
A file path that is implicitly relative to the current working directory is not allowed in the database URL "jdbc:h2:file:_h2/h2data". Use an absolute path, ~/name, ./name, or the baseDir setting instead. [90011-199]

Wenn Sie einen relativen Pfad verwenden, müssen Sie den Pfad anscheinend explizit schreiben, beginnend mit dem aktuellen ..

Hinweis 3. Wenn bei Eclipse ein Fehler auftritt

Wählen Sie ein Projekt aus und versuchen Sie "Maven> Projekt aktualisieren".

10. DBFlute-Testlauf

Fügen Sie die folgende Datei hinzu und starten Sie Spring einfach über die Befehlszeile.

SampleDbaccessH2Application.java


@SpringBootApplication
public class SampleDbaccessH2DBFluteApplication {

    @Autowired
    EmployeeBhv employeeBhv;

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(SampleDbaccessH2DBFluteApplication.class, args)) {
            SampleDbaccessH2DBFluteApplication app = ctx.getBean(SampleDbaccessH2DBFluteApplication.class);
            app.run(args);
        }
    }

    private void run(String... args) {
        System.out.println("Starten Sie die Verarbeitung");
        employeeBhv.selectList(cb -> {
            cb.setupSelect_Department();
            cb.query().setDepartmentId_Equal(2);
        }).forEach(employee -> {
            System.out.println(
                String.format(
                    "employeeName: %s, departmentName: %s",
                    employee.getEmployeeName(),
                    employee.getDepartment().get().getDepartmentName()));
        });
        //App-Verarbeitung
        System.out.println("Verarbeitung beenden");
    }
}

11. MyBatis-Testlauf

SampleDbaccessH2MyBatisApplication.java


@SpringBootApplication
public class SampleDbaccessH2MyBatisApplication {

    @Autowired
    EmployeeMapper employeeMapper;

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(SampleDbaccessH2MyBatisApplication.class, args)) {
            SampleDbaccessH2MyBatisApplication app = ctx.getBean(SampleDbaccessH2MyBatisApplication.class);
            app.run(args);
        }
    }

    private void run(String... args) {
        System.out.println("Starten Sie die Verarbeitung");
        employeeMapper.findEmployeeList(2).forEach(employee -> {
            if (employee != null) {
                System.out.println(
                    String.format(
                        "employeeName: %s, departmentName: %s",
                        employee.getEmployeeName(),
                        employee.getDepartmentName()));
            } else {
                System.out.println("employee is null");
            }
        });
        //App-Verarbeitung
        System.out.println("Verarbeitung beenden");
    }
}

EmployeeMapper.java


@Mapper
public interface EmployeeMapper {
    @Select({ "select emp.EMPLOYEE_NAME as EMPLOYEENAME, dept.DEPARTMENT_NAME",
        "from EMPLOYEE emp",
        "inner join DEPARTMENT dept on dept.DEPARTMENT_ID = emp.DEPARTMENT_ID",
        "where emp.DEPARTMENT_ID = #{departmentId}", })
    List<Employee> findEmployeeList(int departmentId);
}

Employee.java


public class Employee {
    private String employeeName;
    private String departmentName;
    
    // getter, setter
}

12. JDBC-Testlauf im Frühjahr

SampleDbaccessH2JDBCApplication.java


@SpringBootApplication
public class SampleDbaccessH2JDBCApplication {

    @Autowired
    JdbcTemplate jdbcTemplate;

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(SampleDbaccessH2JDBCApplication.class, args)) {
            SampleDbaccessH2JDBCApplication app = ctx.getBean(SampleDbaccessH2JDBCApplication.class);
            app.run(args);
        }
    }

    private void run(String... args) {
        System.out.println("Starten Sie die Verarbeitung");
        findEmployeeList(2).forEach(map -> {
            System.out.println(
                String.format(
                    "employeeName: %s, departmentName: %s",
                    map.get("EMPLOYEE_NAME"),
                    map.get("DEPARTMENT_NAME")));
        });
        System.out.println("Verarbeitung beenden");
    }

    private List<Map<String, Object>> findEmployeeList(int departmentId) {
        return jdbcTemplate.queryForList(String.join("", new String[] {
            "select emp.EMPLOYEE_NAME, dept.DEPARTMENT_NAME",
            " from EMPLOYEE emp",
            " inner join DEPARTMENT dept on dept.DEPARTMENT_ID = emp.DEPARTMENT_ID",
            " where emp.DEPARTMENT_ID = ?"
        }), departmentId);
    }
}

abschließend

Immerhin fand ich den durch Kopieren und Einfügen erstellten Artikel einfach. Wenn Sie den Quellcode schreiben, müssen Sie kopieren und einfügen und auf DRY ...

Ergänzung A. DBFlute als DB Management Support Tool

Wenn sich eine Tabelle hinzufügt, ändern Sie die Datei "replace-schema.sql" und die Registrierungsdaten, führen Sie "manage.bat" aus, die vorhandene Tabelle wird gelöscht und neu generiert, und eine Migration in der Entwicklungsumgebung ist möglich. Darüber hinaus verfügt DBFlute über hervorragende Funktionen als Migrationstool, z. B. als Tool zum Vergleichen von Schemadifferenzen (Referenz: "[20160521 Hinter der vollständigen Erneuerung des umfangreichen Videoverteilungsdienstes mit Java 8](https: //www.slideshare). .net / SuguruAkiho / 20160521-jjug-cccunext) ". Auch wenn Sie es nicht als O / R-Mapper einführen können, sollten Sie es als DB-Management-Support-Tool einführen.

Ergänzung B: Starten Sie den Server der H2-Datenbank und aktivieren Sie mehrere gleichzeitige Zugriffe.

Wenn Sie von mehreren Anwendungen gleichzeitig auf die Datenbank zugreifen möchten, ist es aufgrund von Einschränkungen nicht möglich, eine Verbindung mit file: ... herzustellen. Mehrfacher gleichzeitiger Zugriff kann nicht nur in einer Produktionsumgebung, sondern auch in einer lokalen Entwicklungsumgebung erfolgen. Zum Beispiel, wenn Sie das Schema mit DBFlute aktualisieren möchten, während die Webanwendung ausgeführt wird. Dazu müssen Sie die Serverfunktion verwenden.

Das Verfahren zum Starten des Servers wird nachstehend kurz beschrieben.

Laden Sie H2DB herunter

Laden Sie alle Plattformen von [Honke Site] herunter (https://www.h2database.com/html/main.html). image.png

Verschieben Sie die erforderlichen Dateien

Entpacken Sie die heruntergeladene Zip-Datei und verschieben Sie die erforderlichen Dateien in Ihr Projekt. Da nur die Laufzeit benötigt wird, verschieben Sie die folgenden Dateien von unter bin in das Verzeichnis für h2.

Die Struktur des Projekts ist wie folgt.

sample-dbaccess-h2 ├─ .gitignore ├─.mvn ├─ _h2  ├─ h2data.mv.db  ├─ h2data.trace.db  ├─ h2.bat  ├─ h2-1.4.199.jar ├─ dbflute-intro.jar ├─ dbflute_sample_dbaccess_h2 ├─ mydbflute ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src

Führen Sie das Startskript aus

CD im selben Verzeichnis wie das Startskript, das Sie oben verschoben haben, und führen Sie das Startskript aus. Beachten Sie, dass der Java-Pfad dem Ausführen von DBFlute Intro entsprechen muss. Der Browser wird gestartet und der Bildschirm wechselt zum Anmeldebildschirm der h2-Konsole.

Überprüfen Sie das Schema und die Daten auf der H2-Konsole

Es ist nicht erforderlich, sich bei der Konsole anzumelden, aber hier werden wir versuchen, die von der Konsole eingegebenen Daten zu überprüfen. Geben Sie die folgenden Informationen ein, um sich bei der Konsole anzumelden. image.png

Wenn Sie sich anmelden, können Sie bestätigen, dass die Tabelle erstellt und Daten eingegeben wurden. image.png

Ändern Sie die Anwendungseinstellungen

Ändern Sie die Verbindungszeichenfolge wie folgt: url: jdbc:h2:tcp://localhost/./h2data

src/main/resources/application.yml


spring:
  datasource:
    url: jdbc:h2:tcp://localhost/./h2data
#Unterlassung

dbflute_sample_dbaccess_h2/dfprop/databaseInfoMap.dfprop


#Unterlassung
    ; url: jdbc:h2:tcp://localhost/./h2data
#Unterlassung

Hinweis 1. Informationen zum Festlegen des Pfads

Aus dem gleichen Grund, der bereits erwähnt wurde, können Sie "url: jdbc: h2: tcp: // localhost / h2data" nicht ausführen. Muss explizit der relative Pfad ". / H2data" anstelle von "h2data" sein.

Hinweis 2. Informationen zu den Servereinstellungen

Obwohl es nicht überprüft wurde, scheint es möglich zu sein, die Einstellungen (Port usw.) beim Starten des Servers festzulegen. http://www.h2database.com/html/tutorial.html#console_settings

Hinweis 3. Informationen zur ersten Schemakonstruktion

Die Datei (im obigen Beispiel h2data.mv.db) ist nicht vollständig. Als ich den Server beim ersten Zugriff auf H2 startete und Schema aus DBFlute ersetzen ausführte, trat ein Fehler auf.

Database "/path/to/h2/h2data" not found, and IFEXISTS=true, so we cant auto-create it [90146-197]

Ich habe die Fehlermeldung erhalten, dass wenn ich der Verbindungsoption "IFEXISTS = true" hinzufüge, diese nicht automatisch erstellt werden kann. Daher habe ich versucht, "IFEXISTS = false" festzulegen, aber es hat nicht funktioniert.

Das erste Mal vermeide ich es vorerst mit der folgenden Methode.

Recommended Posts

DB-Umgebungskonstruktion mit DBFlute Intro + H2-Datenbank
Erstellen und verteilen Sie DB mit Apache Derby + DBFlute Intro
Erstellen einer Datenbankumgebung mit Docker in Spring Boot (IntellJ)
[Docker] Rails 5.2-Umgebungskonstruktion mit Docker
[Umgebungskonstruktion mit Docker] Rails 6 & MySQL 8
Aufbau einer GPU-Umgebung mit Docker [Version Oktober 2020]
Schienenumgebungskonstruktion mit Docker (persönliche Apokalypse)
Aufbau einer Laravel-Entwicklungsumgebung mit Docker (Mac)
Erstellen einer Umgebung für Laravel + MySQL + phpMyadmin mit Docker
Zusammenfassung der Umgebungskonstruktion mit rvm und postgresql
Einführung in den Roboterkampf mit Robocode (Umgebungskonstruktion)
[Jakarta EE 8 Anwendungsentwicklung mit Gradle] 1. Umgebungskonstruktion
Umgebungskonstruktionsverfahren für die Verwendung von PowerMock mit JUnit
Frühling mit Kotorin - 8 Repository-Schicht - Ergänzung: H2-Datenbank
Aufbau einer IntelliJ + Docker (APP + DB) + SpringBoot (Maven) -Umgebung
Konstruktions- und Entwicklungsverfahren für lokale WordPress-Umgebungen mit Docker
[Java] Umgebungskonstruktion
[Frühling] Umweltbau
Konstruktionshandbuch für eine stabile Entwicklungsumgebung für "Rails6" mit "Docker-compose"
Rails5 + MySQL8.0 + Top-Level-Volume-Umgebungskonstruktion mit Docker-Compose
[Java] Umgebungskonstruktionsverfahren zum Entwickeln von Streben 1.3 mit Eclipse
Erstellen Sie eine Java + Spring-Entwicklungsumgebung mit VirtualBox + Ubuntu (Xfce4).