java - 在 Java 中使用 MySQL 选择作为字符串
问题描述
我在我的 Java 程序中执行查询时遇到问题。这是代码:
String selected=offersList.getSelectedValue();
String sql="SELECT * from outcoming_offers where about='"+selected+"'";
pst=con.prepareStatement(sql);
rs=pst.executeQuery();
当'selected'中有单引号时 - 它给了我一个错误:
您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在附近使用的正确语法.....
所以我理解为什么会出现错误,但我想知道如何使这项工作。除了 concat() 还有其他方法吗?
解决方案
总是更好的方法是使用准备好的语句而不是原始 SQL 字符串连接。
从您的示例中,您应该编写如下所示的准备好的查询(要传递的参数替换为问号):
String sql="SELECT * from outcoming_offers where about=?";
PreparedStatement ps = con.preparedStatement(sql);
然后只需注入参数值并执行查询:
ps.setString(1, selected);
ResultSet rs = ps.executeQuery();
由于这种方法,您不必处理 SQL 查询字符串和单引号,这通常很容易出错,而且(非常重要)您的代码不会受到 SQL 注入攻击。
文档中的更多信息:https ://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html
推荐阅读
- tensorflow - Tensorflow 模型拟合方法引发尺寸异常
- google-api - 如何在 gmail api 中获取电子邮件列表以及电子邮件的标题和发件人?
- django - drf 如何避免 UniqueValidator 中的 objects.all()
- angular - Angular:开发模式下的 ExpressionChangedAfterItHasBeenCheckedError,但生产模式下的绑定更新
- angular - 使用 jFrog REST API 获取 npm 包版本
- c# - 值不属于 Oracle 的预期范围异常
- java - 无法为包含更新方法的 RestController 执行 Junit 测试用例?
- c# - 在 proc 中使用外部 int 时 CSharp 程序崩溃
- apache - 如何将 apache 重写规则更改为 irule
- cmake - 如何使用或不使用 CMake 在 C++ Builder 6 中构建 open62541?