Как можно, чтобы метод Java возвращал несколько значений?

1

Мне просто интересно, есть ли способ заставить Java-метод возвращать несколько значений.

Я создаю приложение, которое использует библиотеку jdbc для работы с базой данных. Я могу успешно вводить значения в базу данных, но мне нужен способ их возврата, и именно здесь я немного застрял. Я создаю форму, в которую пользователь вводит определенное значение (идентификационный номер), которое затем передается классу Database, который выполняет мою работу с базой данных.

Database newQuery = new Database();     
newQuery.getCust(c_ID);         //uses the GetCust method in my class,
                                //passing it the ID of the customer.

Метод getCust() в моем классе Database создает следующий запрос:

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

Мне нужен способ вернуть результаты, которые хранятся в Customer back. Любые идеи?

Теги:
jdbc

6 ответов

7

Почему бы просто не вернуть Клиента или создать небольшой класс со всеми значениями, которые вы хотите вернуть в нем, и вернуть этот класс?

  • 3
    Потому что язык не должен мешать вашему коду, особенно язык «более высокого уровня».
7

Вы не можете точно вернуть несколько значений из метода в Java, но всегда можете вернуть объект-контейнер, который содержит несколько значений. В вашем случае проще всего было бы вернуть ResultSet, Customer.

Если вы заинтересованы в том, чтобы подвергнуть свой слой данных своему пользовательскому интерфейсу, вы можете скопировать данные из ResultSet в структуру, которая менее специфична для базы данных, либо Список карт, либо, возможно, список объектов Customer, где Custom - это новый класс, который представляет ваш бизнес-объект.

  • 1
    Возврат ResultSet кажется простым решением, но это немного проблематично. Потому что ResultSet должен (то есть должен) быть закрыт после использования, но кто за это отвечает? Вызывающая функция? Ситуация становится еще хуже, когда в игру вступает PreparedStatement, потому что он должен быть закрыт, но это также закрывает ResultSet ...
3

Итак, ваша фактическая проблема заключается в том, что вы не знали, как устанавливать значения/параметры в SQL-запросе? Единственный правильный способ сделать это - PreparedStatement.

String sql = "select * from Customers where Cust_ID = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setLong(custId);
resultSet = preparedStatement.executeQuery();

Он не только упрощает установку объектов Java (String, Long, Integer, Date, InputStream и т.д.) в SQL-запросе, но, самое главное, это спасет вас от SQL Injection риски. Далее он также быстрее, чем a Statement, потому что он предварительно скомпилирован.

Что касается вашей логики кода, вы всегда должны закрывать ресурсы БД в обратном порядке в блоке finally, чтобы избежать утечек ресурсов в случае исключений. Вот базовый пример того, как получить Customer правильный путь 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;
} 

Вы можете найти этот учебник, чтобы получить больше идей и примеров.

0

В дополнение к использованию Hibernate - взгляните на Spring. Он поддерживает объединение пулов и т.д. И позволяет полностью абстрагировать JDBC от вашего кода.

Он либо вернет вам список карт, либо список вашего настраиваемого типа (в зависимости от того, как вы его называете).

0

Каждый клиент может сопровождаться небольшим интерфейсом, который описывает метод, который принимает несколько аргументов. Затем вы передаете объект, который реализует этот интерфейс, чтобы получить результат.

Объект, который его реализует, может, конечно, быть тем же, что и метод, вызывающий getCustomer, поэтому он просто передает ссылку на 'this' и присваивает аргументы полям, которые можно ожидать, когда они были установлены все возвращается.

0

Рассмотрим использование библиотеки объектов/реляционных отображений. Он будет обрабатывать детали упаковки значений нескольких данных, которые необходимо вернуть из JDBC ResultSet, в один объект Java bean.

Какой выбор выбрать - это еще одно обсуждение. Многие умные люди используют Hibernate. Платформа Java включает JPA. Использование одной из полки позволит вам не изобретать свои собственные, что и создаст вашу собственную комбинацию объектов и коллекций.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню