【问题标题】:How to create and drop tables in MySQL databse using Spring's NamedParameterJdbcTemplate?如何使用 Spring NamedParameterJdbcTemplate 在 MySQL 数据库中创建和删除表?
【发布时间】:2017-03-24 01:06:50
【问题描述】:

我知道如何使用NamedParameterJdbcTemplate 在 MySQL 表中插入、更新和删除数据。但是如何创建和删除表呢?

【问题讨论】:

标签: java mysql spring jdbctemplate


【解决方案1】:

您可以创建一个表或删除一个表,就像执行 DML 语句一样... SQL 语句作为字符串传递给数据库引擎。

我怀疑您要问的是是否可以在 SQL 语句中提供一个 标识符(例如 table_name),通过将其作为绑定的 提供执行准备好的语句中的占位符。例如

 CREATE TABLE ? (mycol INT) 

 CREATE TABLE :my_table_name (mycol INT)  

简短的回答是不可能这样做。

语句中的标识符(例如表名)必须与 SQL 文本中的一样。就像关键字SELECTFROM 必须出现在SQL 文本中,并且不能通过绑定占位符作为值提供。

我们可以在 SELECT 语句中演示该限制,尝试提供表或视图的名称作为绑定占位符。不管是定位的? 还是命名的占位符。

这不起作用:

SELECT t.col c FROM ? t LIMIT 1

这不起作用:

SELECT 2 AS :col_alias FROM :v_table_name LIMIT 1  

如果您了解 SQL 优化器在准备和执行语句时执行的操作,那么关于标识符的限制是有意义的。

此限制适用于 SELECT 语句。以及 DML 语句(INSERT、UPDATE、DELETE)和 DDL 语句(CREATE、ALTER、DROP)。


执行 DDL 语句的另一个潜在问题将导致隐式提交。我们需要注意在事务的上下文中正确处理它。


如果您需要执行动态 DDL 语句,提供带有变量的标识符,有两种基本方法:

1) 动态地将 SQL 文本构造为字符串,因此表名(和其他标识符)是 SQL 文本的一部分,而不是绑定占位符。

2) 创建一个将执行语句的存储过程,并调用该存储过程。存储过程的参数可以作为绑定占位符传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多