如果我没弄错,一旦连接关闭,就会从缓存中销毁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函数,即使它只是一个?
答案 0 :(得分:1)
如果您所追求的是性能,那么在给定5个ID数组的情况下执行5个查询以查找5个用户并不是最佳解决方案。您最好使用
执行一次加载所有用户的查询select firstName, lastName FROM users WHERE userId in (?, ?, ?, ?, ?)
同样,您的getAllUsers()
方法效率极低。它应该执行单个查询,而不是执行查询以获取所有ID,然后查找找到的每个ID。