[JAVA] Construction d'environnement DB avec DBFlute Intro + H2 Database

introduction

Lorsque vous essayez de créer une application qui se connecte à une base de données, cela est souvent gênant en termes de construction d'environnement. Même si vous essayez le mappeur O / R pendant un certain temps, vous pouvez installer le serveur de base de données localement, créer une table et entrer des données. Récemment, il semble qu'il soit possible de créer facilement un environnement en utilisant une technologie de conteneur telle que Docker, mais si vous souhaitez distribuer des exemples d'applications à des fins éducatives, etc., créez l'environnement aussi facilement que possible et exécutez-le dès que possible. Le seuil sera un peu plus élevé.

Si possible, je veux un environnement qui soit facile à distribuer dans une petite capacité et qui puisse être exécuté immédiatement ... ** H2DB ** semble résoudre un tel problème.

Qu'est-ce que H2DB?

H2DB est un RDB léger entièrement composé de Java. Il peut être facilement exécuté uniquement par un accès aux fichiers ou à la mémoire, et est très approprié pour l'éducation et la distribution d'exemples d'application. De plus, comme il a également une fonction serveur, il est possible de se connecter à partir de plusieurs applications (par exemple, vérifier le contenu de la table depuis la console lors de la connexion à la base de données depuis l'application Web).

Qu'est-ce que DBFlute?

Il s'agit d'un outil d'aide au développement RDB et a les deux fonctions suivantes.

--Mappeur O / R

Cet article traite principalement du deuxième outil de support de gestion de base de données. En utilisant cela, vous pouvez créer une table et saisir des données en un seul lot. De plus, j'écrirai un petit exemple de code en tant que mappeur O / R.

Qu'est-ce que DBFlute Intro?

DBFlute a diverses fonctions, et il y a un moteur dédié pour les exécuter. Par conséquent, lorsque vous utilisez DBFlute pour la première fois, il est nécessaire de télécharger le moteur et de définir l'environnement, mais c'est un outil pour préparer facilement un tel environnement. Il est distribué dans un format jar exécutable et peut être exécuté immédiatement dans n'importe quel environnement Java (https://github.com/dbflute/dbflute-intro/releases).

Mappeur O / R à essayer

Après avoir préparé l'environnement d'accès à la base de données, essayez d'utiliser les trois types de mappeurs O / R suivants à titre d'essai.

À propos de la version

Cet article utilise les versions suivantes.

procédure

0. Téléchargement Eclipse

Comme c'est un gros problème, je vais commencer par préparer l'environnement de codage et l'environnement d'exécution. Il n'est pas nécessaire que ce soit Eclipse, mais pour vous éviter quelques ennuis, je vais compter sur Pléiades All in One ici. Téléchargez Java Full Edition avec jkd pour Windows ou Mac à partir de http://mergedoc.osdn.jp/.

1. Créez un projet à partir de Spring Initializer

Créez un projet Spring Boot à partir de https://start.spring.io/. À ce moment-là, ajoutez ce qui suit à la dépendance Spring Boot.

image.png

