代码之家  ›  专栏  ›  技术社区  ›  Ales

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

  •  0
  • Ales  · 技术社区  · 6 年前

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

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

    我们不清楚如何使用 org.springframework.jdbc.对象 包来实现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查询)时,我总是可以创建新的语句,但在这种情况下,此语句将不可重用。

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

    0 回复  |  直到 6 年前
        1
  •  1
  •   Andreas dfa    6 年前

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

    所有班级 org.springframework.jdbc.object 包是使用 PreparedStatement ,DDL语句不会从准备中获益。

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

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

    不要把注意力放在工具上。当你说 “我想使用以下实体 org.springframework.jdbc.对象 包裹” ,你太关注工具了。那么,你应该专注于需要完成的工作 挑选 适合这项工作的工具。对于DDL语句, JdbcTemplate.execute(sql) 是正确的工具。

    使用 batchUpdate(String... sql) 并忽略返回值,如果你有 许多 DDL语句的执行和性能至关重要。然而,对于DDL语句来说,情况不太可能如此。

    推荐文章