Memulai jOOQ

1. Perkenalan

Dalam tutorial ini, kita akan melakukan tur singkat dalam menjalankan aplikasi dengan jOOQ (Java Object Orientated Query). Pustaka ini menghasilkan kelas Java berdasarkan tabel database dan memungkinkan kita membuat kueri SQL yang aman bagi tipe melalui API fasihnya.

Kami akan membahas seluruh pengaturan, koneksi database PostgreSQL, dan beberapa contoh operasi CRUD.

2. Ketergantungan Maven

Untuk pustaka jOOQ, kita membutuhkan tiga dependensi jOOQ berikut:

 org.jooq jooq 3.13.4   org.jooq jooq-meta 3.13.4   org.jooq jooq-codegen 3.13.4 

Kami juga membutuhkan satu ketergantungan untuk driver PostgreSQL:

 org.postgresql postgresql 42.2.16 

3. Struktur Basis Data

Sebelum kita mulai, mari buat skema DB sederhana untuk contoh kita. Kami akan menggunakan Penulis sederhana dan hubungan Artikel :

create table AUTHOR ( ID integer PRIMARY KEY, FIRST_NAME varchar(255), LAST_NAME varchar(255), AGE integer ); create table ARTICLE ( ID integer PRIMARY KEY, TITLE varchar(255) not null, DESCRIPTION varchar(255), AUTHOR_ID integer CONSTRAINT fk_author_id REFERENCES AUTHOR );

4. Koneksi Database

Sekarang, mari kita lihat bagaimana kita akan menghubungkan ke database kita.

Pertama, kita perlu memberikan pengguna, kata sandi, dan URL lengkap ke database. Kami akan menggunakan properti ini untuk membuat objek Connection dengan menggunakan DriverManager dan metode getConnection :

String userName = "user"; String password = "pass"; String url = "jdbc:postgresql://db_host:5432/baeldung"; Connection conn = DriverManager.getConnection(url, userName, password); 

Selanjutnya, kita perlu membuat instance DSLContext . Objek ini akan menjadi titik masuk kami untuk antarmuka jOOQ:

DSLContext context = DSL.using(conn, SQLDialect.POSTGRES);

Dalam kasus kami, kami meneruskan dialek POSTGRES , tetapi ada beberapa yang lain yang tersedia seperti H2, MySQL, SQLite, dan banyak lagi.

5. Pembuatan Kode

Untuk membuat kelas Java untuk tabel database kita, kita membutuhkan file jooq-config.xml berikut :

   org.postgresql.Driver jdbc:postgresql://db_url:5432/baeldung_database username password   org.jooq.codegen.JavaGenerator  org.jooq.meta.postgres.PostgresDatabase public .*    com.baeldung.jooq.model C:/projects/baeldung/tutorials/jooq-examples/src/main/java   

Konfigurasi kustom memerlukan perubahan dalam bagian tempat kami menempatkan kredensial database dan di bagian di mana kita mengkonfigurasi nama paket dan direktori lokasi untuk kelas yang akan kita buat.

Untuk menjalankan alat pembuat kode jOOQ, kita perlu menjalankan kode berikut:

GenerationTool.generate( Files.readString( Path.of("jooq-config.xml") ) );

Setelah pembuatan selesai, kita akan mendapatkan dua kelas berikut, masing-masing sesuai dengan tabel database-nya:

com.baeldung.model.generated.tables.Article; com.baeldung.model.generated.tables.Author;

6. Operasi CRUD

Sekarang, mari kita lihat beberapa operasi CRUD dasar yang dapat kita lakukan dengan pustaka jOOQ.

6.1. Membuat

Pertama, mari buat rekaman Artikel baru . Untuk melakukannya, kita perlu memanggil metode newRecord dengan referensi tabel yang tepat sebagai parameter:

ArticleRecord article = context.newRecord(Article.ARTICLE);

The Article.ARTICLE variabel contoh referensi ke PASAL tabel database. Itu secara otomatis dibuat oleh jOOQ selama pembuatan kode.

Selanjutnya, kita dapat menetapkan nilai untuk semua properti yang dibutuhkan:

