java - 从 Java ResultSet 返回值时出现问题
问题描述
出于某种原因,我只返回 1 个条目,但我有 2 个待处理用户。
public Set getApplicationStatus() {
DbConn connector = new DbConn();
String Pending = "Pending";
Connection connection = connector.getConnection();
try {
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM `person` WHERE `Department` = '"+Pending+"'");
Set persons = new HashSet();
while (rs.next()) {
Person person = extractUserFromResultSet(rs);
persons.add(person);
}
System.out.println(persons.size());
return persons;
} catch (SQLException ex) {
ex.printStackTrace();
}
return null;
如果我直接在数据库上运行查询,我会得到两个帐户,但如果我通过,ResultSet
我似乎只得到最后一个。
public static Person p = new Person();
public static ArrayList<Person> Users = new ArrayList();
public boolean WriteTOfile() throws IOException {
try (Writer writer = new FileWriter("Output.json")) {
Gson gson = new GsonBuilder().create();
Users = p.getApplicationStatus();
for (Person User : Users) {
String json = gson.toJson(User);
writer.write(json);
}
}
return true;
}
当我写入我的 Json 文件时,它会将最后一行添加两次?
public ArrayList<Person> getApplicationStatus() {
DbConn connector = new DbConn();
String Pending = "Pending";
Connection connection = connector.getConnection();
try {
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM `person` WHERE `Department` = '"+Pending+"'");
ArrayList persons = new ArrayList();
while (rs.next()) {
Person person = extractUserFromResultSet(rs);
persons.add(person);
}
//System.out.println("Persons Size: " + persons.size());
return persons;
} catch (SQLException ex) {
ex.printStackTrace();
}
return null;
}
使用此代码解决的第一个问题
public ArrayList<Person> getApplicationStatus() {
DbConn connector = new DbConn();
String Pending = "Pending";
Connection connection = connector.getConnection();
try {
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM `person` WHERE `Department` = '"+Pending+"'");
ArrayList persons = new ArrayList();
while (rs.next()) {
Person person = extractUserFromResultSet(rs);
persons.add(person);
System.out.println(person);
}
//System.out.println("Persons Size: " + persons.size());
return persons;
} catch (SQLException ex) {
ex.printStackTrace();
}
return null;
}
首先返回 printn
public boolean WriteTOfile() throws IOException {
try (Writer writer = new FileWriter("Output.json")) {
Gson gson = new GsonBuilder().create();
Users = p.getApplicationStatus();
for (Person User : Users) {
String json = gson.toJson(User);
System.out.println(json);
writer.write(json);
}
}
return true;
}
第二次返回 printn
private Person extractUserFromResultSet(ResultSet rs) throws SQLException {
person.setId(rs.getInt("ID"));
person.setFName(rs.getString("FName"));
person.setLName(rs.getString("LName"));
person.setDOB(rs.getString("DOB"));
person.setDepartment(rs.getString("Department"));
person.setLocation(rs.getString("Location"));
person.setCellNr(rs.getString("Cellnr"));
person.setUsername(rs.getString("Username"));
person.setPassword(rs.getString("Password"));
return person;
}
解决方案
我不确定你在哪里声明了提取方法中的人。
但是在方法中本地声明一个应该可以解决问题。
所以我认为发生的事情是你宣布了一个全球性的人。你正在设置字段。所以有一个人对象,你只是在改变它的细节。当您将其添加到数组列表时,您将引用添加到同一个人。所以最后你添加了 3 个对同一个 person 对象的引用。该人对象已将其字段设置为 db 中的最后一个条目。我希望这是有道理的。
我得出这个结论的原因是当您打印人员打印相同的参考时,我让您在 rs.next 循环中执行 println。在下面进行更改后,您将看到引用发生了变化。因为您每次都创建一个新人员并返回该新人员对象,然后将对该对象的引用添加到数组列表中。
private Person extractUserFromResultSet(ResultSet rs) throws SQLException {
// add this line below
Person person = new Person();
person.setId(rs.getInt("ID"));
person.setFName(rs.getString("FName"));
person.setLName(rs.getString("LName"));
person.setDOB(rs.getString("DOB"));
person.setDepartment(rs.getString("Department"));
person.setLocation(rs.getString("Location"));
person.setCellNr(rs.getString("Cellnr"));
person.setUsername(rs.getString("Username"));
person.setPassword(rs.getString("Password"));
return person;
}
推荐阅读
- javascript - SetInterval 不会停止运行
- javascript - x =“189371971441827056”。如果我在 javascript 中执行 parseInt(x),我得到 189371971441827070。为什么?
- vega-lite - Vega lite 选择 N 个对象(计数)
- javascript - 如何在 Javascript 中将数组重新缩放为一系列值?
- php - 来自变量的数组值
- c# - TcpClient 仅在服务器在调用 ConnectAsync 之前开始侦听时才连接
- node.js - `UnhandledPromiseRejectionWarning: Unhandled Promise Rejection` 在我的节点应用程序中
- c++11 - lambda 函数回调返回错误:C++ 没有合适的从到的转换函数存在
- c# - C# 扩展在控制台应用程序中工作,但在 MVC Web 应用程序中不工作。我错过了什么吗?
- javascript - 如何监听来自 GLTF 模型的纹理是否已加载并显示?三.js