2014-04-02 106 views
2

我的問題是類似於從上述線程採取運行SQL查詢生成器

Is there any good dynamic SQL builder library in Java?

但是一個很重要的一點:

Querydsl和jOOQ似乎是最流行和最成熟的選擇,但是有有一點需要注意:兩者都依賴代碼生成的概念,其中爲數據庫表和字段生成元類。這有利於一個漂亮,乾淨的DSL,但它在嘗試創建僅在運行時已知的數據庫查詢時會遇到問題

有沒有什麼辦法可以在運行時創建查詢,除了使用普通的JDBC +字符串連接?

我在找的是一個可用於構建表單以查詢現有數據庫的Web應用程序。現在如果類似的東西已經存在,那麼這種產品的鏈接也會受到歡迎。

+0

問題是,你真的想要嗎?能夠自動生成並運行查詢可能會以負面方式影響性能。 – Ashalynd

+0

@Ashalynd:動態SQL總是會帶來輕微的性能影響。我不認爲你可以完全避免... –

回答

2

儘管數據庫元數據的源代碼生成對於使用jOOQ肯定會增加很多價值,但它不是先決條件。許多jOOQ用戶使用jOOQ來實現與您設想的相同的用例。這也反映在jOOQ tutorials中,該列表使用沒有代碼生成的jOOQ作爲完全有效的用例。例如:

String sql = create.select(
         fieldByName("BOOK","TITLE"), 
         fieldByName("AUTHOR","FIRST_NAME"), 
         fieldByName("AUTHOR","LAST_NAME")) 
        .from(tableByName("BOOK")) 
        .join(tableByName("AUTHOR")) 
        .on(fieldByName("BOOK", "AUTHOR_ID").eq(
         fieldByName("AUTHOR", "ID"))) 
        .where(fieldByName("BOOK", "PUBLISHED_IN").eq(1948)) 
        .getSQL(); 

以類似的方式,綁定值可以由任何查詢使用Query.getBindValues()萃取。

這種方法仍然會打敗普通的JDBC +字符串連接動態SQL語句,因爲你不必擔心:

  • 語法的正確性
  • 跨數據庫的兼容性
  • SQL注入
  • 綁定變量索引
0

SQLBuilder http://openhms.sourceforge.net/sqlbuilder/非常有用爲了我。 一些簡單的例子:

String query1 = new InsertQuery("table1") 
      .addCustomColumn("s01", "12") 
      .addCustomColumn("stolbez", 19) 
      .addCustomColumn("FIRSTNAME", "Alexander") 
      .addCustomColumn("LASTNAME", "Ivanov") 
      .toString(); 

    String query2 = new UpdateQuery("table2") 
      .addCustomSetClause("id", 1) 
      .addCustomSetClause("FIRSTNAME", "Alexander") 
      .addCustomSetClause("LASTNAME", "Ivanov") 
      .toString(); 

結果:

INSERT INTO table1 (s01,stolbez,FIRSTNAME,LASTNAME) VALUES ('12',19,'Alexander','Ivanov') 
UPDATE table2 SET id = 1,FIRSTNAME = 'Alexander',LASTNAME = 'Ivanov'