将ResultSet转换为java中的HashMap列表

时间:2014-12-04 10:01:21

标签: java list hashmap logic

我有一个结果集(由存储过程返回),如 -

enter image description here

我需要一个HashMap列表,而HashMap将由个人(不同于FirstName,LastName和Id的组合)学生记录组成。下图将描述HashMap的结构。

enter image description here

所以,基本上在这个例子中,我需要一个3个HashMap的列表。

请你建议一些有效的方法吗?谢谢!

为什么我需要一个hashmap列表呢?

我需要从这个ResultSet创建一个XML文件。 HashMap列表是我能想到的所需XML结构的最佳方式。

XML结构:

enter image description here

如果我的方法在编码标准或效率方面不正确,请建议我采用不同的方法。

我在想什么:

我还没试过。但除了迭代ResultSet并临时存储FirstName,LastName和Id以检查它是否与之前的值相同之外,我无法想到其他任何事情。如果相同,则将标记数组添加到MarksList,否则将其视为另一个学生的记录。我希望可能有不同的方式。

[更新]:

我想我应该使用对象列表,而不是HashMap列表。但问题仍然是,我如何解释结果集中的值并将值设置到对象中。

3 个答案:

答案 0 :(得分:1)

更新

提供代码,将ResultSet中的数据正确提取到JAXB使用的对象中。


您不需要HashMap和/或List HashMap来创建xml文件 如果您创建了正确的数据对象,则可以使用JAXB轻松完成此操作。

