2012-10-19 1 views
0

나는 Id, Name, LastNameAddress 필드 client라는 새로운 콩을 만들었습니다. 모델과 뷰를 만들었습니다. 내 모델은 모든 클라이언트의 목록을 반환합니다. 그리고 이건 잘 작동하고있어.선택 하나의 기록 (자바 빈즈는,의 setAttribute는 getAttribute를, SQL, 서블릿은)

그러나 Id으로 필터링 된 하나의 특정 클라이언트 만 선택할 수있는 모델이 필요합니다. 아무도 내가 SQL에서 필터 (ID) 기준에 따라 단 하나의 클라이언트를 얻을 수 있도록이 모델 내부에서 (SQL 문 외에) 변경할 필요가있는 것을 말해 줄 수 있습니까?

{ 
    Connection connection = getDatabaseConnection(); 
    request.setAttribute("clientList", getClientList(connection)); 
    closeDatabaseConnection(connection); 
} 

private ArrayList<Client> getClientList(Connection con) 
{ 
    String sqlstr = "SELECT * FROM Clients"; 
    PreparedStatement stmt = null; 
    ResultSet rs = null; 
    ArrayList<Client> clients = new ArrayList<Client>(); 

    try 
    { 
     stmt = con.prepareStatement(sqlStr); 
     rs = stmt.executeQuery(); 

     while (rs.next()) 
     { 
      Client client = new Client(); 
      client.setId(rs.getInt("Id")); 
      client.setName(rs.getString("Name")); 
      client.setLastName(rs.getString("LastName")); 
      client.setAddress(rs.getString("Address")); 

      clients.add(client); 
     } 

     rs.close(); 
     stmt.close(); 
    } 
    catch (SQLException sqle) 
    { 
     sqle.printStackTrace(); 
    } 
    finally 
    { 
     return clients; 
    } 
} 

답변

0

글쎄, 이미 모든 클레 펫을 검색하기 위해 호출하는 메서드가있는 클래스가 있다고 생각 하시겠습니까? 첫 번째의 논리 모두를 입수 때문에,

public List<Client> getAllClients(); 
public Client getClientById(int clientId); 

당신은 보조 SQL 문을해야합니다

자, 이제이 시간을 매개 변수로 클라이언트 ID를 수신하는 방법을 다른 방법을 추가 할 수 있지만 기록. 예 :

"select clientId, clientName, ... from clients where clientId=?" 

JDBC PreparedStatement를 사용하면? API가 수신하는 실제 매개 변수

class ClientMapper implements SqlMapper<Client> { 
    @Override 
    public Client map(ResultSet rs) throws SQLException { 
    Client client = new Client(); 
       client.setId(rs.getInt("Id")); 
       client.setName(rs.getString("Name")); 
       client.setLastName(rs.getString("LastName")); 
       client.setAddress(rs.getString("Address")); 
     return client; 
    } 
} 

또한 모든 클라이언트를 검색하는 데이 단일 클라이언트 매퍼를 사용하는 ClientsMapper을 가질 수 있습니다 : 당신이 두 가지 방법을 위해 사용할 수 있도록

은 또한 당신의 매핑 전략을 추상화 고려할 수 있습니다.

class ClientsMapper implements SqlMapper<List<Client>>{ 
    @Override 
    public List<Client> map(ResultSet rs){ 
    List<Client> result = new ArrayList<>(); 
    ClientMapper mapper = new ClientMapper(); 
    while(rs.next()){ 
     result.add(mapper.map(rs)); 
    } 
    return result; 
    } 
} 
+0

첫 번째 질문에 대한 대답은 '예'입니다. 두 번째 방법의 아이디어는 실제로 나쁜 옵션이 아닙니다. 나는 당신을 따라하기 시작하고 있다고 생각합니다 :) 기본적으로, 위의 코드에서 ID로 필터링 된 하나의 클라이언트를 얻으려면 어떤 수정을해야 하는지를 기본적으로 말해 줄 수 있습니까? 이 메소드는 데이터베이스의 모든 클라이언트를 설정합니다. 하나의 클라이언트에 대해서만 값을 설정하는 메소드는 무엇일까? – Salzburger

+0

'rs.next()'를'if' 안에 감싸는 것이 좋습니다. 그렇지 않으면 어떤 레코드도 리턴하지 않았을 때 결과 set'get'에 좋은 SQLException을 던질 수 있습니다. DB에 존재). – BalusC

+0

팁 주셔서 감사합니다! – Salzburger

0

당신은 SQL 문을 외에 무엇을 뜻합니까? 당신은 query.I에 절은 다른 경우 가능하다고 생각하지 않습니다 어디를 추가해야합니다.

+0

그 밖에도 SQL 문을 말하면서 생각합니다. – Salzburger

+0

예, PreparedStatement 또는 Statement를 사용하는 방법은 없습니다. 그러나 일부 ORM 프레임 워크에서는 반드시 가능합니다. 예를 들어, Criteria and Restrictions API를 사용하여 Hibernate에서 가능하다. –

0

여러분은 인수로 제공 한 ID를 기반으로 단일 클라이언트를 반환하는 메소드를 하나 더 가질 수 있습니다.

public Client getClientById(int id){ 
    //fetch the client data using the id 

    //make a local Client object 
    Client c = new Client(); 

    //populate c based on the values you get from your database. 

    //return this local object of Client 
    return c; 

} 
+0

나는 그것을 지금 생각한다. 감사 – Salzburger