Décompressez le fichier téléchargé dans un emplacement approprié (par exemple sous l'espace de travail si vous utilisez eclipse). sample-dbaccess-h2 ├─ .gitignore ├─ .mvn ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src

2. Téléchargement et déploiement de DBFlute Intro

Récupérez le fichier jar depuis github. https://github.com/dbflute/dbflute-intro/releases

Placez le fichier téléchargé directement sous le projet Spring que vous avez décompressé précédemment. sample-dbaccess-h2 ├─ .gitignore ├─ .mvn ├─ dbflute-intro.jar ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src

3. Exécutez DBFlute Intro

Exécutez le fichier dbflute-intro.jar. Pour plus tard, si le chemin java ne passe pas, transmettez-le.

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

Une fois exécuté, un serveur local sera lancé en interne et ouvert dans le navigateur. image.png

4. Configuration initiale du moteur DBFlute

Saisissez les informations requises et effectuez la configuration initiale. Après avoir terminé la saisie, cliquez sur le bouton "Créer" sur l'écran pour l'exécuter. image.png

Les points suivants doivent être notés lors de la saisie.

En outre, étant donné que DBFlute est utilisé comme exemple en tant que mappeur O / R, cliquez sur "Paramètres du mappeur O / R" sur le côté droit de l'écran pour le préparer pour l'entrée, puis entrez ce qui suit.

Si vous cliquez sur le bouton "Créer" et que l'exécution est réussie, l'écran suivant s'affiche. !! image.png

Il y a plus de fichiers dans le projet. sample-dbaccess ├─ .gitignore ├─ .mvn ├─ dbflute-intro.jar ├─ dbflute_sample_dbaccess_h2 ├─ mydbflute ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml └─ src

--mydbflute: moteur DBFlute. En gros, vous ne modifiez pas ici. --dbflute_ * xxx *: ce dossier contient les paramètres DBFlute pour chaque projet. "Xxx" est le "Nom du projet" entré dans la configuration initiale.

5. Création de DDL

Entrez le DDL tel que l'instruction de création de table dans replace-schema.sql dans le dossier DBFlute spécifique au projet "dbflute_sample_dbaccess_h2" créé précédemment.

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. Créer des données d'enregistrement

Cette fois, nous allons créer des données d'enregistrement au format tsv (format de données avec des tabulations comme délimiteurs). Il existe des règles spéciales lors de l'enregistrement des données et une attention particulière doit être portée aux noms de répertoires et de fichiers. Pour plus de détails, reportez-vous à "Enregistrement des données (TSV)".

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


DEPARTMENT_ID	DEPARTMENT_NAME
1 département 1
2 département 2
3 département 3

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


EMPLOYEE_ID	EMPLOYEE_NAME	DEPARTMENT_ID
11 Employé 11 1
12 salariés 12 1
13 Employés 13 1
21 Employés 21 2
22 Employés 22 2
23 Employés 23 2
31 Employé 31 3
32 salariés 32 3
33 Employé 33 3

7. Création de schéma et saisie de données

Sur l'écran DBFlute Intro, sélectionnez le projet créé et appuyez sur le bouton Remplacer le schéma pour exécuter la création de schéma et la saisie de données. image.png

Vous pouvez également exécuter le fichier manage.bat. Notez que le chemin java est en place.

cd dbflute_sample_dbaccess_h2
manage.bat 0

Le fichier de données pour h2 a augmenté directement sous le projet. Le nom de fichier (\ * .mv.db) créé ici est spécifié par l'URL de connexion entrée dans la configuration initiale de DBFlute Intro. 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. Génération automatique de code source

La génération automatique du code source pour DBFlute n'a pas pu être effectuée à partir de l'écran DBFlute Intro, alors exécutez-la depuis la ligne de commande. Exécutez manage.bat avec l'argument "2: régénérer" (ou vous pouvez l'exécuter sans aucun argument et le saisir plus tard). Voir Manage Tasks pour plus d'informations.

cd dbflute_sample_dbaccess
manage.bat 2

En cas de succès, le code généré automatiquement sera sorti sous le package entré dans 4. Configuration initiale de DBFlute Engine.

9. Ajouter les paramètres Spring

Ajoutez des paramètres pour utiliser le mappeur O / R sur Spring.

Modifiez d'abord pom.xml. Ajustez la version Java pour ajouter des dépendances DBFlute.

pom.xml


<properties>
    <java.version>1.11</java.version>
</properties>
<!--Omission-->
<dependencies>
    <!--Ajouter à diverses dépendances existantes-->
    <dependency>
        <groupId>org.dbflute</groupId>
        <artifactId>dbflute-runtime</artifactId>
        <version>1.2.0</version>
    </dependency>
</dependencies>

src/main/resources/application.yml


#Informations de connexion à la base de données commune
spring:
  datasource:
    url: jdbc:h2:file:./_h2/h2data
    username: sa
    driverClassName: org.h2.Driver

