针对一个或多个查询优化PreparedStatements- Java& MySQL的

时间:2013-04-18 16:03:58

标签: java mysql prepared-statement

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

但是这样做不会利用缓存查询吗?那么,如果是一个项目列表或单个项目,那么拥有一个通用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的set)并且循环遍历数组以获取所有关闭连接之前的对象。是否有一种非混乱的方法来执行此操作,或者我是否应该在所有情况下将User数组传递给getUser函数,即使它只是一个?

1 个答案:

答案 0 :(得分:1)

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

执行一次加载所有用户的查询
select firstName, lastName FROM users WHERE userId in (?, ?, ?, ?, ?)

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