2012-12-14 5 views
1

내가 가지고있는 문제는 세 개의 테이블 (SQL)에서 데이터를 가져 와서 HTML 테이블에 출력하는 서블릿을 작성한다는 것입니다.자바 서블릿 SQL 테이블

blog_comments :

row id (auto increments), 
blogger id, 
entry_tstamp, 
t_stamp, 
comment, 
author_id, 

blog_entries 다음과 같이

테이블의 구조는

row id(auto increments), 
blogger_id, 
timestamp, 
entry, 

blogger_info :

row id(auto increments), 
blogger_id, 
name, 
email address, 
image, 
password, 

블로그 항목이 있습니다 orignal post와 blog_comments는 해당 게시물과 관련이 있습니다. 나는 첫 번째 행의 두 번째 행에있는 blog_entries의 게시물 (blog_entries의 블로거 세부 정보)과 그 블로그에 대한 관련 코멘트를 표시하는 테이블을 만들려고합니다.

저는 while 문장을 사용하려고합니다 (아래 그림 참조). 처음에는 inital 블로그 게시물과 블로거 ID를 얻으려면 while 문을 사용해야하고 관련 글을 표시하려면 두 번째 문장을 사용해야했습니다.

두 번째 while 루프를 통과 할 때 약간의 어려움을 겪고 있습니다. 첫 번째 while 루프 (한 번 증가한 후)를 취소 한 다음 두 번째 while 루프의 내용을 덤프합니다.

이것을 구현하는 더 좋은 방법이 있는지 아는 사람이 있습니까? 비교 루프를 사용해야합니까? 그리고 코딩이 잘못되었다고 확신합니다. 아무도 내가 잘못 가고 있다고 말할 수 있습니까?

감사합니다.

CODE :

 try { 
      Class.forName("org.sqlite.JDBC"); 
      con = DriverManager.getConnection("jdbc:sqlite:E:/My Documents/NetBeansProjects/co2509blog.sqlite"); 
      stmt = con.createStatement(); 
      //String temp = "SELECT entry, name, email, image, comment from blog_comments C, blog_entries E, blogger_info I where E.blogger_id = I.blogger_id AND I.blogger_id = C.author_id ORDER BY E.timestamp"; 
      //String temp = "SELECT entry, name, email, image from blog_entries E, blogger_info I where E.blogger_id = I.blogger_id ORDER BY E.timestamp"; 
      //String temp = "SELECT entry, name, email, image, comment from blogger_info I JOIN blog_entries E ON I.blogger_id = E.blogger_id JOIN blog_comments C ON I.blogger_id = C.author_id WHERE E.timestamp = C.entry_tstamp ORDER BY E.timestamp"; 
      String query = "SELECT name, image, email, entry FROM blogger_info I, blog_entries E WHERE I.blogger_id = E.blogger_id ORDER BY E.timestamp"; 
      String query2 = "SELECT name, image, email, comment FROM blogger_info I, blog_entries E, blog_comments C WHERE I.blogger_id = C.author_id AND E.timestamp = C.entry_tstamp ORDER BY E.timestamp"; 
      rs = stmt.executeQuery(query); 


      //rs2 = stmt.executeQuery(secondQuery); 
      // displaying records 
      int rowCount = 0; 
      int rowCount2 = 0; 

      out.println("<P ALIGN='center'><TABLE BORDER=5>"); 
      ResultSetMetaData rsmetadata = rs.getMetaData(); 
      int columnCount = rsmetadata.getColumnCount(); 
      // table header 
      out.println("<TR>"); 
      for (int i = 0; i < columnCount; i++) { 
       out.println("<TH>" + rsmetadata.getColumnLabel(i + 1) + "</TH>"); 
      } 
      out.println("</TR>"); 
      { 
       while (rs.next()) { 
        rowCount++; 
        out.println("<TR>"); 
        for (int i = 0; i < columnCount; i++) { 
         out.println("<TD>" + rs.getString(i + 1) + "</TD>"); 
        } 
        rowCount2++; 
        rs2 = stmt.executeQuery(query2); 
        ResultSetMetaData rsmetadata2 = rs2.getMetaData(); 
        int columnCount2 = rsmetadata2.getColumnCount(); 

        rsmetadata2 = rs2.getMetaData(); 
        out.println("</TR>"); 
        while (rs2.next()) { 
         rowCount2++; 
         out.println("<TR>"); 
         for (int j = 0; j < columnCount2; j++) { 
          out.println("<TD>" + rs2.getString(j + 1) + "</TD>"); 
         } 

        } 

       } 
       out.println("</TR>"); 
      } 
      out.println("</TABLE></P>"); 

     } 

답변

1

다음 줄 제 쿼리 문을 재사용 : 부작용으로

rs2 = stmt.executeQuery(query2); 

는 제 결과 세트 (rs)가 폐쇄된다. 단일 하나에 두 개의 쿼리를 병합 할 수 있다면 훨씬 더 효율적인 것,

stmt2 = con.createStatement(); 

.. 

rs2 = stmt2.executeQuery(query2); 

그러나 :

그것을 해결하려면 내부 쿼리에 대한 별도의 문을 작성해야합니다.

+0

감사합니다. Codo. – MacKey