Spring JDBC:如何创建表?

Posted

技术标签:

【中文标题】Spring JDBC:如何创建表?【英文标题】:Spring JDBC: How to create the tables? 【发布时间】:2011-01-07 06:29:07 【问题描述】:

我正在使用带有 DAO 模式的 Spring JdbcTemplate 来访问数据库。我不是手动创建数据库表,而是寻找一种在 DAO 层中生成表的方法。 我知道我可以使用JdbcTemplate 来执行语句,我只是在寻找合适的地方来执行它。

有没有最佳实践?

【问题讨论】:

以编程方式创建表是一种味道。在现实世界中(并且具有良好的数据模型),您通常只需要创建一次表并永远使用它们。您确定需要这样做吗?如果没有,请发布一个新问题如何更改数据模型,这样您就不需要为每个问题都创建新表。 +1 表示 BalusC。如果您想要一种可重现的、自动化的创建表的方式,请创建一个 DDL 或其他可以在设置环境时执行的脚本。换句话说,这不应该在代码中处理。 @BalusC,执行 DDL 设置的逻辑位置可能是安装操作,它可能作为代码的一部分分发——为什么要添加当前 DAO 以外的其他内容来处理这通常是必要的步骤? 我同意这对生产很危险,但我发现在代码中创建表可以节省大量时间用于原型设计和快速设置本地开发环境。我喜欢创建一个 Maven 配置文件,以确保我不会意外地针对生产配置运行 table drop/create 代码。例如,有时将代码交给另一个开发人员并告诉他们简单地运行类似这样的代码非常方便:mvn -Pprototype jetty:run 【参考方案1】:

您可以使用execute(String) method:

public void execute(String sql) throws DataAccessException

发出单个 SQL 执行,通常是 DDL 语句。 指定者:在接口JdbcOperations中执行

参数:sql - 要执行的静态 SQL

抛出:DataAccessException - 如果有任何问题

但是正如 beny23 提到的,我会怀疑是否需要在实时应用程序中以编程方式执行此操作。

【讨论】:

2 个词:集成测试【参考方案2】:

有点跑题:

您是否绝对需要在代码中执行 DDL 命令?事实上,我确实认为将 db admin 和 db usage 分开是个好主意。我们这里的 Oracle 数据库安全设置实际上是这样设置的,以便使用不同的数据库用户 (DB_OWNER) 设置表,而不是由 DB_USER 运行运行 SELECT、INSERT、DELETE 的用户。

这可以防止意外删除表或修改架构,还允许设置 DB_USER,以便只授予绝对必要的权限,这增加了一层安全性。

我想这取决于您的服务/应用程序的性质,但请考虑在代码中创建表的好处(以及 DDL 代码中可能存在的错误是否会意外破坏生产数据)。

【讨论】:

是的,同意这一点,我们曾经有只能选择和调用程序的 DB_USER,所以如果发生黑客以某种方式窃取用户名/密码(例如被暴露在网络上的应用程序使用),他们可以只能从数据库中选择它......或者他们可以调用存储过程,该过程将处理之前的检查并插入一些将使数据库保持一致状态的内容,因此损坏会更小 假设您正在进行全新安装,您是分发另一个应用程序来运行您的 DDL,还是捆绑 DDL 并在您的应用程序中包含安装逻辑? 我猜这取决于使用数据库的应用程序类型。在许多生产环境中,绝对有必要拥有一个单独的 DDL 脚本来移交给 DBA 团队,然后他们将在运行脚本之前批准更改,代码开发人员将无权访问生产数据库并拥有应用程序修改数据库将是一个明确的禁忌。话虽如此,AFAIK Hibernate 可以自动为您生成表,但我个人不会使用它,因为索引和约束名称不可读,这使得数据库维护更加复杂。【参考方案3】:

使用(Simple)JdbcOperations 中可用的.update() 方法,它们返回的数字是受影响的行数。它们应该专门用于INSERTUPDATE 语句。

【讨论】:

他问的是如何创建一个表,而不是如何更新一个表 .update() 也适用于这些人。基本上所有其他方法都用于 SELECT,.update() 用于其他所有方法。

以上是关于Spring JDBC:如何创建表?的主要内容,如果未能解决你的问题,请参考以下文章

如何让spring jpa自动创建关系/表?

Spring boot “oracle.jdbc.OracleDatabaseException: ORA-00904: invalid identifier” 创建表时出错

Spring Boot jdbc模板在自定义模式下的postgres中找不到表

如何使用 jdbc 在 teradata 上获取表创建脚本?

如何使用 jdbc java 创建临时表

Spring Batch Framework - 自动创建批处理表