如何在 jdbc 中提出复杂的请求?
How make complex request in jdbc?
我想从数据库中获取随机名称。
@Override
public String createName() {
String result = "empty";
String sqlSelect;
sqlSelect = "select * from names";
String sqlOrderBy = "ORDER BY RAND()";
String sqlLimit = "Limit 1";
try {
statement = connection.createStatement();
resultSet = statement.executeQuery(sqlSelect + " ; " + sqlOrderBy + " + " + sqlLimit);
//resultSet.getString("name");
System.out.println("Random name from database: " + resultSet.getString("name"));
result = resultSet.getString("name");
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
我不知道如何正确创建请求。我是 jdbc
的初学者
您问题中的错误是您传递给executeQuery 的字符串。
它实际上翻译成这个 select * from names ; ORDER BY RAND() + Limit 1
但它应该是这样的select * from names ORDER BY RAND() LIMIT 1;
所以调整这一行
resultSet = statement.executeQuery(sqlSelect + " ; " + sqlOrderBy + " + " + sqlLimit);
至:
resultSet = statement.executeQuery(sqlSelect + " " + sqlOrderBy + " " + sqlLimit+";");
此外,您应该关闭所有资源或切换到 try with resources block
编辑:还有一些地方不对或需要优化
@Override
public String createName() {
String result = "empty";
String sqlSelect;
sqlSelect = "select * from names";
String sqlOrderBy = "ORDER BY RAND()";
String sqlLimit = "Limit 1";
try (
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sqlSelect + " " + sqlOrderBy + " " + sqlLimit+";"))
{
while(restultSet.next(){
result = resultSet.getString("name");
System.out.println("Random name from database: " + result);
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
我转而尝试使用资源,因此您不必担心关闭它们,因为它们实现了 AutoClosable Interface。
此外,您没有提到 ResultSet 和 Statement 作为变量类型,这让我认为您在 class 级别的某处声明了它。那可不是个好主意。
编辑2:
您还应该使用 while(ResultSet.next())
这会将“光标”向前移动,您可以访问第一个元素。如果您的结果集 return 更多行,那么它会遍历所有行,您可以处理该块中的数据。
我想从数据库中获取随机名称。
@Override
public String createName() {
String result = "empty";
String sqlSelect;
sqlSelect = "select * from names";
String sqlOrderBy = "ORDER BY RAND()";
String sqlLimit = "Limit 1";
try {
statement = connection.createStatement();
resultSet = statement.executeQuery(sqlSelect + " ; " + sqlOrderBy + " + " + sqlLimit);
//resultSet.getString("name");
System.out.println("Random name from database: " + resultSet.getString("name"));
result = resultSet.getString("name");
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
我不知道如何正确创建请求。我是 jdbc
的初学者您问题中的错误是您传递给executeQuery 的字符串。
它实际上翻译成这个 select * from names ; ORDER BY RAND() + Limit 1
但它应该是这样的select * from names ORDER BY RAND() LIMIT 1;
所以调整这一行
resultSet = statement.executeQuery(sqlSelect + " ; " + sqlOrderBy + " + " + sqlLimit);
至:
resultSet = statement.executeQuery(sqlSelect + " " + sqlOrderBy + " " + sqlLimit+";");
此外,您应该关闭所有资源或切换到 try with resources block
编辑:还有一些地方不对或需要优化
@Override
public String createName() {
String result = "empty";
String sqlSelect;
sqlSelect = "select * from names";
String sqlOrderBy = "ORDER BY RAND()";
String sqlLimit = "Limit 1";
try (
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sqlSelect + " " + sqlOrderBy + " " + sqlLimit+";"))
{
while(restultSet.next(){
result = resultSet.getString("name");
System.out.println("Random name from database: " + result);
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
我转而尝试使用资源,因此您不必担心关闭它们,因为它们实现了 AutoClosable Interface。 此外,您没有提到 ResultSet 和 Statement 作为变量类型,这让我认为您在 class 级别的某处声明了它。那可不是个好主意。
编辑2:
您还应该使用 while(ResultSet.next())
这会将“光标”向前移动,您可以访问第一个元素。如果您的结果集 return 更多行,那么它会遍历所有行,您可以处理该块中的数据。