Как можно, чтобы метод Java возвращал несколько значений? - PullRequest
1 голос
/ 15 ноября 2009

Мне просто интересно, есть ли способ заставить метод 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, обратно. Есть идеи?

Ответы [ 6 ]

7 голосов
/ 15 ноября 2009

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

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

7 голосов
/ 15 ноября 2009

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

3 голосов
/ 15 ноября 2009

Итак, ваша настоящая проблема в том, что вы не знаете, как установить значения / параметры в запросе 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-инъекция риски . Кроме того, он также быстрее, чем 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 голосов
/ 15 ноября 2009

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

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

0 голосов
/ 15 ноября 2009

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

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

0 голосов
/ 15 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...