我正在连接到一个数据库,我想使用回调进行查询,所以我写了这个:
public void query(String query, Consumer<ResultSet> callback, String database) throws SQLException {
Connection connection;
try { Class.forName(DRIVER_CLASS); }
catch (Exception e) { e.printStackTrace(); }
connection = DriverManager.getConnection(URL + "/" + database, USER, "");
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
callback.accept(resultSet);
connection.close();
}
public void printUsernames() throws SQLException {
query("SELECT username FROM users;", (ResultSet set) -> {
while (set.next()) {
String username = set.getString("username");
System.out.println(username);
}
}, "cloud");
}
甚至严格的query
和printUsernames
方法两者都声明了一个throws语句,我传递的消费者在printUsernames
中仍然会出现编译错误(有人警告我不会处理它可能出现的sql异常(。
是否有一种方法可以处理query
,这样我就不必为任何其他查询一遍又一遍地编写try-catch了?
原来我可以在接口的方法中添加throws语句,所以我写了这个:
@FunctionalInterface
public interface Querier {
public void query(ResultSet res) throws SQLException;
}
如果我稍微重构一下以前的代码。。。
public void query(String query, Querier callback, String database) throws SQLException {
Connection connection;
try { Class.forName(DRIVER_CLASS); }
catch (Exception e) { e.printStackTrace(); }
connection = DriverManager.getConnection(URL + "/" + database, USER, "");
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
callback.query(resultSet);
connection.close();
}
public void printUsernames() throws SQLException {
query("SELECT username FROM users;", (ResultSet set) -> {
while (set.next()) {
String username = set.getString("username");
System.out.println(username);
}
}, "cloud");
}
现在我没有任何错误。