Использование 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()
работать.
Кстати, в Java для даты используйте LocalDate
: LocalDate joinDate = rs.getObject("joinDate", LocalDate.class);
. Класс java.sql.Date
был настоящим хаком над классом java.util.Date
, у которого уже были проблемы с дизайном. Подробнее смотрите здесь: Вставка и извлечение объектов java.time.LocalDate в/из базы данных SQL, такой как H2.
Незарегистрированные данные видны только в сеансе, в котором они были созданы (и будут COMMIT
в конце сеанса, если они не были ROLLBACK
записаны). Если вы не видите данные из другого сеанса (например, в Java), убедитесь, что вы ввели команду COMMIT
в клиенте SQL, в котором вы COMMIT
ввели данные (т. е. SQL*Plus).
Примечание: даже если вы подключитесь от имени того же пользователя, это создаст отдельный сеанс, и вы не сможете увидеть незафиксированные данные в другом сеансе.
Из документации COMMIT:
Пока вы не совершите транзакцию:
- Вы можете увидеть любые изменения, внесенные вами во время транзакции, запросив измененные таблицы, но другие пользователи не смогут увидеть эти изменения. После фиксации транзакции изменения видны операторам других пользователей, которые выполняются после фиксации.
- Вы можете откатить (отменить) любые изменения, внесенные во время транзакции, с помощью оператора
INSERT
(см.ROLLBACK
).
Также: сделайте так, чтобы ConnectDB возвращал Connection
и используйте это в try-with-resources вместе со всеми другими java.sql
объектами jdbc.
Это была ошибка, вызванная моим недостаточным знанием Oracle. Это был глупый вопрос. Правильно, что не сделала COMMIT
. Спасибо за ваш ответ.
Вы зафиксировали данные в SQL*Plus?