2014-05-12 2 views
0

루프 내에서 쿼리를 실행하려고합니다.
이 코드 tryning 오전 : 내가 체크 박스와 나는이 페이지에 여러 제품을 표시하고있는 JSP 페이지가루프 내에서 준비 문

public List<Products> DisplayProducts(String []a) 
{ 
    ResultSet rs = null; 
     List<Products> Data=null; 
    try 
    { 
    for(int i=0;i<a.length;i++) 
    { 
     String query = "select * from products where Brand=?"; 
     PreparedStatement stmt=DataBaseConnection.DBConn.getConnection().prepareStatement(query); 
     stmt.setString(1, a[i]); 


     rs=stmt.executeQuery(); 
     } 
     if(rs.next()) 
     { 
      rs.beforeFirst(); 
      Data=new ArrayList<Products>(); 
     while(rs.next()) 
     { 
      Products p=new Products(); 
      p.setTitle(rs.getString(2)); 
      p.setCategory(rs.getString(3)); 
      p.setSubCategory(rs.getString(4)); 
      p.setSubCategoryTwo(rs.getString(5)); 
      p.setPrice(rs.getInt(6)); 
      p.setFlavour(rs.getString(7)); 
      p.setImage(rs.getString(8)); 
      p.setBrand(rs.getString(9)); 
      p.setInstock(rs.getString(10)); 
      p.setInstockQty(rs.getInt(11)); 
      Data.add(p); 

     } 
     } 
     return Data; 

} 
    catch(Exception e) 
    { 

     System.out.println(e.getStackTrace()); 
     return null; 
    } 

} 

합니다. 이 제품을 BRANDS으로 분류하고 있습니다. 사용자는 체크 박스를 선택하여 브랜드를 선택합니다.

나는 서블릿과 그 서블릿 호출 기능 디스플레이 제품에 체크 박스의 값을 전달하고있다 :

String arr[]=request.getParameterValues("On");  
List<Products> Data=new SessionBeanClass().DisplayProducts(arr); 

알려주세요 어떻게 이것을 실행하고 결과를 얻을 수 있습니까?

+3

무엇이 문제입니까? 어디에서 오류가 발생 했습니까? 질문을 좀 더 명확히하십시오. –

+0

선택 쿼리가 실행될 때 목록을 반환하지만 목록에 아무 것도 표시되지 않습니다. – TechGuy

답변

1

확인란을 선택하고 모든 제품의 목록을 반환해야한다고 가정합니다. 이 경우에는 여기에 논리 오류가 있다고 가정합니다. 이 메서드는 마지막 Product 레코드 만 반환합니다. 다른 ID를 통해 루핑하는 대신 'IN'절을 사용하여 한 번에 모두 반환 할 수 있습니다. IN 절을 이루기위한 많은 차이점이 있습니다. 아래에 주어진 것은 간단한 대안입니다. 댓글에 따라

public List<Products> DisplayProducts(String[] a) { 
     ResultSet rs; 
     List<Products> data; 
     PreparedStatement stmt; 
     try { 
      StringBuilder param = new StringBuilder(); 
      for(String str : a){ 
       param.append("'").append(str).append("', "); 
      } 
      String query = "select * from products where Brand in (" + param.substring(0, param.length() - 2) + ")"; 
      stmt = DataBaseConnection.DBConn.getConnection().prepareStatement(query); 
      rs = stmt.executeQuery(); 
      if (rs != null) { 
       data = new ArrayList<Products>(); 
       while (rs.next()) { 
        Products p = new Products(); 
        p.setTitle(rs.getString(2)); 
        p.setCategory(rs.getString(3)); 
        p.setSubCategory(rs.getString(4)); 
        p.setSubCategoryTwo(rs.getString(5)); 
        p.setPrice(rs.getInt(6)); 
        p.setFlavour(rs.getString(7)); 
        p.setImage(rs.getString(8)); 
        p.setBrand(rs.getString(9)); 
        p.setInstock(rs.getString(10)); 
        p.setInstockQty(rs.getInt(11)); 
        data.add(p); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      stmt.close(); 
     } 
     return data; 
} 

설명을 시도하는 시도 다음 자바 명명 규칙에 추가 http://www.journaldev.com/2521/jdbc-preparedstatement-in-clause-alternative-approaches 또는 http://www.javaranch.com/journal/200510/Journal200510.jsp#a2

에서 다양한 작업을 확인하고 마지막

사용하여 연결을 정리할 수

확인. 나는 당신의 아이디어가 아디다스, 나이키 등 브랜드 이름 집합을 전달하고 모든 제품 세부 사항을 선택하는 것이라고 생각합니다. 따라서 select * from products where Brand in ('adidas', 'nike')과 같은 것을해야합니다. 이것은 모든 제품을 줄 것입니다. 그래서 이것을 위해 선택한 브랜드 이름을 문자열 배열로 전달합니다. 그래서 내가 한 일은 배열에서 값을 가져 와서 그것을 포맷하고 IN 절의 인수로 만드는 것입니다. 따라서 IN 절에는 쉼표로 구분 된 값이 필요합니다. 그것의 찌르기부터 우리는 또한 작은 따옴표 '를 줄 필요가있다. 그래서 배열 [adidas, nike]에서 나는 'adidas', 'nike'을 구성해야합니다. 이것이 for 루프에서 'and, (comma)'를 덧붙인 것입니다. 따라서 for 루프 후에는 끝에 쉼표와 공백이 추가로 표시됩니다 (예 : 'adidas', 'nike'). 이를 제거하기 위해 부분 문자열을 param.substring(0, param.length() - 2)으로 가져 와서 마지막 두 문자를 제거합니다. 이것은 쿼리에 공급되고 결과를 검색합니다.

+0

연결을 제대로 종료하라는 메시지가 표시되는데 왜 예제에 추가하지 않으시겠습니까? 자원을 사용하면 훨씬 커지지 않을 것입니다. 또한 데이터를 try 내부에 넣으면 범위가 축소되고 OP가 실수를 범할 수 있습니다. – Ordous

+0

@Ordous : 전체 예제가 아닌 간단한 예제를 제공하려고했습니다. 나는 어쨌든 내 대답을 업데이 트했습니다. 고마워 .. :) –

+0

생각해 보니, OP는 연결이나 문장/rs를 실제로 닫지 않으므로 풀링 메커니즘이 엉망이 될 가능성이 높습니다. 그러나 당신이 맞습니다. 그것은 논리적 인 문제와 관련이 없습니다. – Ordous