2014-04-02 57 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'