2010-01-20 75 views
4

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

是否有最佳做法?

+4

以编程方式创建表是一种气味。在现实世界中(并且具有良好的数据模型),您通常只需创建一次表并永久使用它们。你确定**你需要这样做吗?如果没有,请发表一个新的问题如何更改数据模型,以便您不需要为每个打嗝创建新表格。 – BalusC 2010-01-20 14:21:09

+0

+1为BalusC。如果你想要一个可重复的自动创建表的方式,创建一个DDL或其他脚本,可以在你的环境被设置时执行。换句话说,这不应该在代码中处理。 – Droo 2010-01-20 15:32:30

+0

@BalusC,执行DDL设置的逻辑地点可能是安装操作,它可能作为代码的一部分进行分发 - 为什么要添加除当前DAO之外的其他内容来处理这个通常必需的步骤? – 2010-01-21 22:15:43

回答

2

稍微offtopic:

是不是绝对必要的,你需要执行从代码中的DDL命令?事实上,我认为将db admin和db用法分开是个好主意。我们的Oracle数据库安全设置实际上是为了使用不同的数据库用户(DB_OWNER)设置的,而不是运行SELECT,INSERT和DELETE的DB_USER运行的。

这可以防止意外删除表或修改架构,还允许设置DB_USER,以便只授予绝对必需的特权,这会增加一层安全性。我想这取决于你的服务/应用程序的性质,但考虑在代码中创建表的好处(以及DDL代码中可能的错误是否会偶然地破坏生产数据)。

+0

谢谢你的好建议! – 2010-01-20 13:43:52

+0

是的,同意这一点,我们曾经有DB_USER,它只能选择和调用PROCEDURE,所以如果黑客以某种方式窃取usernam/pass(由web上暴露的应用程序使用),他们只能从数据库中选择它。 ..或者他们可以调用存储过程,它将处理之前的检查并插入一些将使数据库保持一致状态的东西,因此损害会更小 – 2010-01-20 13:52:03

+0

假设您正在进行全新安装,是否会分发另一个应用程序来运行您的DDL ,还是捆绑DDL并在应用程序中安装逻辑? – 2010-01-21 22:17:29

0

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

+0

他问的是如何创建一个表格,而不是如何更新一个 – 2010-01-20 13:34:11

+0

'.update()'也适用于这些表格。基本上所有其他方法都是用于SELECT的,'.update()'用于其他所有内容。 – Esko 2010-01-20 14:07:45

6

可以使用execute(String) method

public void execute(String sql) throws DataAccessException 

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

参数:sql - 静态SQL执行

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

然而,由于beny23提到我会很可疑的实际需要在实时应用程序中以编程方式执行此操作。

+0

2个字:集成测试 – rsenna 2016-10-24 17:04:01