java - 检索数据重复错误

标签 java mysql database swing arraylist

我正在尝试做什么:

  1. 进行两轮验证以从 MySQL 检索数据,首先是检查一天中的时间,第二次检查是否采用了该计时,如果未采用计时,我从该行中获取数据并添加它到一个数组列表中。

问题:

  1. 我的逻辑是,我运行循环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 中得到单个项目。

相反,您可能需要考虑使用 FactoryBuilder模式,以确保在每次迭代 ResultSet 时,您都创建一个新的 data 实例,其中填充了数据库中的属性

关于java - 检索数据重复错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34838420/

相关文章:

php - 将 MySQL 数据库从共享主机传输到云提供商

database - 与 Web 应用程序一起使用的最佳关系数据库管理系统 (DBMS) 是什么?

mysql - 如何在 CentOS 7 上引导 MariaDB 集群?

php - 在单个 MySQL 查询中查找另一个表中一列的值

java - 如何处理来自数据库的巨大结果集

mysql - phpMyAdmin 期间输入的密码有何用途

java - JDBC ResultSet 关闭语句

java - 文本 'fadeIn'动画

java - 从 HttpServlet 中的请求参数解析 JSON

java - 与简化 if 和 else 逻辑相关