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注入,因为我正在研究本地。我只想执行我的查询。
对啊。我们不能提供标识符作为绑定参数。列的名称必须是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
类的SupportSquotedIdentifiers
和GetIdEntifierQuoteString
方法。
(在操作代码中,我们没有看到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注入漏洞。 问题答案: 这表明数据库设计不正确。用户不需要知道列名。创建