Java - 使用准备好的语句从数据库中提取
Java - Pulling From Database With Prepared Statement
我在从我的数据库返回单个记录时遇到问题。
每次我 运行 代码都 returns 为空。
代码在下面带星号的行上失败。
我的代码是:
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()
。这实际上使准备好的语句表现得像常规的 Statement
,将原始字符串(其中仍然带有问号)传递给服务器。
准备好的语句已包含查询字符串。只是 运行 它的 executeQuery()
没有参数,它将使用它里面的那个,用你给它的值替换问号。
我在从我的数据库返回单个记录时遇到问题。 每次我 运行 代码都 returns 为空。 代码在下面带星号的行上失败。 我的代码是:
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()
。这实际上使准备好的语句表现得像常规的 Statement
,将原始字符串(其中仍然带有问号)传递给服务器。
准备好的语句已包含查询字符串。只是 运行 它的 executeQuery()
没有参数,它将使用它里面的那个,用你给它的值替换问号。