Почему «ResultSet.next()» возвращает false?

Использование Windows 11, OracleDB, IntelliJ, Lombok, Java

Я хотел бы знать, почему rs.next() возвращает false в следующем коде, а оператор while() не запускается.

//MemberDAO.java
import java.sql.*;
import java.util.*;

public class MemberDAO {
    private Connection connection;
    private String dbusername = "myuser";
    private String dbpassword = "1234";

    public List<MemberDTO> listMembers() {
        List<MemberDTO> members = new ArrayList<MemberDTO>();

        try {
            connectDB();

            String sql = "SELECT * FROM member ";
            System.out.println("query: " + sql);

            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            ResultSet rs = preparedStatement.executeQuery();

            while(rs.next()) {    //In here re.next() return false
                System.out.println("rs running");
                String id = rs.getString("id");
                String password = rs.getString("password");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date joinDate = rs.getDate("joinDate");

                MemberDTO memberDTO = new MemberDTO();
                memberDTO.setId(id);
                memberDTO.setPassword(password);
                memberDTO.setName(name);
                memberDTO.setEmail(email);
                memberDTO.setJoinDate(joinDate);
                members.add(memberDTO);
            }

            rs.close();
            preparedStatement.close();
            connection.close();
        }
        catch (SQLException e) {
            e.printStackTrace();
        }

        return members;
    }

    private void connectDB() {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            connection = DriverManager.getConnection(
                    "jdbc:oracle:thin:@localhost:1521/xe",
                    dbusername,
                    dbpassword
            );
            System.out.println("Connected to database");
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
//MemberDTO.java
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.sql.Date;

@NoArgsConstructor
@Getter
@Setter
public class MemberDTO {
    private String id;
    private String name;
    private String password;
    private String email;
    private Date joinDate;
}

В базе данных Oracle существуют две записи.введите здесь описание изображения

Но rs.next() возвращается false и while() не запускается. введите сюда описание изображения

Я хочу знать, почему rs.next() возвращает false и как мне заставить while() работать.

Вы зафиксировали данные в SQL*Plus?

Alex Poole 29.04.2024 12:12

Кстати, в Java для даты используйте LocalDate: ​​LocalDate joinDate = rs.getObject("joinDate", LocalDate.class);. Класс java.sql.Date был настоящим хаком над классом java.util.Date, у которого уже были проблемы с дизайном. Подробнее смотрите здесь: Вставка и извлечение объектов java.time.LocalDate в/из базы данных SQL, такой как H2.

Anonymous 29.04.2024 14:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Незарегистрированные данные видны только в сеансе, в котором они были созданы (и будут COMMIT в конце сеанса, если они не были ROLLBACKзаписаны). Если вы не видите данные из другого сеанса (например, в Java), убедитесь, что вы ввели команду COMMIT в клиенте SQL, в котором вы COMMIT ввели данные (т. е. SQL*Plus).

Примечание: даже если вы подключитесь от имени того же пользователя, это создаст отдельный сеанс, и вы не сможете увидеть незафиксированные данные в другом сеансе.

Из документации COMMIT:

Пока вы не совершите транзакцию:

  • Вы можете увидеть любые изменения, внесенные вами во время транзакции, запросив измененные таблицы, но другие пользователи не смогут увидеть эти изменения. После фиксации транзакции изменения видны операторам других пользователей, которые выполняются после фиксации.
  • Вы можете откатить (отменить) любые изменения, внесенные во время транзакции, с помощью оператора INSERT (см. ROLLBACK).

Также: сделайте так, чтобы ConnectDB возвращал Connection и используйте это в try-with-resources вместе со всеми другими java.sql объектами jdbc.

g00se 29.04.2024 13:26

Это была ошибка, вызванная моим недостаточным знанием Oracle. Это был глупый вопрос. Правильно, что не сделала COMMIT. Спасибо за ваш ответ.

Bam 30.04.2024 09:08

Другие вопросы по теме