如何在 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 更多行,那么它会遍历所有行,您可以处理该块中的数据。