2015-05-28 40 views
0

我遇到了从我的数据库返回单个记录的问题。我每次运行代码时都会返回null。 代码在下面带星号的行上失败。 我的代码是:Java - 用准备好的语句从数据库中提取

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号线

+0

失败的原因?任何异常堆栈? – kosa

+0

为什么问号在“=?” ? – APH

+1

@APH是一个参数化查询APH – Asura

回答

1

你的问题是,你正在使用的executeQuery(String)而不是仅仅executeQuery()不带参数。这实际上使准备好的语句像正常的Statement一样行为,将原始字符串(问号仍在其中)传递给服务器。

准备语句已包含查询字符串。只需运行其executeQuery()而无需参数,它将使用其中的一个,用您给它的值替换问号。