TL;DR
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.
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
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)
}
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.
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