java jooq_将Java EE与jOOQ结合使用的初学者指南
java jooq
Java EE附帶了自己的持久性API:JPA。 當您想要將RDBMS實體(表/關系)映射到Java實體(類)時,JPA最強大,主要遵循1:1映射策略。 其背后的思想是,業務邏輯通常不像關系代數或SQL那樣真正面向集合,而是面向記錄的,這意味著將業務規則和業務邏輯應用于單個記錄。
換句話說,當SQL和關系代數與值(元組)有關時,JPA與(單個記錄的)身份和狀態有關。 這就是JPA的亮點,因為:
壽命太短,無法使用SQL編寫CRUD
但是正如加文·金(Gavin King)經常說的:
RDBMS不僅僅與CRUD有關
加文·金(Gavin King)在開始研究最流行的JPA實現Hibernate時就已經意識到了OLAP的炒作。 商業智能或當今稱為數據科學的技術比簡單的CRUD依賴更高級的功能-簡單的JPA規范或其實現從未將其作為目標。
實際上,您不必一定要執行OLAP才能從本機SQL中受益,在更普通的OLTP環境中也會出現更簡單的用例,例如
- 報告中
- 批量和批量數據處理
- 查詢復雜的業務規則
盡管JPA提供了JPQL和Criteria API,它將幫助您表達查詢中的一些復雜性,但是您最終將受到這些語言和API提供的功能的限制,正如Michael Simons最近在有趣的Criteria API與jOOQ比較中所記錄的那樣 。
因此,所有JPA實現都提供了一種使用“本地SQL”查詢數據庫的方法。 在先前的博客文章中,我們展示了如何利用jOOQ的類型安全DSL API通過JPA的本機查詢API運行SQL查詢 ,然后獲取結果……
- ……作為管理實體
- …作為使用SqlResultSetMapping映射的DTO
在上述情況下,jOOQ僅用作SQL查詢構建器 ,而查詢執行則留給JPA。
在Java EE中使用jOOQ進行所有數據庫查詢
記住jOOQ的理念 :
jOOQ本質上是類型安全的JDBC。 而已。
即使可以使用JPA執行本機SQL,也不必這樣做。 您可以直接在JDBC級別上進行操作,這是JPA經常需要執行的操作,例如在工作時…
- ……具有特定于供應商的數據類型
- ……使用非平凡的存儲過程
- …與語句批處理
- …帶有可更新的游標
在應用程序服務器上運行應用程序時,可以選擇所需的功能,其余部分使用專有的API(例如在JDBC之上運行的jOOQ)。 例如,您可以使用:
- 用于會話和范圍管理的EJB
- CDI用于依賴項注入
- jOOQ與您的數據庫交互
(您也可以將JTA添加到堆棧中-為簡單起見,我們暫時將其跳過)
該過程很簡單:只需使用CDI將javax.sql.DataSource注入到會話bean中即可:
@Stateless public class LibraryEJB {@Resource(lookup="java:data-source-configuration")private DataSource ds; }…并開始使用JDBC進行操作:
public List<Author> fetchAuthors() throws SQLException {List<Author> result = new ArrayList<>();// Get a Connection from the injected DataSourcetry(Connection con = ds.getConnection();PreparedStatement stmt = con.prepareStatement("SELECT * FROM AUTHOR ORDER BY ID");ResultSet rs = stmt.executeQuery()) {result.add(new Author(rs.getInt("ID"),rs.getString("FIRST_NAME"),rs.getString("LAST_NAME")));}return result; }…或使用jOOQ:
public Result<AuthorRecord> fetchAuthors() {// Pass the injected DataSource to jOOQreturn DSL.using(ds, H2).selectFrom(AUTHOR).orderBy(AUTHOR.ID).fetch(); }請注意,jOOQ (默認情況下)如何將所有結果急切地獲取到內存中 ,并急切地關閉諸如JDBC Connection , PreparedStatement和ResultSet類的資源,這樣就無需您自己去處理資源管理的麻煩。
再次:
jOOQ本質上是類型安全的JDBC。 而已。
出于各種原因,JDBC一直是Java EE應用程序的重要組成部分,包括對供應商特定功能的訪問。 jOOQ在JDBC的基礎上增加了編譯時類型的安全性。 而已。 與JDBC兼容的任何東西都可以與jOOQ兼容。
特別是,無論您做出何種選擇,jOOQ都不會干擾您的事務或會話模型。 jOOQ所需要的只是一個JDBC Connection或DataSource 。
在JBoss WildFly中運行示例
例如,可以從GitHub檢出以上示例,然后直接在WildFly中運行-或在其他Java EE應用程序服務器中進行少量改動即可: https : //github.com/jOOQ/jOOQ/tree/master/jOOQ-examples / jOOQ-javaee-example
該示例是在與Arun Gupta舉行的網絡研討會中為WildFly創建的。 網絡研討會回答以下問題:
- 什么是jOOQ?
- 有JDBC和JPA時為什么要使用JOOQ?
- 它如何與Java EE應用程序配合? 它使用底層的JPA持久性提供程序還是其他一些連接?
- 通過JPA的利弊? 純冬眠?
- 它的縮放程度如何?
- 在Java EE應用程序中顯示代碼示例
- jOOQ用于基于CRUD或領域豐富的應用程序?
- 最終如何將jOOQ中的所有工作整合到JPA中并進行標準化? 還是更多的JDBC?
完整的網絡研討會可以在YouTube上找到,這里:
翻譯自: https://www.javacodegeeks.com/2015/10/a-beginners-guide-to-using-java-ee-with-jooq.html
java jooq
總結
以上是生活随笔為你收集整理的java jooq_将Java EE与jOOQ结合使用的初学者指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式示例_责任链设计模式示例
- 下一篇: 电脑英特尔显卡托盘工具(英特尔系统托盘)