从 Java ResultSet 返回值时出现问题
Problem when returning values from Java ResultSet
出于某种原因,我只有 returning 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;
}
先return 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;
}
第二个Return 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;
}
我不确定你在哪里声明了提取方法中的 person。
但是在方法中本地声明一个应该可以解决问题。
所以我认为发生的事情是你宣布了一个全球性的人。你正在设置字段。所以有一个人对象,你只是改变它的细节。当您将它添加到 arraylist 时,您将引用添加到同一个人。所以最后你添加了 3 个对同一个人对象的引用。该人对象已将其字段设置为数据库中的最后一个条目。我希望它有意义。
我得出这个结论的原因是我让你在 rs.next 循环中执行的 println,当你打印这个人时,它打印了相同的引用。一旦您在下面进行了更改,您将看到引用发生了变化。因为你每次都创建一个新的人并且 return 这个新的人对象然后对它的引用被添加到数组列表中。
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;
}
出于某种原因,我只有 returning 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;
}
先return 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;
}
第二个Return 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;
}
我不确定你在哪里声明了提取方法中的 person。
但是在方法中本地声明一个应该可以解决问题。
所以我认为发生的事情是你宣布了一个全球性的人。你正在设置字段。所以有一个人对象,你只是改变它的细节。当您将它添加到 arraylist 时,您将引用添加到同一个人。所以最后你添加了 3 个对同一个人对象的引用。该人对象已将其字段设置为数据库中的最后一个条目。我希望它有意义。
我得出这个结论的原因是我让你在 rs.next 循环中执行的 println,当你打印这个人时,它打印了相同的引用。一旦您在下面进行了更改,您将看到引用发生了变化。因为你每次都创建一个新的人并且 return 这个新的人对象然后对它的引用被添加到数组列表中。
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;
}