So verwalten Sie Java-Code, der automatisch von jOOQ & Flyway generiert wird

TL;DR

2019-03-jooq-flyway-sample.png

Detail

Auf der JJUG-CCC (Community Community Conference der Japan Java Users Group) im Dezember 2018 Über O / R-Mapper und DB-Migration beim Vergleich von Tools sprechen ) Wurde der Titel gegeben.

Unter den vielen O / R-Mappern und DB-Migrationstools war der Inhalt die jOOQ-Empfehlung und die Flyway-Empfehlung. Auf der anderen Seite scheint es, obwohl es eine Geschichte ist, die ich von Leuten auf den Straßenblogs höre, dass es viele Fälle gibt, in denen sie leicht falsch verwendet werden. ** Besonders schlimm ist der Fall, in dem der von jOOQ automatisch generierte Java-Quellcode als Commit-Ziel von git versioniert wird. Du solltest es besser aufhalten. ** Wenn mehrere Entwickler versehentlich gleichzeitig Spalten zur gleichen Tabelle hinzufügen, führt eine große Menge an Java-Code, der automatisch von jOOQ generiert wird, immer zu einem Konflikt.

jOOQ liest die Struktur des angegebenen DB-Schemas genau und unvergleichlich und generiert automatisch Java-Code, der die O / R-Zuordnung erleichtert. ** Dies bedeutet, dass die DB-Schemadefinition, dh die sogenannten DDL-Anweisungen wie CREATE TABLE und ALTER TABLE, genau und nicht übereinstimmend versioniert werden sollte. Flyway macht das möglich. ** **.

Da jOOQ automatisch Java-Code generiert, ist es verlockend, das Ausgabeziel unter src / main / java anzugeben, aber das ist die Gefahr. Wenn Sie gradle verwenden, geben Sie den Speicherort des Quellcodes an, nachdem Sie das Ausgabeziel des automatisch generierten Codes von jOOQ unter build / angegeben haben. Die Kompilierung wird dann übergeben. Bei IntelliJ IDEA gibt es kein Problem. Ich weiß jedoch nichts über die alte Waffe namens Eclipse.

Versuchen Sie, den Beispielcode auszuführen

Bereiten Sie einfach einen PC mit git, JDK8 oder höher und Docker vor und führen Sie den folgenden Befehl aus.

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 im Browser://localhost:Öffnen Sie 8080

Versuchen Sie, den Beispielcode als Projekt in IntelliJ IDEA zu importieren

  1. Führen Sie die obigen Schritte aus, um sh setup.sh auszuführen
  2. File -> New -> Project from existing sources
  3. Öffnen Sie, indem Sie build.gradle direkt im Verzeichnis jooq-flyway-spboot-sample angeben
  4. Aktivieren Sie die Option Auto-Import verwenden und klicken Sie auf OK
  5. Klicken Sie im pj-web-Projekt auf SampleApplication.java, um es zu starten
  6. Öffnen Sie http: // localhost: 8080 in Ihrem Browser

Punkte zur Verwendung von Docker

Punkte zur Verwendung von Flyway

Punkte zur Verwendung von jOOQ

jOOQ und build.gradle

Lassen Sie uns etwas mehr von [around] erklären (https://github.com/nabedge/jooq-flyway-spboot-sample/blob/master/pj-db/build.gradle#L35).

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

Fügen Sie dem Klassennamen des von jOOQ automatisch generierten Codes Präfix / Suffix hinzu

Wie in Rund 50 Seiten der tatsächlichen O / R-Mapper- und DB-Migration beim Vergleich von Tools erwähnt, ist jOOQ standardmäßig der Tabellenname Erstellt eine Java-Klasse mit genau demselben Namen wie. ** Benutzerdefiniert wird dringend empfohlen. ** Klassennamenkonflikte können während des Codierungsprozesses zu erheblichen Belastungen führen.

Also dieser Teil von build.gradle oben

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

Wird wichtig. Diese Klasse ist die einzige Klasse im Teilprojekt mit dem Namen pj-db-custom-Strategy Es ist implementiert als /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;
    }

Wie Sie sehen können, haben alle von jOOQ automatisch generierten Java-Klassenpräfixe "J". Dies führt zu Actual DB Access Code. In 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());

auf diese Weise,

Sie können diese Namenskonflikte vermeiden.

abschließend

Wenn Sie das Beispiel beim Lesen verschieben und in die IDE importieren, können Sie die Punkte sehen. Happy Hacking !


Dieser Artikel wird vom Autor selbst aus seinem eigenen Blog nachgedruckt. -> https://nabedge.mixer2.org/2019/03/jooq-flyway-sample.html

Recommended Posts

So verwalten Sie Java-Code, der automatisch von jOOQ & Flyway generiert wird
Mindestkonfigurationsbeispiel für die automatische Freigabe von Lambda durch Java mit Code-Pipeline
Java-Beispielcode 02
Java-Beispielcode 03
Java-Beispielcode 04
Java-Beispielcode 01
Beispielcode zum Konvertieren von List in List <String> in Java Stream
[Java] So erhalten Sie eine Anfrage per HTTP-Kommunikation
[Java] So schneiden Sie eine Zeichenfolge zeichenweise aus
So erstellen Sie eine Java-Entwicklungsumgebung mit VS Code
Beispielcode für die Protokollausgabe von Java + SLF4J + Logback
So verwalten Sie Java EE-Projekte in Eclipse
Ausführen des WebCamCapture-Beispiels von NyARToolkit für Java
Beispielcode zum Parsen von Datum und Uhrzeit mit Java SimpleDateFormat
So wählen Sie ein bestimmtes Datum anhand des Codes im FS-Kalender aus
So senken Sie die Java-Version
[Java] Verwendung von Map
So deinstallieren Sie Java 8 (Mac)
Wie man guten Code schreibt
Java - So erstellen Sie JTable
Java Parallel Code Sample Collection
Verwendung von Java Optional
So minimieren Sie Java-Images
Wie schreibe ich einen Java-Kommentar
[Java] Verwendung von removeAll ()
Verwendung von Java Map
So legen Sie Java-Konstanten fest
Verwendung von Java-Variablen
So konvertieren Sie Java Base
[Java] So implementieren Sie Multithreading
So initialisieren Sie ein Java-Array
[R Spec on Rails] So schreiben Sie Testcode für Anfänger von Anfängern
Informationen zu TestSize, das von Google empfohlen wird, und zur Realisierung von TestSize durch Java und Maven
So bedienen Sie automatisch einen in Java unter Windows erstellten Bildschirm
Beispielcode zum Aufrufen der Yahoo! Local Search API in Java
So lernen Sie Java Silver SE 8
Verwendung von HttpClient (Get) von Java
Java # 6 studieren (Wie man Blöcke schreibt)
So erstellen Sie einen Java-Container
So zerlegen Sie eine Java-Klassendatei
Verwendung von HttpClient (Post) von Java
Wie man JAVA in 7 Tagen lernt
Java 9 neue Funktionen und Beispielcode
[Verarbeitung × Java] Verwendung von Variablen
So dekompilieren Sie eine Java-Klassendatei
Beliebiger Code zum Erstellen von Zeichenfolgen durch Java
[JavaFX] [Java8] Verwendung von GridPane
So schreiben Sie eine Java-Variablendeklaration
Verwendung von Klassenmethoden [Java]
[Java] Verwendung von List [ArrayList]
Wie verwende ich Klassen in Java?
So benennen Sie Variablen in Java
So übergeben Sie Oracle Java Silver