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

问题描述

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

很明显,如何创建用于选择,更新,插入和删除查询的对象。我们可以扩展MappingsqlQuery<?>sqlUpdate,然后声明所有参数,在某些映射中收集命名参数并执行语句stmt.executeByNamedParam(Map<String,?> paramMap);

目前尚不清楚我们如何使用org.springframework.jdbc.object包来实现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();
    }
}

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

可以使用命名参数创建并执行这种查询吗?

解决方法

否,DDL语句不能重复使用。表名,列名,列数据类型等的任何更改都将是不同语句。

org.springframework.jdbc.object包中的所有类都是使用PreparedStatement的助手,而DDL语句不会因准备而受益。

对于DDL,请使用JdbcTemplateexecute(String sql)方法。如该方法的javadoc所述:

发出单个SQL执行,通常是DDL语句

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

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