如何使用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语句

不要把注意力集中在工具上。当你说"我想使用来自CCD_ 11包的实体">,你太专注于工具了。您应该专注于需要完成的工作,然后选择适合该工作的工具。对于DDL语句,JdbcTemplate.execute(sql)是合适的工具。

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

最新更新