article.setId(2); article.setTitle("jOOQ examples"); article.setDescription("A few examples of jOOQ CRUD operations"); article.setAuthorId(1);

Terakhir, kita perlu memanggil metode penyimpanan pada rekaman untuk menyimpannya dalam database:

article.store();

6.2. Bacaan

Sekarang, mari kita lihat bagaimana kita bisa membaca nilai dari database. Sebagai contoh, mari pilih semua penulis:

Result authors = context.select() .from(Author.AUTHOR) .fetch();

Di sini, kami menggunakan metode pemilihan yang dikombinasikan dengan klausa from untuk menunjukkan dari tabel mana yang ingin kami baca. Memanggil metode pengambilan mengeksekusi kueri SQL dan mengembalikan hasil yang dihasilkan.

The Hasil obyek alat yang Iterable antarmuka, sehingga mudah untuk iterate atas setiap elemen. Dan saat memiliki akses ke satu record, kita bisa mendapatkan parameternya dengan menggunakan metode getValue dengan referensi bidang yang tepat:

authors.forEach(author -> { Integer id = author.getValue(Author.AUTHOR.ID); String firstName = author.getValue(Author.AUTHOR.FIRST_NAME); String lastName = author.getValue(Author.AUTHOR.LAST_NAME); Integer age = author.getValue(Author.AUTHOR.AGE); System.out.printf("Author %s %s has id: %d and age: %d%n", firstName, lastName, id, age); });

Kami dapat membatasi kueri pemilihan ke satu set bidang tertentu. Mari kita ambil hanya id dan judul artikel:

Result
    
      articles = context.select(Article.ARTICLE.ID, Article.ARTICLE.TITLE) .from(Author.AUTHOR) .fetch();
    

Kita juga dapat memilih satu objek dengan metode fetchOne . Parameter untuk yang satu ini adalah referensi tabel dan kondisi untuk mencocokkan record yang benar.

Dalam kasus kita, mari kita pilih Pengarang dengan id sama dengan 1:

AuthorRecord author = context.fetchOne(Author.AUTHOR, Author.AUTHOR.ID.eq(1))

Jika tidak ada catatan yang cocok dengan kondisi tersebut, metode fetchOne akan mengembalikan null .

6.3. Memperbarui

To update a given record, we can use the update method from the DSLContext object combined with a set method invocations for every field we need to change. This statements should be followed by a where clause with a proper match condition:

context.update(Author.AUTHOR) .set(Author.AUTHOR.FIRST_NAME, "David") .set(Author.AUTHOR.LAST_NAME, "Brown") .where(Author.AUTHOR.ID.eq(1)) .execute();

The update query will run only after we call the execute method. As a return value, we'll get an integer equal to the number of records that were updated.

It's also possible to update an already fetched record by executing its store method:

ArticleRecord article = context.fetchOne(Article.ARTICLE, Article.ARTICLE.ID.eq(1)); article.setTitle("A New Article Title"); article.store();

The store method will return 1 if the operation was successful or 0 if the update was not necessary. For example, nothing was matched by the condition.

6.4. Deleting

To delete a given record, we can use the delete method from the DSLContext object. The delete condition should be passed as a parameter in the following where clause:

context.delete(Article.ARTICLE) .where(Article.ARTICLE.ID.eq(1)) .execute();

The delete query will run only after we call the execute method. As a return value, we'll get an integer equal to the number of deleted records.

It's also possible to delete an already fetched record by executing its delete method:

ArticleRecord articleRecord = context.fetchOne(Article.ARTICLE, Article.ARTICLE.ID.eq(1)); articleRecord.delete();

The delete metode akan kembali 1 jika operasi berhasil atau 0 jika penghapusan itu tidak perlu. Misalnya, saat tidak ada yang cocok dengan kondisi.

7. Kesimpulan

Pada artikel ini, kami telah mempelajari cara mengkonfigurasi dan membuat aplikasi CRUD sederhana menggunakan kerangka jOOQ. Seperti biasa, semua kode sumber tersedia di GitHub.