Java - 使用准备好的语句从数据库中提取

标签 java sql prepared-statement

我在从数据库返回单个记录时遇到问题。 每次我运行代码时它都会返回 null。 该代码在下面带星号的行上失败。 我的代码是:

 public Map<String,Object> retrieveRecordById(String tableName, 
        String column, int primaryKey) 
        throws ClassNotFoundException, SQLException {

    Map<String,Object> record = null;
    PreparedStatement pStmt = null;
    ResultSetMetaData metaData = null;
    ResultSet rs = null;
    String query = "SELECT * FROM " + tableName + " WHERE " + column + "=?";

        try{
            openDatabaseConnection();
            pStmt = conn.prepareStatement(query);
            pStmt.setObject(1, primaryKey);
   *********** pStmt.executeQuery(query); ***********
            rs = pStmt.executeQuery(query);
            metaData = rs.getMetaData();
            int colCount = metaData.getColumnCount();

            if(rs.next()) {
                record = new HashMap<>();
                for(int i=1; i < colCount; i++) {
                    record.put(metaData.getColumnName(i), rs.getObject(i));
                }
            }

        } catch(IllegalArgumentException | ClassNotFoundException | SQLException e){
            e.getLocalizedMessage();
        }finally{
            pStmt.close();
            closeDatabaseConnection();
        }

    return record;
}

控制台的输出是:

错误消息是:
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在“?”附近使用的正确语法在第 1 行

最佳答案

您的问题是您使用的是 executeQuery(String) 而不是仅使用不带参数的 executeQuery() 。这实际上使准备好的语句的行为类似于常规的语句,将原始字符串(其中仍包含问号)传递到服务器。

准备好的语句已包含查询字符串。只需运行不带参数的 executeQuery() 即可,它将使用其中的参数,并将问号替换为您提供的值。

关于Java - 使用准备好的语句从数据库中提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518073/

相关文章:

java - 使用 CSS3 无法覆盖 JavaFX 8 上 SplitPane 分隔线的颜色和大小

Java:低延迟性能测量

sql - 数据库中大部分同步的两个或多个表

sql - 使用 ADODB.Command.Execute 设置 CursorType

java - SCPSolver 与 Java nullPointerException。一个可运行的例子

Java,项目对象的链接列表。如何引用当前项目?

php - WHERE 子句不工作 mysql

php - 真正准备好时会默默失败,模仿时会有效

php - 在 PHP 中一次从 3 个表中删除行

php - HY093 : Wrong number of parameters - positional