jOOQ配置
本文是我們學院課程的一部分,標題為jOOQ –類型安全的數據庫查詢 。
在SQL和特定關系數據庫很重要的Java應用程序中,jOOQ是一個不錯的選擇。 當JPA / Hibernate抽象過多,JDBC過多時,這是一種替代方法。 它顯示了一種現代的領域特定語言如何可以極大地提高開發人員的生產率,從而將SQL內部化為Java。
在本課程中,我們將看到如何使用jOOQ有效地查詢數據庫。 在這里查看 !
目錄
1.簡介 2. ConnectionProvider 3. SQLDialect 4.設定 5. ExecuteListeners1.簡介
有多種SPI( 服務提供商接口 ),可用于管理jOOQ中各種實體的生命周期。 可以通過Configuration對象注入這些SPI。 在本節中,我們將學習這些生命周期管理對象如何與jOOQ交互。
也可以從org.jooq.academy.section4包中獲得本節中顯示的示例 。
2. ConnectionProvider
最重要的SPI是為jOOQ提供JDBC Connection SPI。 到目前為止,在示例中, Connection已直接傳遞到DSL.using()方法:
DSLContext dsl = DSL.using(connection);對于更詳細的變體(將connection包裝在DefaultConnectionProvider此符號只是一個方便:
DSLContext dsl = DSL.using(new DefaultConfiguration().set(new DefaultConnectionProvider(connection)));在比本教程更復雜的設置中,您可能希望為jOOQ提供一個DataSource ,例如在使用Connection池時,甚至在通過JTA使用分布式事務時。 還通過便利方法以本機方式支持涉及DataSources流行用例(盡管您需要提供SQLDialect ,因為它不能從DataSource派生。
DSLContext dsl = DSL.using(dataSource, SQLDialect.H2);如果您希望實現任何其他類型的JDBC Connection源,則可以實現自己的ConnectionProvider
public interface ConnectionProvider {// jOOQ will acquire a connection through this method prior to query executionConnection acquire() throws DataAccessException;// jOOQ will release previously acquired connections again through this method after query executionvoid release(Connection connection) throws DataAccessException; }3. SQLDialect
jOOQ將在具體的SQLDialect上下文中生成并執行您的SQL語句。 運行以下程序時,可以通過示例來最好地說明這一點:
// This renders SELECT 1 / SELECT 1 FROM DUAL in various SQL dialect families Arrays.stream(SQLDialect.families()).map(family -> String.format("%9s : ", family) + DSL.using(family).render(DSL.selectOne())).forEach(System.out::println);當您執行上述程序時,您可能會得到類似以下內容的信息:
ACCESS : select 1 as [one] from (select count(*) dual from MSysResources) as dualASE : select 1 [one]CUBRID : select 1 "one" from "db_root"DB2 : select 1 "one" from "SYSIBM"."DUAL"DERBY : select 1 as "one" from "SYSIBM"."SYSDUMMY1"FIREBIRD : select 1 "one" from "RDB$DATABASE"H2 : select 1 "one" from dualINFORMIX : select 1 "one" from (select 1 as dual from systables where tabid = 1) as dualINGRES : select 1 "one" from (select 1 as dual) as dualHSQLDB : select 1 as "one" from "INFORMATION_SCHEMA"."SYSTEM_USERS"MARIADB : select 1 as `one` from dualMYSQL : select 1 as `one` from dualORACLE : select 1 "one" from dualPOSTGRES : select 1 as "one"SQLITE : select 1 one SQLSERVER : select 1 [one]SYBASE : select 1 [one] from [SYS].[DUMMY]這些語句都是從相同的jOOQ DSL表達式DSL.selectOne() 。 在大多數情況下,您無需擔心各種SQL方言之間的細微差別,因為jOOQ會在單個API中將它們抽象出來。
您的SQLDialect是否支持任何給定的jOOQ API元素,可以從大多數DSL方法上的@Support注釋中看出。 采用DSL.denseRank()方法,該方法為DENSE_RANK()窗口函數建模。 在jOOQ API中聲明為:
@Support({ CUBRID, DB2, INFORMIX, POSTGRES, ORACLE, SQLSERVER, SYBASE }) public static WindowOverStep<Integer> rank() { ... }4.設定
設置用于向jOOQ提供有關常規查詢呈現和執行行為的信息。 它們受XSD的控制,可從以下位置獲得:XSD: http : //www.jooq.org/xsd/jooq-runtime-3.3.0.xsd (請查看最新手冊或網站以獲取潛在更新)
在其當前版本中,jOOQ設置包含用于管理…的標志。
- 表是否應完全使用架構限定
- 表和模式是否應該轉換/映射(例如,實現多租戶)
- 是否應引用模式,表和列名稱(例如,以支持區分大小寫的名稱)
- 生成的SQL關鍵字是大寫還是小寫
- 是否應格式化生成的SQL(例如用于調試日志記錄)
- 綁定值應呈現為問號,命名參數還是內聯
- 應該執行靜態語句還是預備語句
- 執行記錄是否處于活動狀態
- 樂觀鎖定是否處于活動狀態
- 活動記錄是否應保留對產生它們的Configuration的引用
- 活動記錄是否具有可更新的主鍵
- 是否應該緩存反射信息
5. ExecuteListeners
ExecuteListener是幾個SPI( 服務提供者接口)之一 ,您可以使用它們在更高層次上連接jOOQ的查詢呈現,變量綁定和執行生命周期。 以下示例顯示了一種簡單的方法,可以根據每個查詢衡量查詢執行時間。
示例ExecuteListener
ExecuteListener listener = new DefaultExecuteListener() {@Overridepublic void start(ExecuteContext ctx) {// Register the start time to the current contextctx.data("time", System.nanoTime());}@Overridepublic void end(ExecuteContext ctx) {// Extract the start time from the current contextLong time = (Long) ctx.data("time");System.out.println("Execution time : " + ((System.nanoTime() - time) / 1000 / 1000.0) + "ms. Query : " + ctx.sql());} };然后可以在Configuration使用此偵聽Configuration ,如下所示:
DSL.using(new DefaultConfiguration().set(SQLDialect.H2).set(new DefaultConnectionProvider(connection)).set(new DefaultExecuteListenerProvider(listener))).select(AUTHOR.ID).from(AUTHOR).fetch();現在,對fetch()的調用將啟動整個查詢執行生命周期,包括已實現的start()和end()回調。 這將導致在控制臺上顯示以下內容:
Execution time : 0.101ms. Query : select "PUBLIC"."AUTHOR"."ID" from "PUBLIC"."AUTHOR"針對特定用例還有其他SPI。 有關這些的詳細信息,請參閱jOOQ手冊 。
翻譯自: https://www.javacodegeeks.com/2015/09/the-jooq-configuration.html
總結
- 上一篇: ddos 软件防御(ddos 软件 20
- 下一篇: 安卓开发手册中文版(安卓开发手册)