【问题标题】:inserting file path into database removes \将文件路径插入数据库删除\
【发布时间】:2013-01-30 01:46:24
【问题描述】:

我是 Java 新手。我想将从FileChooser 中选择的文件路径插入到数据库中。但是当我尝试这样做时,路径在查询语句之前是正确的,并且在将其输入数据库后,它会删除文件路径中存在的所有反斜杠。

filepath=f.getCanonicalPath();
// some database statements....
String query="insert into table1 values('" + filepath + "')";

如果我选择的文件路径是:

"C:\users\documents\hello.txt";

将其插入为:

“C:Usersdocumentshello.txt”

【问题讨论】:

  • 您能向我们展示更多您的代码吗?我相信使用 StringEscapeUtils.escapeSql 或适当的准备/绑定/执行 java 代码可以解决您的问题
  • @Najzero:如果你适当地使用参数化 SQL,你应该不需要 escape 任何东西。
  • @JonSkeet 没错。将其更改为 or - 并且绑定/参数化查询是首选方式 - 编辑,这会错过 bobby 表参考。

标签: java filechooser


【解决方案1】:

基本上,您不应该像那样将您的价值直接放入 SQL 中。

您应该使用PreparedStatement 并使用您的值设置参数。无需转义,也没有 SQL 注入攻击的风险。

String query = "insert into table1 values(?)";

PreparedStatement statement = connection.prepareStatement(query);
try {
   statement.setString(1, filePath);
   statement.executeUpdate();
} finally {
   statement.close();
}

任何时候当您发现自己基于用户输入动态构建 SQL 时,您应该退后一步并强烈考虑参数化 SQL。 (如果您的应用程序基本上是 SQL 开发工具,则例外情况......)

【讨论】:

  • Jon Skeet 我使用 mysql 所以,PreparedStatement 显示它在 java.sql 包下
  • @user2057804:java.sql 包是 MySQL 驱动程序将支持的通用 JDBC 接口。使用 MySQL不是不使用 PreparedStatement 的理由。
  • 感谢大家的即时回复。我特别感谢 Najzero 让我了解 StringEscapeUtils,这最终帮助了我,这也很容易。 :)
  • @user2057804:但这是错误的解决方法。老实说,你应该绝对使用PreparedStatement。应该不难做到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2019-07-27
相关资源
最近更新 更多