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

时间:2015-05-28 22:24:45

标签: 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;
}

控制台的输出是:
null

错误信息是:
您的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在#&quot;&#39;附近使用正确的语法。第1行

1 个答案:

答案 0 :(得分:1)

您的问题是您使用的是executeQuery(String)而不是executeQuery()而没有参数。这实际上使预处理语句的行为类似于常规Statement,将原始字符串(仍带有问号)传递给服务器。

预准备语句已包含查询字符串。只需运行没有参数的executeQuery(),它就会使用里面的那个,用你给它的值替换问号。