Bermula dengan jOOQ

1. Pengenalan

Dalam tutorial ini, kita akan melakukan lawatan singkat menjalankan aplikasi dengan jOOQ (Java Object Orientated Query). Perpustakaan ini menghasilkan kelas Java berdasarkan jadual pangkalan data dan memungkinkan kami membuat pertanyaan SQL selamat jenis melalui API lancarnya.

Kami akan merangkumi keseluruhan penyediaan, sambungan pangkalan data PostgreSQL, dan beberapa contoh operasi CRUD.

2. Pergantungan Maven

Untuk perpustakaan jOOQ, kami memerlukan tiga pergantungan jOOQ berikut:

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

Kami juga memerlukan satu pergantungan untuk pemacu PostgreSQL:

 org.postgresql postgresql 42.2.16 

3. Struktur Pangkalan Data

Sebelum memulakan, mari buat skema DB ringkas untuk contoh kami. Kami akan menggunakan hubungan Pengarang dan Artikel yang mudah :

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. Sambungan Pangkalan Data

Sekarang, mari kita lihat bagaimana kita akan menyambung ke pangkalan data kita.

Pertama, kita perlu memberikan pengguna, kata laluan, dan URL lengkap ke pangkalan data. Kami akan menggunakan sifat ini untuk membuat objek Sambungan dengan menggunakan DriverManager dan kaedah getConnection :

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

Seterusnya, kita perlu membuat contoh DSLContext . Objek ini akan menjadi titik masuk kami untuk antara muka jOOQ:

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

Dalam kes kami, kami menggunakan dialek POSTGRES , tetapi terdapat beberapa yang lain seperti H2, MySQL, SQLite, dan banyak lagi.

5. Penjanaan Kod

Untuk menghasilkan kelas Java untuk jadual pangkalan data kami, kami memerlukan fail 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 tersuai memerlukan perubahan dalam bahagian di mana kita meletakkan kelayakan pangkalan data dan di bahagian di mana kita mengkonfigurasi nama pakej dan direktori lokasi untuk kelas yang akan kita hasilkan.

Untuk melaksanakan alat penjanaan kod jOOQ, kita perlu menjalankan kod berikut:

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

Setelah penjanaannya selesai, kami akan mendapat dua kelas berikut, masing-masing sesuai dengan jadual pangkalan data:

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

6. Operasi CRUD

Sekarang, mari kita lihat beberapa operasi CRUD asas yang dapat kita laksanakan dengan perpustakaan jOOQ.

6.1. Membuat

Pertama, mari buat catatan Artikel baru . Untuk melakukannya, kita perlu menggunakan kaedah newRecord dengan rujukan jadual yang betul sebagai parameter:

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

The Article.ARTICLE pembolehubah adalah contoh merujuk kepada ARTIKEL jadual pangkalan data. Ia dibuat secara automatik oleh jOOQ semasa pembuatan kod.

Seterusnya, kita dapat menetapkan nilai untuk semua sifat yang diperlukan:

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

Akhirnya, kita perlu menggunakan kaedah penyimpanan dalam rekod untuk menyimpannya dalam pangkalan data:

article.store();

6.2. Membaca

Sekarang, mari kita lihat bagaimana kita dapat membaca nilai dari pangkalan data. Sebagai contoh, mari pilih semua pengarang:

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

Di sini, kita menggunakan pilih kaedah digabungkan dengan dari fasal untuk menunjukkan yang jadual kita hendak baca. Menyeru mengambil kaedah melaksanakan Pertanyaan SQL dan mengembalikan keputusan yang dihasilkan.

The Keputusan alat objek Iterable antara muka, jadi ia mudah untuk melelar atas setiap elemen. Dan sementara mempunyai akses ke satu rekod, kita dapat memperoleh parameternya dengan menggunakan kaedah getValue dengan rujukan 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); });

Kita boleh membataskan pertanyaan terpilih ke sekumpulan bidang tertentu. Mari ambil id dan tajuk artikel sahaja:

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

Kita juga boleh memilih satu objek dengan kaedah fetchOne . Parameter untuk ini adalah rujukan jadual dan syarat yang sesuai dengan rekod yang betul.

Dalam kes kami, mari pilih Pengarang dengan id sama dengan 1:

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

Sekiranya tiada rekod yang sepadan dengan keadaan, kaedah fetchOne akan kembali kosong .

6.3. Mengemas kini

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 padam kaedah akan kembali 1 jika operasi itu berjaya atau 0 jika penghapusan tidak perlu. Contohnya, apabila tiada yang sesuai dengan keadaan.

7. Kesimpulannya

Dalam artikel ini, kami telah belajar bagaimana mengkonfigurasi dan membuat aplikasi CRUD sederhana menggunakan kerangka kerja jOOQ. Seperti biasa, semua kod sumber tersedia di GitHub.