Java 运行时SQL查询生成器

Java 运行时SQL查询生成器,java,sql,runtime,query-builder,Java,Sql,Runtime,Query Builder,我的问题类似于 然而,从上述线程中可以看出一个重要的观点: Querydsl和jOOQ似乎是最流行和成熟的选择,但是有一件事需要注意:都依赖于代码生成的概念,其中为数据库表和字段生成了元类。这有助于创建一个漂亮、干净的DSL,但在尝试为只有在运行时才知道的数据库创建查询时,它会遇到一个问题 除了使用普通的JDBC+字符串连接,还有什么方法可以在运行时创建查询吗 我要找的是一个web应用程序,它可以用来构建表单来查询现有数据库。现在,如果类似的东西已经存在,那么也欢迎链接到这样的产品。虽然为数据

我的问题类似于

然而,从上述线程中可以看出一个重要的观点:

Querydsl和jOOQ似乎是最流行和成熟的选择,但是有一件事需要注意:都依赖于代码生成的概念,其中为数据库表和字段生成了元类。这有助于创建一个漂亮、干净的DSL,但在尝试为只有在运行时才知道的数据库创建查询时,它会遇到一个问题

除了使用普通的JDBC+字符串连接,还有什么方法可以在运行时创建查询吗


我要找的是一个web应用程序,它可以用来构建表单来查询现有数据库。现在,如果类似的东西已经存在,那么也欢迎链接到这样的产品。

虽然为数据库元数据生成源代码肯定会增加很多使用价值,但这不是一个先决条件。许多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();
以类似的方式,可以使用从任何查询中提取绑定值

对于动态SQL语句,这种方法仍然优于普通的JDBC+字符串连接,因为您不必担心:

  • 语法正确性
  • 跨数据库兼容性
  • SQL注入
  • 绑定变量索引
(免责声明:我为jOOQ的供应商工作)

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'

我有一个定制的解决方案,用于动态生成这样的SQL查询,只需2-3个类即可满足类似的需求。这是一种简单的方法

有关资料可参阅

对于更简单的用例,如基于从UI中选择的输入的动态过滤条件,可以通过以下样式直接修改查询来使用以下更简单的方法:

选择t1.id、t1.col1、t1.col2、,
来自表1 t1
其中(:col1Value为null或t1.col1=:col1Value)
和(:col2Value为null或t1.col2=:col2Value);

这里,col1或col2的值可以为null,但查询可以正常工作。

问题是,您真的想要它吗?能够自动生成和运行查询可能会对性能产生负面影响。@Ashalynd:DynamicSQL总是会对性能产生轻微影响。我不认为你能完全避免。。。