如何让Java方法返回多个值?

如何让Java方法返回多个值?,java,jdbc,Java,Jdbc,我只是想知道是否有办法让Java方法返回多个值 我正在创建一个使用jdbc库处理数据库的应用程序。我可以成功地将值输入到数据库中,但我需要一种返回它们的方法,这就是我被卡住的地方。我创建了一个表单,用户在其中输入一个特定的值(ID号),然后由执行数据库工作的数据库类传递给它 Database newQuery = new Database(); newQuery.getCust(c_ID); //uses the GetCust method in my class,

我只是想知道是否有办法让Java方法返回多个值

我正在创建一个使用jdbc库处理数据库的应用程序。我可以成功地将值输入到数据库中,但我需要一种返回它们的方法,这就是我被卡住的地方。我创建了一个表单,用户在其中输入一个特定的值(ID号),然后由执行数据库工作的数据库类传递给它

Database newQuery = new Database();     
newQuery.getCust(c_ID);         //uses the GetCust method in my class,
                                //passing it the ID of the customer.
my Database类中的getCust()方法创建以下查询:

ResultSet Customer = stat.executeQuery("SELECT * FROM Persons WHERE Cust_ID=C_ID");

我需要一种方法返回存储在Customer back中的结果。有什么想法吗?

为什么不直接返回Customer,或者创建一个包含所有要返回的值的小类,然后返回该类?

为什么不直接返回Customer,或者创建一个包含所有要返回的值的小类,然后返回该类?

在Java中,无法从一个方法返回多个值,但您始终可以返回包含多个值的容器对象。在您的情况下,最简单的方法是返回结果集Customer


如果您担心向UI公开数据层,可以将数据从ResultSet复制到一个不太特定于数据库的结构中,可以是一个映射列表,也可以是一个客户对象列表,其中Custom是一个表示业务实体的新类。

在Java中,您不能从一个方法返回多个值,但始终可以返回一个包含多个值的容器对象。在您的情况下,最简单的方法是返回结果集Customer


如果您担心向UI公开数据层,可以将数据从ResultSet复制到一个不太特定于数据库的结构中,可以是一个映射列表,也可以是一个客户对象列表,其中Custom是一个表示业务实体的新类。

每个客户都可以附带一个小接口,该接口描述了一个采用多个参数的方法。然后传入实现此接口的对象,以将结果传递给它


实现它的对象当然可以与调用
getCustomer
所属的方法相同,因此,它只是传递一个对“this”的引用,并将参数分配给字段,您可以期望在所有返回时设置这些字段。

每个客户都可以附带一个小接口,该接口描述一个接受多个参数的方法。然后传入实现此接口的对象,以将结果传递给它


实现它的对象当然可以与调用
getCustomer
的方法所属的方法相同,因此它只传递对“this”的引用,并将参数分配给所有返回时预期已设置的字段。

考虑使用对象/关系映射库。它将处理将需要从JDBCResultSet返回的多个数据值打包到单个JavaBean对象中的细节


选择哪一个是另一个讨论。很多聪明人都会使用。Java平台包括。使用现成的将使您免于发明自己的对象和集合,而这正是设计自己的对象和集合组合的最终目的。

考虑使用对象/关系映射库。它将处理将需要从JDBCResultSet返回的多个数据值打包到单个JavaBean对象中的细节


选择哪一个是另一个讨论。很多聪明人都会使用。Java平台包括。使用现成的工具将使您免于发明自己的工具,而这正是设计自己的对象和集合组合的最终目的。

那么您的实际问题是您不知道如何在SQL查询中设置值/参数?唯一正确的方法是使用

它不仅简化了在SQL查询中设置Java对象(
String
Long
Integer
Date
InputStream
等等),而且最重要的是,它将为您节省时间。此外,它也比
语句快,因为它是预编译的

至于您的代码逻辑,您应该始终在
finally
块中以相反的顺序关闭DB资源,以避免出现异常时出现资源泄漏。下面是一个如何通过正确的JDBC方式获得
客户的基本示例:

public Customer find(Long customerId) throws SQLException {
    String sql = "SELECT id, name, age FROM customer WHERE id = ?";
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    Customer customer = null;

    try {
        connection = getConnectionSomehow();
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setLong(custId);
        resultSet = preparedStatement.executeQuery();
        if (resultSet.next()) {
            customer = new Customer();
            customer.setId(resultSet.getLong("id"));
            customer.setName(resultSet.getString("name"));
            customer.setAge(resultSet.getInteger("age"));
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (preparedStatement != null) try { preparedStatement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return customer;
} 

您可能会发现获得更多见解和示例很有用。

所以您的实际问题是您不知道如何在SQL查询中设置值/参数?唯一正确的方法是使用

它不仅简化了在SQL查询中设置Java对象(
String
Long
Integer
Date
InputStream
等等),而且最重要的是,它将为您节省时间。此外,它也比
语句快,因为它是预编译的

至于您的代码逻辑,您应该始终在
finally
块中以相反的顺序关闭DB资源,以避免出现异常时出现资源泄漏。下面是一个如何通过正确的JDBC方式获得
客户的基本示例:

public Customer find(Long customerId) throws SQLException {
    String sql = "SELECT id, name, age FROM customer WHERE id = ?";
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    Customer customer = null;

    try {
        connection = getConnectionSomehow();
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setLong(custId);
        resultSet = preparedStatement.executeQuery();
        if (resultSet.next()) {
            customer = new Customer();
            customer.setId(resultSet.getLong("id"));
            customer.setName(resultSet.getString("name"));
            customer.setAge(resultSet.getInteger("age"));
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (preparedStatement != null) try { preparedStatement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return customer;
} 

您可能会发现获得更多见解和示例很有用。

除了使用Hibernate之外,还可以看看Spring。它支持连接池等,并允许您将JDBC从代码中完全抽象出来


它将返回地图列表或自定义类型列表(取决于您如何调用它)。

除了使用Hibernate,还可以查看Spring。它支持连接池等,并允许您将JDBC从代码中完全抽象出来


它将返回地图列表或自定义类型列表(取决于您如何调用)。

返回结果集似乎是一个简单的解决方案,但有点问题。因为结果