0

我创建了一个名为、 和client字段Id的新Namebean 。我当然创建了模型和视图。我的模型返回所有​​客户的列表。这个工作正常。LastNameAddress

但我需要一个模型,我只能选择一个由Id. 谁能告诉我我需要在这个模型中更改什么(除了 SQL 语句),以便我根据 SQL 的过滤器(id)标准只获得一个客户端?

{
    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;
    }
}
4

3 回答 3

0

除了 sql 语句之外你是什么意思?你必须在查询中添加一个 where 子句。我认为不可能有任何其他情况。

于 2012-10-19T11:04:54.703 回答
0

好吧,我猜你已经有一个类,其中包含一个调用来检索所有客户端的方法,对吧?

好吧,现在添加另一个方法,但这次是接收客户端 ID 作为参数的方法:

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

您将需要第二条 SQL 语句,因为第一个中的逻辑用于检索所有记录。就像是:

"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;
   }
}
于 2012-10-19T11:08:09.113 回答
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;

 }
于 2012-10-19T11:11:25.140 回答