Comment gérer le code Java généré automatiquement par l'exemple jOOQ et Flyway

TL;DR

2019-03-jooq-flyway-sample.png

Detail

À JJUG-CCC (Japan Java Users Group Cross Community Conference) en décembre 2018 Parlons du mappeur O / R et de la migration de base de données tout en comparant les outils ) A reçu le titre.

Parmi les nombreux mappeurs O / R et outils de migration de base de données, il s'agissait de la recommandation jOOQ et de la recommandation Flyway. D'un autre côté, bien que ce soit une histoire que j'entends des gens sur les blogs de rue, il semble qu'il y ait de nombreux cas où ils sont utilisés légèrement de manière incorrecte. ** Le cas où le code source Java généré automatiquement par jOOQ est géré par version en tant que cible de validation git est particulièrement grave. Tu ferais mieux de l'arrêter. ** Si plusieurs développeurs ajoutent par inadvertance des colonnes à la même table en même temps, une grande quantité de code Java généré automatiquement par jOOQ provoquera toujours un conflit.

jOOQ lit la structure du schéma de base de données spécifié de manière précise et incomparable, et génère automatiquement du code Java qui facilite le mappage O / R. ** Cela signifie que c'est la définition du schéma de base de données, c'est-à-dire les instructions dites DDL telles que CREATE TABLE et ALTER TABLE, qui doivent être gérées avec précision et sans correspondance. Flyway rend cela possible. ** **

Puisque jOOQ génère automatiquement du code Java, vous voudrez spécifier la destination de sortie sous src / main / java, mais c'est le piège. Si vous utilisez gradle, spécifiez l'emplacement du code source après avoir spécifié la destination de sortie du code généré automatiquement de jOOQ sous build /, et la compilation passera. Il n'y a aucun problème sur IntelliJ IDEA. Cependant, je ne connais pas l'ancienne arme appelée Eclipse.

Essayez d'exécuter l'exemple de code

Préparez simplement un PC avec git, JDK8 ou supérieur, et docker et exécutez la commande suivante.

git clone [email protected]:nabedge/jooq-flyway-spboot-sample.git
cd jooq-flyway-spboot-sample
sh setup.sh
sh ./gradlew run -p pj-web
Http dans le navigateur://localhost:Ouvrir 8080

Essayez d'importer l'exemple de code dans IntelliJ IDEA en tant que projet

  1. Suivez les étapes ci-dessus pour exécuter sh setup.sh
  2. File -> New -> Project from existing sources
  3. Ouvrez en spécifiant build.gradle directement sous le répertoire jooq-flyway-spboot-sample
  4. Cochez utiliser l'importation automatique et appuyez sur le bouton OK
  5. Cliquez sur SampleApplication.java dans le projet pj-web pour le lancer
  6. Ouvrez http: // localhost: 8080 dans votre navigateur

Points sur la façon d'utiliser Docker

Points sur l'utilisation de Flyway

Points sur la façon d'utiliser jOOQ

jOOQ et build.gradle

Expliquons un peu plus de par ici.

jooq {
    version = "${jooqVersion}"
    edition = 'OSS' // if you use oracle, you should pay :-)

    // the name "sample" -> task name "generateSampleJooqSchemaSource" . see below.
    sample (sourceSets.main) {
        jdbc {
            driver = "${jdbcDriver}"
            url = "${dbUrl}"
            user = "${dbUser}"
            password = "${dbPassword}"
        }
        generator {
            target {
                packageName = "${jooqDestPackage}"
                directory = "${jooqDestDir}"
            }
            strategy {
                name = 'com.example.db.jooq.generator.SamplePrefixGeneratorStrategy'
            }
            database() {
                name = 'org.jooq.meta.postgres.PostgresDatabase'
                inputSchema = "public"
            }
            generate() {
                daos = true
                immutablePojos = true
                pojosEqualsAndHashCode = true
            }
        }
    }
}

compileJava {
    dependsOn generateSampleJooqSchemaSource
    sourceSets.main.java.srcDirs(jooqDestDir)
}

Ajouter un préfixe / suffixe au nom de classe du code généré automatiquement par jOOQ

Comme je l'ai mentionné dans Environ 50 pages de mappeur O / R réel et de migration de base de données ont parlé en comparant les outils, jOOQ est le nom de la table par défaut. Créera une classe Java avec exactement le même nom que. ** La personnalisation est fortement recommandée. ** Les conflits de nom de classe peuvent entraîner un stress considérable pendant le processus de codage.

Donc, cette partie de build.gradle ci-dessus

            strategy {
                name = 'com.example.db.jooq.generator.SamplePrefixGeneratorStrategy'
            }