#Paramètres de My Batis. lower_Mappez le nom de la colonne de cas à la propriété camelCase
mybatis:
  configuration:
    mapUnderscoreToCamelCase: true

Remarque 1. À propos de la chaîne de caractères de connexion

La chaîne de connexion pour h2 est «h2: fichier: chemin du fichier». Ici, pour le chemin du fichier, spécifiez le chemin relatif depuis le répertoire de base lors de l'exécution de java (lors de l'exécution depuis eclipse, directement sous le projet) ou le chemin absolu.

Remarque 2. À propos du chemin du fichier

Si vous définissez ʻurl: jdbc: h2: file: _h2 / h2data au lieu de ʻurl: jdbc: h2: file: ./_h2 / h2data dans le paramètre de chemin de fichier de h2, l'erreur suivante se produira à l'exécution.

URL de base de données avec chemin de fichier relatif à partir du répertoire courant implicite("jdbc:h2:file:_h2/h2data")Il n'est pas permis de spécifier dans. Chemin absolu ou relatif à la place( ~/name, ./name)Ou spécifiez baseDir.
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]

Si vous utilisez un chemin relatif, il semble que vous deviez écrire explicitement le chemin en commençant par le . actuel.

Remarque 3. Si une erreur se produit lors de l'éclipse

Sélectionnez un projet et essayez "Maven> Mettre à jour le projet".

10. Essai de DBFlute

Ajoutez le fichier suivant et démarrez facilement Spring à partir de la ligne de commande.

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("Commencer le traitement");
        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()));
        });
        //Traitement des applications
        System.out.println("Sortie de traitement");
    }
}

11. Essai de MyBatis

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("Commencer le traitement");
        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");
            }
        });
        //Traitement des applications
        System.out.println("Sortie de traitement");
    }
}

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. Essai de Spring JDBC

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("Commencer le traitement");
        findEmployeeList(2).forEach(map -> {
            System.out.println(
                String.format(
                    "employeeName: %s, departmentName: %s",
                    map.get("EMPLOYEE_NAME"),
                    map.get("DEPARTMENT_NAME")));
        });
        System.out.println("Sortie de traitement");
    }

    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);
    }
}

en conclusion

Après tout, je pensais que l'article créé par copier-coller était facile. Lors de l'écriture du code source, vous devez copier et coller et viser DRY ...

Supplément A. DBFlute comme outil de support de gestion de base de données

