问题描述
我想使用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,请使用JdbcTemplate
和execute(String sql)
方法。如该方法的javadoc所述:
发出单个SQL执行,通常是DDL语句。
不要专注于工具。当您说“我想使用org.springframework.jdbc.object
包中的实体” 时,您将注意力集中在该工具上。您应该专注于需要完成的工作,然后 pick 选择适合该工作的工具。对于DDL语句,JdbcTemplate.execute(sql)
是正确的工具。
如果要执行DDL语句的 lot 且性能至关重要,请使用batchUpdate(String... sql)
并忽略返回值。但是对于DDL语句,情况不太可能。