Devient important. Cette classe est la seule classe du sous-projet appelée pj-db-custom-strategy Il est implémenté en tant que /src/main/java/com/example/db/jooq/generator/SamplePrefixGeneratorStrategy.java).

import org.jooq.codegen.DefaultGeneratorStrategy;
import org.jooq.meta.Definition;

public class SamplePrefixGeneratorStrategy extends DefaultGeneratorStrategy {

    @Override
    public String getJavaClassName(final Definition definition, final Mode mode) {

        String name = super.getJavaClassName(definition, mode);

        switch (mode) {
            case POJO:
                return name + "Vo";
            case DEFAULT:
                return 'J' + name;
        }

        return name;
    }

Comme vous pouvez le voir, tous les préfixes de classe Java générés automatiquement par jOOQ ont "J". Cela se traduira par [Code d'accès à la base de données réel](https://github.com/nabedge/jooq-flyway-spboot-sample/blob/master/pj-web/src/main/java/com/example/web/ Dans BookRepository.java)

        final JBook jBook = JBook.BOOK;
        final List<BookVo> selected = dslContext
                .select(
                        jBook.ISBN,
                        jBook.TITLE,
                        jBook.PUBLISH_DATE
                )
                .from(jBook)
                .orderBy(jBook.PUBLISH_DATE)
                .fetchInto(BookVo.class);
                // .fetchInto(Book.class); // or you can use original class directly !

        return selected
                .stream()
                .map(bookVo -> {
                    Book book = new Book();
                    book.setIsbn(bookVo.getIsbn());
                    book.setTitle(bookVo.getTitle());
                    book.setPublishDate(bookVo.getPublishDate().toLocalDate());
                    return book;
                })
                .collect(Collectors.toList());

de cette façon,

Vous pourrez éviter ces conflits de noms.

en conclusion

Si vous déplacez l'échantillon tout en lisant chacun et que vous l'importez dans l'EDI, vous pouvez voir les points. Happy Hacking !


Cet article est réimprimé par l'auteur lui-même à partir de son propre blog. -> https://nabedge.mixer2.org/2019/03/jooq-flyway-sample.html

Recommended Posts

Comment gérer le code Java généré automatiquement par l'exemple jOOQ et Flyway
Exemple de configuration minimale pour publier automatiquement Lambda par Java avec un pipeline de code
Exemple de code Java 02
Exemple de code Java 03
Exemple de code Java 04
Exemple de code Java 01
Exemple de code pour convertir List en List <String> dans Java Stream
[Java] Comment obtenir une requête par communication HTTP
[Java] Comment découper une chaîne de caractères caractère par caractère
Comment créer un environnement de développement Java avec VS Code
Exemple de code pour la sortie du journal par Java + SLF4J + Logback
Comment Git gérer les projets Java EE dans Eclipse
Comment exécuter l'exemple WebCamCapture de NyARToolkit pour Java
Exemple de code pour analyser la date et l'heure avec SimpleDateFormat de Java
Comment sélectionner une date spécifiée par code dans le calendrier FS
Comment abaisser la version java
[Java] Comment utiliser Map
Comment désinstaller Java 8 (Mac)
Comment écrire du bon code
Java - Comment créer JTable
Collection d'exemples de code parallèle Java
Comment utiliser java Facultatif
Comment réduire les images Java
Comment rédiger un commentaire java
[Java] Comment utiliser removeAll ()
Comment utiliser Java Map
Comment définir des constantes Java
Comment utiliser les variables Java
Comment convertir la base Java
[Java] Comment implémenter le multithreading
Comment initialiser un tableau Java
[R Spec on Rails] Comment écrire du code de test pour les débutants par les débutants
À propos de TestSize préconisé par Google et comment réaliser TestSize par Java et Maven
Comment faire fonctionner automatiquement un écran créé en Java sous Windows
Exemple de code pour appeler l'API Yahoo! Local Search en Java
Comment étudier Java Silver SE 8
Comment utiliser HttpClient de Java (Get)
Étudier Java # 6 (Comment écrire des blocs)
Comment créer un conteneur Java
Comment désassembler un fichier de classe Java
Comment utiliser HttpClient de Java (Post)
Comment apprendre JAVA en 7 jours
Nouvelles fonctionnalités de Java 9 et exemple de code
[Traitement × Java] Comment utiliser les variables
Comment décompiler un fichier de classe Java
Code de création de chaîne arbitraire par Java
[JavaFX] [Java8] Comment utiliser GridPane
Comment écrire une déclaration de variable Java
Comment utiliser les méthodes de classe [Java]
[Java] Comment utiliser List [ArrayList]
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Comment passer Oracle Java Silver