【问题标题】:JAVA How to build a sql query with JOOQ step by stepJAVA如何一步步用JOOQ构建sql查询
【发布时间】:2015-10-12 04:57:14
【问题描述】:

在我的 Java 代码中,我想创建一个长查询,我找到 JOOQ 来构建查询,我在没有生成类的情况下使用它,但我找不到像这样逐步构建查询的方法:

DSLContext request = DSL.using(sqlConnection, SQLDialect.MYSQL);
request.insertInto(DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"));

// ... some code ...

request.values("hello", 98);

// ... some code ...

request.values("world", 67);

// ... some code ...

request.execute();

这个怎么做?

【问题讨论】:

    标签: java jooq sqlbuilder


    【解决方案1】:

    你有很多选择。

    坚持使用 DSL API

    ...并将中间类型分配给局部变量:

    DSLContext request = DSL.using(sqlConnection, SQLDialect.MYSQL);
    InsertValuesStep2<?, Object, Object> step = request.insertInto(
        DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"));
    
    // ... some code ...
    
    step = step.values("hello", 98);
    
    // ... some code ...
    
    step = values("world", 67);
    
    // ... some code ...
    
    step.execute();
    

    改用模型 API

    ...这种动态 SQL 使用模型 API 可能更容易实现(另见 http://www.jooq.org/doc/latest/manual/sql-building/sql-statements/dsl-and-non-dsl

    DSLContext request = DSL.using(sqlConnection, SQLDialect.MYSQL);
    InsertQuery<?> insert = request.insertQuery(DSL.table("MyTable"));
    
    // ... some code ...
    
    insert.addValue(DSL.field("MyColumn1", String.class), "hello"))
    insert.addValue(DSL.field("MyColumn1", Integer.class), 98))
    
    // ... some code ...
    
    insert.newRecord();
    insert.addValue(DSL.field("MyColumn1", String.class), "world"))
    insert.addValue(DSL.field("MyColumn1", Integer.class), 67))
    
    // ... some code ...
    
    insert.execute();
    

    使用批处理语句

    另一种方法是使用批处理 API (http://www.jooq.org/doc/latest/manual/sql-execution/batch-execution) 将一组多个单独的语句发送到服务器。例如:

    request.batch(DSL.insertInto(
                        DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"))
                     .values((String) null, null))
           .bind("hello", 98)
           .bind("world", 67)
           .execute();
    

    ...或者,以更动态的形式:

    List<Object[]> values = new ArrayList<>();
    
    // ... some code ...
    values.add(new Object[] { "hello", 98 });
    
    // ... some code ...
    values.add(new Object[] { "world", 67});
    
    request.batch(DSL.insertInto(
                        DSL.table("MyTable"), DSL.field("MyColumn1"), DSL.field("MyColumn2"))
                     .values((String) null, null))
           .bind(values.toArray(new Object[list.size()][]))
           .execute();
    

    【讨论】:

    • 谢谢,前两个选项正是我要找的
    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 2022-01-05
    • 2021-11-05
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多