如何使用org.springframework.jdbc.object实现可重用的ddl语句?

How to use org.springframework.jdbc.object to implement reusable ddl statements?

我想使用 org.springframework.jdbc.object 包中的实体对数据库访问进行建模。

很清楚如何为select、更新、插入和删除查询创建对象。我们可以只扩展 MappingSqlQuery<?>SqlUpdate 然后声明所有参数,在一些映射中收集命名参数并执行语句 stmt.executeByNamedParam(Map<String, ?> paramMap);.

不清楚我们如何使用 org.springframework.jdbc.object 包来实现像 schema/table 创建或更改 table 这样的 ddl 语句。 例如,我想动态创建模式,查询如下所示:create schema if not exists schema_name。 我用下一种方式创建语句:

public final class CreateSchemaStmt extends SqlUpdate {

    private static final String CREATE_SCHEMA_SQL_TEMPLATE =
            "create schema if not exists ?";

    public CreateSchemaStmt(DataSource ds) {
        setDataSource(ds);
        setSql(CREATE_SCHEMA_SQL_TEMPLATE);
        declareParameter(new SqlParameter("schema", Types.VARCHAR));
        compile();
    }
}

但不能以这种方式声明参数并将其传递给语句执行。 当然,当我需要创建新的 schema/table 或更改 table 时,我总是可以创建一个新的语句(使用不​​带占位符的 sql 查询),但在这种情况下,该语句将不可重用。

是否可以使用命名参数创建和执行此类查询?

不,不能重复使用 DDL 语句。 table 名称、列名、列数据类型等的任何更改都将是一个 不同的 语句。

org.springframework.jdbc.object package are helpers for using a PreparedStatement 中的所有 类 和 DDL 语句不会从准备中获得任何好处。

对于 DDL,使用 JdbcTemplate and the execute(String sql) 方法。正如该方法的 javadoc 所说:

Issue a single SQL execute, typically a DDL statement.

不要专注于工具。当您说 “我想使用 org.springframework.jdbc.object 包中的实体” 时,您过于关注该工具。您应该专注于需要完成的工作,然后选择适合该工作的工具。对于 DDL 语句,JdbcTemplate.execute(sql) 是正确的工具。

使用 batchUpdate(String... sql) 并忽略 return 值,如果要执行 lot 的 DDL 语句并且性能很关键。但是对于 DDL 语句,情况不太可能如此。