运行时SQL查询生成器

我的问题类似于

Java中是否有任何良好的动态SQL构建器库?

然而,从上面的线程中取出一个重点:

Querydsl和jOOQ似乎是最受欢迎和最成熟的选择,但有一点需要注意: 两者都依赖于代码生成的概念,即为数据库表和字段生成元类。 这有利于一个漂亮,干净的DSL,但在尝试为仅在运行时知道的数据库创建查询时会遇到问题

除了使用普通的JDBC + String连接之外,有没有办法在运行时创建查询?

我正在寻找的是一个Web应用程序,可用于构建表单来查询现有数据库。 现在,如果这样的东西已经存在,那么这个产品的链接也会受到欢迎。

虽然数据库元数据的源代码生成确实为使用jOOQ增加了很多价值,但它不是先决条件。 许多jOOQ用户使用jOOQ来实现您想象的相同用例。 这也反映在jOOQ教程中 ,它使用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()从任何Query中提取绑定值。

对于动态SQL语句,这种方法仍将胜过简单的JDBC + String连接,因为您不必担心:

  • 语法正确
  • 跨数据库兼容性
  • SQL注入
  • 绑定变量索引

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'