首先,创建classes以匹配xml中所需的结构。

  1. 一个ScoreRecord课程,其中包含课程名称和标记等课程信息。
  2. 一个Student类,其中包含学生信息,如名字,姓氏和ScoreRecords个对象列表。
  3. 一个StudentGroup课程,其中包含属于同一教师团体的所有学生
  4. ScoreRecord类:

    import java.math.BigDecimal;
    
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    @XmlRootElement(name = "Mark")
    @XmlType(propOrder = { "sub", "percent" })
    public class ScoreRecord {
        private String sub;
        private String percent;
    
        public void setSub(String sub) {
            this.sub = sub;
        }
    
        public String getSub() {
            return sub;
        }
    
        public void setPercent(String percent) {
            this.percent = percent;
        }
    
        public String getPercent() {
            return percent;
        }
    }
    

    Student类:

    import java.util.List;
    
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElementWrapper;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    @XmlRootElement(name = "Student")
    @XmlType(propOrder = { "firstName", "lastName", "id", "scoreRecords" })
    public class Student {
        private Integer id;
        private String firstName;
        private String lastName;
        private List<ScoreRecord> scoreRecords;
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        @XmlElement(name = "Id")
        public Integer getId() {
            return id;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        @XmlElement(name = "FirstName")
        public String getFirstName() {
            return firstName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        @XmlElement(name = "LastName")
        public String getLastName() {
            return lastName;
        }
    
        public void setScoreRecords(List<ScoreRecord> scoreRecords) {
            this.scoreRecords = scoreRecords;
        }
    
        @XmlElementWrapper(name = "MarksList")
        @XmlElement(name = "Mark")
        public List<ScoreRecord> getScoreRecords() {
            return scoreRecords;
        }
    }
    

    StudentGroup类:

    import java.util.List;
    
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElementWrapper;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "Records")
    public class StudentGroup {
        private List<Student> students;
    
        public void setStudents(List<Student> students) {
            this.students = students;
        }
    
        @XmlElement(name = "StudentRecord")
        public List<Student> getStudents() {
            return students;
        }
    }
    

    现在,创建一个类来保存数据&#34;按原样#34;来自数据库

    public class DbStudent {
        private String firstName;
        private String lastName;
        private Integer id;
        private String sub;
        private String percent;
    
    public DbStudent(String firstName, String lastName, int id, String sub, String percent) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.id = id;
        this.sub = sub;
        this.percent = percent;
    }
    
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    
    public String getFirstName() {
        return firstName;
    }
    
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    
    public String getLastName() {
        return lastName;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    public Integer getId() {
        return id;
    }
    
    public void setSub(String sub) {
        this.sub = sub;
    }
    
    public String getSub() {
        return sub;
    }
    
    public void setPercent(String percent) {
        this.percent = percent;
    }
    
    public String getPercent() {
        return percent;
    }
    

    }

    创建一种方法,将数据作为此对象类型的List进行检索。我假设您已经拥有获取ResultSet的内容,将其迭代并.addDbStudent个对象列表。

    类似的东西:

    public List<DbStudent> getStudents() throws ClassNotFoundException, SQLException {
        List<DbStudent> entries = new ArrayList<DbStudent>();
    
        Class.forName(databaseDriver);
        this.connection = DriverManager.getConnection(connectionString);
    
        Statement sttm = this.connection.createStatement();
        ResultSet rs = sttm.executeQuery("select * from TMP_STUDENT"); //in your case procedure call
    
        if (rs != null) {
            while (rs.next()) { //add the results into the list
                entries.add(new DbStudent(rs.getString("FIRSTNAME"), rs.getString("LASTNAME"), rs.getInt("ID"),
                                          rs.getString("SUB"), rs.getString("PERCENT")));
    
            }
            rs.close();
        }
    
        return entries;
    }
    

    现在,主要方法。它包含从数据库对象列表中提取所有信息的逻辑。基本上我们按id排序,迭代检查我们是否找到了新学生。如果我们找到一个新学生,我们会将前一个学生添加到Student个对象列表中。这名学生已经有了他的分数。

    public static void main(String[] args) throws JAXBException {
    
        //get the data from the database as is
        OracleConnection myOracleConnection = new OracleConnection(ORACLE_DRIVER, ORACLE_CONN);
        List<DbStudent> dbStudentList = null;
        try {
            dbStudentList = myOracleConnection.getStudents(); //get the list of students from the procedure or query
            myOracleConnection.CloseConnection();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("Stopping execution and exiting...");
            System.exit(-1);
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Stopping execution and exiting...");
            System.exit(-1);
        }
    
        //sort the list on Id, so we can know when we find a new student
        Collections.sort(dbStudentList, new Comparator<DbStudent>() {
                public int compare(DbStudent s1, DbStudent s2) {
                    return s1.getId().compareTo(s2.getId());
                }
            });
    
        List<Student> studentList=new ArrayList<Student>(); //list which will hold all the student objects
    
        Integer previousId = 0; //control variable
        List<ScoreRecord> marksList = new ArrayList<ScoreRecord>(); //list to store the marks for each student        
        Student s = null;
    
        for (int i=0;i<dbStudentList.size();i++) {
    
            if(i==dbStudentList.size()-1){ //if we reached the end, no more students after this record, set the marks and add the student to the list
                s.setScoreRecords(marksList);
                studentList.add(s);
            }
    
            if (dbStudentList.get(i).getId().compareTo(previousId) != 0) {
                //new student found
                if(s!=null){
                    //if new student found add the previous one to the list after setting the marks
                    s.setScoreRecords(marksList); 
                    studentList.add(s);
                }
                s = new Student(); //create a new student
                s.setFirstName(dbStudentList.get(i).getFirstName());
                s.setId(dbStudentList.get(i).getId());
                s.setLastName(dbStudentList.get(i).getLastName());
    
                ScoreRecord sr = new ScoreRecord();
                sr.setSub(dbStudentList.get(i).getSub());
                sr.setPercent(dbStudentList.get(i).getPercent());
    
                marksList = new ArrayList<ScoreRecord>(); //reset marks list
                marksList.add(sr);
            } else {
                //same student
                ScoreRecord sr = new ScoreRecord();
                sr.setSub(dbStudentList.get(i).getSub());
                sr.setPercent(dbStudentList.get(i).getPercent());
                marksList.add(sr); //add mark to existing marks list
            }
            previousId=dbStudentList.get(i).getId(); //set the control variable to the new id
        }
    
        StudentGroup sg=new StudentGroup(); //create the student wrapper
        sg.setStudents(studentList); //add the student list to the wrapper
    
        //create xml with JAXB
        JAXBContext context = JAXBContext.newInstance(StudentGroup.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        m.marshal(sg, new File(STUDENT_XML));
    }
    

    xml的输出正是您想要的:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Records>
        <StudentRecord>
            <FirstName>AA1</FirstName>
            <LastName>BB1</LastName>
            <Id>1</Id>
            <MarksList>
                <Mark>
                    <sub>Math</sub>
                    <percent>51%</percent>
                </Mark>
                <Mark>
                    <sub>Phy</sub>
                    <percent>61%</percent>
                </Mark>
                <Mark>
                    <sub>Bio</sub>
                    <percent>61%</percent>
                </Mark>
            </MarksList>
        </StudentRecord>
        <StudentRecord>
            <FirstName>AA2</FirstName>
            <LastName>BB2</LastName>
            <Id>2</Id>
            <MarksList>
                <Mark>
                    <sub>Bio</sub>
                    <percent>62%</percent>
                </Mark>
            </MarksList>
        </StudentRecord>
        <StudentRecord>
            <FirstName>AA3</FirstName>
            <LastName>BB3</LastName>
            <Id>3</Id>
            <MarksList>
                <Mark>
                    <sub>Math</sub>
                    <percent>53%</percent>
                </Mark>
                <Mark>
                    <sub>Phy</sub>
                    <percent>63%</percent>
                </Mark>
                <Mark>
                    <sub>Chem</sub>
                    <percent>63%</percent>
                </Mark>
            </MarksList>
        </StudentRecord>
    </Records>
    

答案 1 :(得分:0)

这里需要的是正确的数据对象。这里应该是学生记录内部应该保留记分列表的记录 它将具有id,FirstName,LastName,scoreRecords(它应该是列出主题名称,标记,%等)。

然后只需使用JAXB

将其转换为XML

答案 2 :(得分:0)

如果按LastName和FirstName对sql-statement / storedprocedure进行排序,则不需要在内存中收集整个数据。 只需迭代结果集并收集数据,直到FirstName和LastName发生更改,然后汇总您的sub和percent数据并将其直接流式传输到文件或dom。等等....
或者更改存储过程或以已经为您聚合数据的方式创建新过程。

相关问题