-1

如果我没记错的话,一旦连接关闭,preparedStatement 就会从缓存中销毁。目前我的应用程序已设置,因此我有一个函数可以根据传入的单个 POJO 对象从数据库中获取 POJO 对象。然后我有另一个函数来获取该表中所有对象的 ID,以用于需要列表的情况,然后在该函数的 while 循环中,我一次获取整个对象。

但是这样做并没有利用缓存的查询,对吗?那么,如果它是一个项目列表或单个项目,那么拥有一个可以利用缓存的preparedstatements 的通用getter SQL 函数的最佳方法是什么?在 PHP 中,我可以通过检查传入的参数是否为数组来轻松完成此操作,但 Java 要求您定义参数对象。

例如,假设用户,这是我目前拥有的:

//Get user object
public User getUser(User user) throws SQLException {
    Connection connection = connectionWrapper.getConnection();
    String query = "SELECT firstName, lastName FROM users WHERE userId = ?";
    PreparedStatement statement = connection.prepareStatement(query);
    statement.setInt(1, user.getUserId());
    ResultSet rs = statement.executeQuery();
    if (rs.next()) {
        //Get database details and set into object
    }
    rs.close();
    statement.close();
    connection.close();
}

//Get all users
public List<User> getAllUsers() throws SQLException {
    List<User> userArr = new ArrayList<User>();

    Connection connection = connectionWrapper.getConnection();
    String query = "SELECT userId FROM users";
    PreparedStatement statement = connection.prepareStatement(query);
    ResultSet rs = statement.executeQuery();
    while (rs.next()) {
        int id = rs.getInt("userId");
        User user = new User(id);
        getUser(user);
        userArr.add(user);
    }
    rs.close();
    statement.close();
    connection.close();
    return userArr;
}

如果能够让 getUser 函数处理像上面这样的单个对象情况和传入用户对象数组(带有 userId 的集合)并在关闭之前循环遍历数组以获取所有对象的数组情况,那就太好了连接。有没有一种简单的方法可以做到这一点,或者我应该在所有情况下都将一个 User 数组传递给 getUser 函数,即使它只是一个?

4

1 回答 1

1

如果您追求的是性能,那么在给定 5 个 ID 的数组的情况下执行 5 个查询以查找 5 个用户并不是真正的最佳解决方案。您最好执行一个查询,一次加载所有用户,使用

select firstName, lastName FROM users WHERE userId in (?, ?, ?, ?, ?)

同样,您的getAllUsers()方法效率极低。它应该执行单个查询,而不是执行查询以获取所有 ID,然后对找到的每个 ID 进行查询。

于 2013-04-18T17:31:37.903 回答