当前位置: 首页 > 知识库问答 >
问题:

使用Preparated语句的动态列名+sql查询,其中变量包含的

储臻
2023-03-14
attributes.replace(" ' ", "");
//also used SET "+attributes+" 
String sql;
sql = "UPDATE diseaseinfo"
        + " SET ?=?"
        + "WHERE companyname = 'mycom' && diseaseName =?";

PreparedStatement preparedStmt = connects.prepareStatement(sql);
preparedStmt.setString(1, attributes);
preparedStmt.setString(2, attrData);
preparedStmt.setString(3, medname);
System.out.println(preparedStmt);
 UPDATE diseaseinfo SET 'causes'='abc' WHERE companyname = 'mycom'  and diseaseName ='fever'

通过这个问题,我知道我不能通过准备好的语句添加动态列:https://stackoverflow.com/a/3136049/7794329

现在,真正的问题来了:假设我是否要使用一个简单的更新查询,就像这个问题一样:jdbc dymanic sql query with variable containing的

它说您不能在简单的sql查询中用's输入值,因为它会再次导致查询语法错误,例如:

SELECT * FROM diseaseinfo WHERE diseaseName = 'Adult Still's disease' AND name = 'add';

我并不担心SQL注入,因为我正在研究本地。我只想执行我的查询。

共有1个答案

郏正信
2023-03-14

对啊。我们不能提供标识符作为绑定参数。列的名称必须是SQL文本的一部分。

我们可以通过如下方式将列的名称动态合并到SQL文本中:

  sql = "UPDATE diseaseinfo"
      + " SET `" + colname + "` = ?"
      + " WHERE companyname = 'mycom' AND diseaseName = ?";

并为其余两个绑定参数提供值

  preparedStmt.setString(1, attrData);
  preparedStmt.setString(2, medname);
  String colname;
  if (attributes.equals("someexpectedvalue") {
      colname = "columnname_to_be_used";
  } else if (attributes.equals("someothervalid") {
      colname = "valid_columname";
  } else {
     // unexpected/unsupported attributes value so
     // handle condition or throw an exception 
  }

更灵活的方法是确保colname中不出现反勾字符。在本例中,通过将colname的值括在后勾中来转义。因此,只要colname中没有出现反勾字符,我们就会防止提供的值被解释为标识符以外的任何东西。

对于使用硬编码的backtick字符的更通用(也更复杂)的方法,我们可以考虑使用java.sql.DatabaseMetadata类的SupportSquotedIdentifiersGetIdEntifierQuoteString方法。

(在操作代码中,我们没有看到attributes内容的数据类型。我们看到了对名为replace的方法的调用,以及为该方法提供的参数。假设attributes是一个字符串,并且该字符串应该是一个列名,那么我们根本不清楚为什么要在字符串中使用“空格单引号空格”,或者为什么需要删除它。除了这个提到,这个答案没有解决这个问题。)

 类似资料:
  • 我有一个Spring Boot应用程序。在其中,我有一个SQL查询,需要创建一个子查询,内部将该子查询的结果与另一个表连接,然后从该内连接的结果中进行选择。但是很明显,JPA不允许您在OF子句中使用子查询(我假设既不使用JPQL也不使用Criteria API)。有没有办法绕过这个? 我考虑过将子查询的结果存储在一个临时实体中(理想情况下不创建可持久化到DB的表),然后从存储在这些实体中的数据中进

  • 问题内容: 我正在使用R来调用mySQL语句,其中我在语句外定义了变量,例如 但这会返回一个空集,我已经在Google周围搜索并尝试了“。&foo”。“ .foo。” ‘。&& foo。’‘和许多不同的组合,但是它们都不起作用,我认为这应该是mysql问题,而不是我遇到的R特定问题,但不确定。通常,变量具有$值,但R中没有。 问题答案: 这应该工作:

  • 问题内容: 我有几百行代码来创建表,但是架构名称在所有DDL语句中都像SCHEMA_NAME1.TABLE_NAME一样被硬编码。如何将其作为变量并在所有地方使用,以便我们可以轻松地在一个地方更改SCHEMA_NAME要求的多个位置。请提出您的想法。 我想要这样的东西 问题答案: 使用SQL *Plus或SQLcl运行对象创建脚本时,请使用替换()变量代替硬编码的模式名称,并使用前导命令和尾随命令

  • 问题内容: 我正在尝试执行这样的mysql查询 它显示这样的错误 我该如何实现? 问题答案: 在查询中动态表名的使用最好与 Prepared Staments一起使用 ,在mysql中也可以使用串联功能 您也可以针对删除查询执行此操作

  • 问题内容: 我正在尝试执行以下动态查询,但出现错误:无效的列名’cat’ 如果我将其更改为普通查询,则可以: 任何人都可以指出我的错误吗?谢谢。 问题答案: 由于是varchar,因此需要在其周围包含单引号,并且需要在sql字符串内放置该子句的右括号。 新的代码将是: 查看打印了查询字符串的SQL Fiddle演示 。这将生成一个查询字符串,如下所示:

  • 问题内容: 我想知道是否仍然可以使用准备好的语句指定返回的列名称。 我正在使用MySQL和Java。 当我尝试时: 我得到了这种类型的语句(在执行之前立即打印)。 但我希望看到: 我知道,我不能为表名这样做,因为讨论 这里,但不知道是否有一些方法来做到这一点对列名。 如果没有,那么我只需要尝试确保对输入进行清理,以免导致SQL注入漏洞。 问题答案: 这表明数据库设计不正确。用户不需要知道列名。创建