jOOQ là gì? Tự học jOOQ qua code ví dụ
jOOQ là gì?
jOOQ (java Object Oriented Query) là một framework java.
jOOQ là chuẩn truy vấn database theo hướng đối tượng. (nó khá giống với hibernate, cũng thực hiện mapping table trong database với class trong java)
Cũng giống như Hibernate, jOOQ thực hiện generate các class entity từ table trong database.
Tính năng và ưu điểm của jOOQ
- Database First: hỗ trợ tất cả những gì SQL hỗ trợ
- Typesafe SQL: tránh lỗi lúc compile khi sử dụng sql
- Code Generation: tự động tạo các class entity tương ứng với table trong database
- Active Record: jOOQ thực hiện CRUD (create/read/update/delete) và mapping POJO (Plain Old Java Object) trực tiếp trên Active Records.
- Multi-tenancy: jOOQ hỗ trợ cấu hình database schema và table trong quá trình runtime. (Điều này giúp bạn dễ dàng hơn khi sử dụng nhiều schema)
- Standardisation: jOOQ thực hiện chuyển đổi thành các câu sql phổ thông nên nó có thể hoạt động trên tất cả database.
- Procedures: jOOQ hỗ trợ xử lý stored procedures hoặc nhúng procedures vào trong code.
- Query Lifecycle: hỗ trợ các thao tác như logging, transaction, ID generation …
- Open Source: jOOQ có 2 phiên bản là bản thương mại và bản miễn phí. Với bản miễn phí thì chúng ta hoàn toàn yên tâm sử dụng vì nó có cộng đồng lớn và document rất chi tiết.
- Light: jOOQ rất nhẹ, nhẹ hơn rất nhiều so với Hibernate, nên nó rất phù hợp sử dụng cho các service nhỏ trong mô hình microservice.
Ví dụ jOOQ
Ví dụ query
SELECT TITLE FROM BOOK WHERE BOOK.PUBLISHED_IN = 2011 ORDER BY BOOK.TITLE |
create.select(BOOK.TITLE) .from(BOOK) .where(BOOK.PUBLISHED_IN.eq(2011)) .orderBy(BOOK.TITLE) |
jOOQ cũng hỗ trợ các câu lệnh phức tạp như join, limit…
SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*) FROM AUTHOR JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID WHERE BOOK.LANGUAGE = 'DE' AND BOOK.PUBLISHED > DATE '2008-01-01' GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME HAVING COUNT(*) > 5 ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST LIMIT 2 OFFSET 1 |
create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count()) .from(AUTHOR) .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID)) .where(BOOK.LANGUAGE.eq("DE")) .and(BOOK.PUBLISHED.gt(date("2008-01-01"))) .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME) .having(count().gt(5)) .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst()) .limit(2) .offset(1) |
Ví dụ insert
INSERT INTO AUTHOR (ID, FIRST_NAME, LAST_NAME) VALUES (100, 'Hermann', 'Hesse'); |
create.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME) .values(100, "Hermann", "Hesse") .execute(); |
…
Okay, Done!
References: