본문 바로가기

Learning/JSP

Join으로 가져온 데이터들을 테이블에 뿌리기

다음과 같이 subject 테이블과 attend 테이블을 조인해서 데이터를 가져온다

(rownum은 페이징 처리를 위해서 사용. dao의 sql문 안에서는 ? 로 대체하고 인자값으로 endRow와 startRow가 들어감)

1
2
3
4
5
6
7
8
9
select * from 
    (select aa.*, rownum rn from 
        (select a.subno, a.subname, a.teachername, s.cnt, count(a.subno) currentCnt, a.status
        from attend a
        join subject s
        on s.subno = a.subno 
        where stuno = 'USER1'
        group by a.subno, a.subname, a.teachername, s.cnt, a.status) aa
            where rownum<=5where rn>=1;
cs
결과값

 

 

보통 jsp에서 <table> <tr> <td> 에 값을 뿌릴때는 List<vo클래스> 로 add해서 뿌렸었는데..

저렇게 조인으로 가져오면 단일 vo클래스가 아니므로 그 방법은 사용할 수 없다.

인터넷 서치하니까 아예 vo를 또 만들던지 map을 사용하라는데.. vo를 만드는건 스프링할때 해봤으니까 map으로 사용.

 

 

  • DAO.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public List<Object> myAttendPre(int startRow, int endRow, String userno){
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        List<Object> list = new ArrayList<>();
        
        try {
            conn = getConnection();
            String sql = "select * from "
                        + "(select aa.*, rownum rn from "
                        + "(select a.subno, a.subname, a.teachername, s.cnt, s.submemo, count(a.subno) currentCnt, a.status "
                        + "from attend a "
                        + "join subject s "
                        + "on s.subno = a.subno "
                        + "where stuno = '"+userno+"' "
                        + "group by a.subno, a.subname, a.teachername, s.cnt, s.submemo, a.status) aa "
                        + "where rownum<=?) where rn>=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, endRow);
            pstmt.setInt(2, startRow);
            rs = pstmt.executeQuery();
            while(rs.next()){
                Map<StringString> hm = new HashMap<>();
                hm.put("status", Integer.toString(rs.getInt("status")));
                hm.put("subno", rs.getString("subno"));
                hm.put("subname", rs.getString("subname"));
                hm.put("teachername", rs.getString("teachername"));
                hm.put("cnt", Integer.toString(rs.getInt("cnt")));
                hm.put("currentCnt", rs.getString("currentCnt"));
                list.add(hm);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeConnection(conn, pstmt, rs);
        }
        return list;
    }
cs

 

맵을 while문 바깥에 선언하게 되면 당연히 key값 (status, subno, subname 등..) 이 같으므로 value값이 덮어쓰기 된다.

list에 담고나면 컨트롤러에서 model에 담고 jsp에서 원래 하던대로 el태그 안에 뿌리면 된다..