[JAVA] Construire et distribuer DB avec Apache Derby + DBFlute Intro

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 ... ** Apache Derby ** semble résoudre un tel problème.

Qu'est-ce que Apache Derby?

Apache Derby est un RDB léger entièrement composé de Java. Il peut être facilement exécuté avec seulement un accès aux fichiers ou à la mémoire, et est très approprié pour l'éducation et la distribution d'exemples d'application.

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.

À propos du code source de cet article

D'ici Vous pouvez le télécharger. Il peut être exécuté immédiatement en l'important dans eclipse, etc. avec une connexion DB possible.

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. Téléchargement du fichier Apache Derby

Obtenez les fichiers de la série 10.14 depuis Maven Repository. image.png

2. 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 ├─ .gitignore ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml ├─.mvn └─src

3. 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 ├─ .gitignore ├─ dbflute-intro.jar ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml ├─.mvn └─src

4. 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

5. 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. setupdone_dbflute_intro.png

Il y a plus de fichiers dans le projet. sample-dbaccess ├─ .gitignore ├─ dbflute-intro.jar ├─ dbflute_sample_dbaccess ├─ mydbflute ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml ├─.mvn └─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.

6. Créer 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_ * xxx *" créé précédemment.

dbflute_sample_dbaccess/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)
);

7. Création de données pour l'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/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/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

8. 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
manage.bat 0

Le nombre de fichiers de données pour le derby a augmenté directement dans le cadre du projet. Le nom du répertoire créé ici est spécifié par l'URL de connexion saisie lors de la configuration initiale de DBFlute Intro. sample-dbaccess ├─ .gitignore ├─ _derbydata ├─ dbflute-intro.jar ├─ dbflute_sample_dbaccess ├─ mydbflute ├─ HELP.md ├─ mvnw ├─ mvnw.cmd ├─ pom.xml ├─.mvn └─src

9. 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 5. Configuration initiale de DBFlute Engine.

10. 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.1.9</version>
    </dependency>
</dependencies>

src/main/resources/application.yml


#Informations de connexion à la base de données commune
spring:
  datasource:
    url: jdbc:derby:_derbydata
    username: APP
    driverClassName: org.apache.derby.jdbc.EmbeddedDriver

#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 du nom d'utilisateur

La chaîne de connexion pour derby est jdbc: file path. 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. Si une erreur se produit lors de l'éclipse

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

11. Essai de DBFlute

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

SampleDbaccessDBFluteApplication.java


@SpringBootApplication
public class SampleDbaccessDBFluteApplication {

    @Autowired
    EmployeeBhv employeeBhv;

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(SampleDbaccessDBFluteApplication.class, args)) {
            SampleDbaccessDBFluteApplication app = ctx.getBean(SampleDbaccessDBFluteApplication.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");
    }
}

12. Essai de MyBatis

SampleDbaccessMyBatisApplication.java


@SpringBootApplication
public class SampleDbaccessMyBatisApplication {

    @Autowired
    EmployeeMapper employeeMapper;

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(SampleDbaccessMyBatisApplication.class, args)) {
            SampleDbaccessMyBatisApplication app = ctx.getBean(SampleDbaccessMyBatisApplication.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
}

13. Exécution d'essai de Spring JDBC

SampleDbaccessJDBCApplication.java


@SpringBootApplication
public class SampleDbaccessJDBCApplication {

    @Autowired
    JdbcTemplate jdbcTemplate;

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(SampleDbaccessJDBCApplication.class, args)) {
            SampleDbaccessJDBCApplication app = ctx.getBean(SampleDbaccessJDBCApplication.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);
    }
}

Bonus DB Flute 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.

en conclusion

En important dans eclipse etc., il est distribué sous une forme qui peut être exécutée immédiatement. Le total du code source + base de données Derby n'est que de 287 Ko (après compression). Essayez immédiatement l'exemple de mappeur O / R et faites-en l'expérience.

Recommended Posts

Construire et distribuer DB avec Apache Derby + DBFlute Intro
Construction d'environnement DB avec DBFlute Intro + H2 Database