【问题标题】:How to replace table name in sql query with regex in Java?如何用Java中的正则表达式替换sql查询中的表名?
【发布时间】:2020-05-19 13:03:45
【问题描述】:

我想替换 sql 查询字符串中的表名。我只想更改表名。我怎么能用正则表达式在java中做到这一点?

我不想使用任何依赖项。

例如,

输入:

select ... from table1 where/etc ....

预期输出:

select ... from UPDATED_TABLE_NAME where/etc ....

【问题讨论】:

  • 你能举个例子来说明你正在尝试做什么吗?你只是想在查询中用另一个表名替换一个表名吗?
  • 我更新了问题
  • 对查询的外观是否有任何限制? SQL 查询可能非常复杂,如果没有额外的约束,编写正则表达式将非常困难,它只会执行您希望它执行的操作...考虑类似select foo.x, bar.y, table3.z from (select foo from table1 ) as foo, table2 bar, table3 where foo.z = table3.z and bar.v != "table3"... 你怎么知道你是否应该替换"table3"?你怎么知道你的替代品不会破坏短名?您甚至如何使用正则表达式找到表名在查询中的位置?

标签: java sql regex


【解决方案1】:

如果你显式地改变查询,你就会向 SQL 注入敞开心扉。您可以做的是使用带有参数化查询的 PreparedStatement 来安全地提供表名。

try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM ?")) {
    statement.setString(1, "my_table");

    try (ResultSet results = statement.executeQuery()) {

    }
}

如果您坚持使用正则表达式,您可以使用上面的查询并将? 替换为表名。我不会在生产环境中这样做。

String query = "SELECT * FROM ?";

String queryWithTable = query.replaceAll("?", "my_table");

【讨论】:

  • 我不想使用准备好的语句。我只想更新表名
  • 您为什么不想使用准备好的语句?是否要求您使用正则表达式?
  • 因为我不使用任何连接
  • 在不连接数据库的情况下如何执行查询?尽管如此,更新的答案。
  • tableName 可能等于相同的列名,也可能包含相同的名称。结果,我想使用正则表达式更改表名
猜你喜欢
  • 2017-04-05
  • 2014-01-12
  • 2011-12-06
  • 2020-03-06
  • 2016-01-23
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
相关资源
最近更新 更多