S'il y a un changement d'ajout de table, modifiez replace-schema.sql et les données d'enregistrement, exécutez manage.bat, la table existante sera supprimée et régénérée, et la migration est possible dans l'environnement de développement. En outre, DBFlute a d'excellentes fonctions en tant qu'outil de migration, comme un outil de comparaison des différences de schéma (Référence: "[20160521 Derrière le renouvellement complet du service de distribution vidéo à grande échelle avec Java 8](https: //www.slideshare) .net / SuguruAkiho / 20160521-jjug-cccunext) ". Même si vous ne pouvez pas l'introduire en tant que mappeur O / R, veuillez envisager de l'introduire en tant qu'outil de support de gestion de base de données.

Supplément B: Démarrez le serveur de la base de données H2 et activez plusieurs accès simultanés.

Si vous souhaitez accéder à la base de données à partir de plusieurs applications en même temps, il n'est pas possible de se connecter avec file: ... en raison de restrictions. Plusieurs accès simultanés peuvent se produire non seulement dans un environnement de production, mais également dans un environnement de développement local. Par exemple, lorsque vous souhaitez mettre à jour le schéma avec DBFlute pendant que l'application Web est en cours d'exécution. Pour ce faire, vous devez utiliser la fonction serveur.

La procédure de démarrage du serveur est brièvement décrite ci-dessous.

Télécharger H2DB

Téléchargez toutes les plates-formes à partir du Site Honke. image.png

Déplacer les fichiers requis

Décompressez le fichier zip téléchargé et déplacez les fichiers requis vers votre projet. Puisque seul le runtime est requis, déplacez les fichiers suivants de sous bin vers le répertoire pour h2.

La structure du projet est la suivante.

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

Exécuter le script de démarrage

Cd sous le même répertoire que le script de démarrage que vous avez déplacé ci-dessus et exécutez le script de démarrage. Notez que le chemin Java doit être de la même manière que l'exécution de DBFlute Intro. Le navigateur démarre et l'écran passe à l'écran de connexion de la console h2.

Vérifiez le schéma et les données sur la console h2

Vous n'avez pas besoin de vous connecter à la console, mais ici nous essaierons de vérifier l'entrée de données de la console. Entrez les informations suivantes pour vous connecter à la console. image.png

Lorsque vous vous connectez, vous pouvez confirmer que la table a été créée et que les données ont été saisies. image.png

Modifier les paramètres de l'application

Modifiez la chaîne de connexion comme suit: url: jdbc:h2:tcp://localhost/./h2data

src/main/resources/application.yml


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

dbflute_sample_dbaccess_h2/dfprop/databaseInfoMap.dfprop


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

Remarque 1. À propos de la spécification du chemin

Pour la même raison que celle déjà mentionnée, il ne peut pas être ʻurl: jdbc: h2: tcp: // localhost / h2data. Doit être un chemin explicitement relatif . / H2data au lieu de h2data`.

Remarque 2. À propos des paramètres du serveur

Bien que cela n'ait pas été vérifié, il semble qu'il soit possible de définir les paramètres (port, etc.) lors du démarrage du serveur. http://www.h2database.com/html/tutorial.html#console_settings

Remarque 3. À propos de la première construction de schéma

Le fichier (h2data.mv.db dans l'exemple ci-dessus) n'est pas terminé. Lorsque j'ai démarré le serveur sur H2 au premier accès et effectué le remplacement du schéma à partir de DBFlute, une erreur s'est produite.

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

J'ai reçu un message d'erreur disant que si j'ajoute ʻIFEXISTS = true à l'option de connexion, il ne peut pas être créé automatiquement, donc j'ai essayé de définir ʻIFEXISTS = false, mais cela n'a pas fonctionné.

Pour le moment, la première fois, je l'évite par la méthode suivante.

--Accès avec file: au lieu de tcp:. --Initialiser à partir de H2 Management Console

Recommended Posts

Construction d'environnement DB avec DBFlute Intro + H2 Database
Construire et distribuer DB avec Apache Derby + DBFlute Intro
Création d'un environnement de base de données avec Docker dans Spring Boot (IntellJ)
[Docker] Construction de l'environnement Rails 5.2 avec docker
[Construction de l'environnement avec Docker] Rails 6 et MySQL 8
Construction de l'environnement GPU avec Docker [version d'octobre 2020]
Construction d'environnement de rails avec Docker (apocalypse personnelle)
Construction de l'environnement de développement Laravel avec Docker (Mac)
Construire un environnement pour Laravel + MySQL + phpMyadmin avec Docker
Résumé de la construction de l'environnement avec rvm et postgresql
Introduction à la bataille de robots avec Robocode (construction d'environnement)
[Développement d'applications Jakarta EE 8 avec Gradle] 1. Construction de l'environnement
Procédure de construction d'environnement pour l'utilisation de PowerMock avec JUnit
Spring with Kotorin --8 Repository layer --Supplément: H2 Database
Construction de l'environnement IntelliJ + Docker (APP + DB) + SpringBoot (Maven)
Procédure de construction et de développement de l'environnement local Wordpress avec Docker
[Java] Construction de l'environnement
[Printemps] Construction de l'environnement
Manuel de construction de l'environnement de développement stable pour "Rails6" avec "Docker-compose"
Rails5 + MySQL8.0 + Construction d'environnement de volumes de premier niveau avec docker-compose
[Java] Procédure de construction de l'environnement pour le développement de struts 1.3 avec Eclipse
Créer un environnement de développement Java + Spring avec VirtualBox + Ubuntu (Xfce4)