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