我正在尝试做什么:
- 进行两轮验证以从 MySQL 检索数据,首先是检查一天中的时间,第二次检查是否采用了该计时,如果未采用计时,我从该行中获取数据并添加它到一个数组列表中。
问题:
我的逻辑是,我运行循环
while(rs.next())
,我将进行第一轮检查,即检查时间,之后当检查通过后,它会进入另一个 if ,当检查通过时,它将从该行获取数据并将其添加到 arraylist 中。然而,当我运行代码时,我相信检查正在工作,但它一遍又一遍地将相同的数据存储到数组列表中。特别是它存储最后一行的数据,例如,当 id 1,2,3,4,5,6 通过验证时,它只会一遍又一遍地存储 id6。try { PreparedStatement stmt = so.getPreparedStatementWithKey("SELECT * FROM et_elderly WHERE room = ?"); stmt.setString(1, roomNum); stmt.executeQuery(); rs = stmt.getResultSet(); while(rs.next()){ if(dosageTime.equalsIgnoreCase("morning")){ if(rs.getInt("morningtaken")==0){ // calculate the age java.sql.Date reportDate=rs.getDate("dob"); DateFormat df = new SimpleDateFormat("yyyy/MM/dd"); String text = df.format(reportDate); String year=text.substring(0, 4); String month=text.substring(5,7); String day=text.substring(8,10); // setting the information data.setElderBed(rs.getInt("bed")); data.setElderName(rs.getString("name")); data.setElderAge(ElderData.getAge(year,month,day)); data.setElderGender(rs.getString("gender")); DosageList.add(data); numofElder++; } } else if (dosageTime.equalsIgnoreCase("afternoon")){ if(rs.getInt("afternoontaken")==0){ // calculate the age java.sql.Date reportDate=rs.getDate("dob"); DateFormat df = new SimpleDateFormat("yyyy/MM/dd"); String text = df.format(reportDate); String year=text.substring(0, 4); String month=text.substring(5,7); String day=text.substring(8,10); // setting the information data.setElderBed(rs.getInt("bed")); data.setElderName(rs.getString("name")); data.setElderAge(ElderData.getAge(year,month,day)); data.setElderGender(rs.getString("gender")); DosageList.add(data); numofElder++; } } else if (dosageTime.equalsIgnoreCase("noon")){ if(rs.getInt("noontaken")==0){ // calculate the age java.sql.Date reportDate=rs.getDate("dob"); DateFormat df = new SimpleDateFormat("yyyy/MM/dd"); String text = df.format(reportDate); String year=text.substring(0, 4); String month=text.substring(5,7); String day=text.substring(8,10); // setting the information data.setElderBed(rs.getInt("bed")); data.setElderName(rs.getString("name")); data.setElderAge(ElderData.getAge(year,month,day)); data.setElderGender(rs.getString("gender")); DosageList.add(data); numofElder++; } } } } catch (SQLException e1) { e1.printStackTrace(); }
最佳答案
您使用的是 data
的单个实例,该实例只需在 ResultSet
的每次迭代中更新...
while(rs.next()){
if(dosageTime.equalsIgnoreCase("morning")){
if(rs.getInt("morningtaken")==0){
//...
// You never create a new "data" object...
// setting the information
data.setElderBed(rs.getInt("bed"));
data.setElderName(rs.getString("name"));
data.setElderAge(ElderData.getAge(year,month,day));
data.setElderGender(rs.getString("gender"));
DosageList.add(data);
numofElder++;
}
}
所以,基本上,您最终只会得到一个全部是同一对象的对象的List
。您可以使用某种Set
进行测试,最终会在Set
中得到单个项目。
相反,您可能需要考虑使用 Factory或Builder模式,以确保在每次迭代 ResultSet
时,您都创建一个新的 data
实例,其中填充了数据库中的属性
关于java - 检索数据重复错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34838420/