列表中的用户定义对象未正确迭代

时间:2016-07-27 09:50:55

标签: java jdbc

在这个示例代码中,我从数据库中获取两条记录,然后将我设置为smsDTO的数据设置为ArrayList。如果我在另一个上次记录打印两次而不是第一次记录的类中迭代此ArrayList

数据库类

 public ArrayList<SmsDTO> getReulst() {
                ResultSet rs = null;
                Connection conn = null;
                PreparedStatement pstmt = null;
                ArrayList<SmsDTO> ar=new ArrayList<SmsDTO>() ;
                SmsDTO sms = new SmsDTO();
                try {

                    conn = getConnection();
                    String query = "select pt.P_MOBILE,st.S_FIRSTNAME,st.REF_ID  from parent_info pt join student_info st on pt.REF_ID = st.REF_ID  where st.S_CLASS_TO_JOIN = 10;";

                    pstmt = conn.prepareStatement(query); // create a statement
                    rs = pstmt.executeQuery();
                    // extract data from the ResultSet
                    while (rs.next()) {

                        long phone = rs.getLong(1);
                        sms.setPhone(phone);
                        String student_name = rs.getString(2);
                        sms.setStudentname(student_name);
                        String ref = rs.getString(3);
                        sms.setRef(ref);
                        ar.add(sms);

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        rs.close();
                        pstmt.close();
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                return ar;
            }
        }

另一个班级

method()
{
    ArrayList<SmsDTO> lhst = null;
    try {
        lhst = db.getReulst();
        for (Iterator iterator = lhst.iterator(); iterator.hasNext();) {
            SmsDTO smsDTO = (SmsDTO) iterator.next();
            System.out.println(smsDTO.getStudentname());
        }
}

2 个答案:

答案 0 :(得分:0)

public ArrayList<SmsDTO> getReulst() {
        ResultSet rs = null;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ArrayList<SmsDTO> ar = new ArrayList<SmsDTO>();
        SmsDTO sms = null;
        try {

            conn = getConnection();
            String query = "select pt.P_MOBILE,st.S_FIRSTNAME,st.REF_ID  from parent_info pt join student_info st on pt.REF_ID = st.REF_ID  where st.S_CLASS_TO_JOIN = 10;";

            pstmt = conn.prepareStatement(query); // create a statement
            rs = pstmt.executeQuery();
            // extract data from the ResultSet
            while (rs.next()) {
                sms = new SmsDTO();
                long phone = rs.getLong(1);
                sms.setPhone(phone);
                String student_name = rs.getString(2);
                sms.setStudentname(student_name);
                String ref = rs.getString(3);
                sms.setRef(ref);
                ar.add(sms);

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pstmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return ar;

    }
}

答案 1 :(得分:0)

你必须在while循环中创建SmsDTO sms = new SmsDTO();

您将相同的对象插入到数组列表中两次。因此,最后更新的值将存在于同一对象中(因为它的引用相同)。

在while循环中创建新对象时,第一个记录将转到第一个对象,第二个记录将转到新创建的第二个对象。 (不是同一个对象)。