java - javasql异常导致ResultSet关闭后不允许操作
问题描述
我正在使用 jersey 创建简单的 rest api,在这里我将从数据库中获取的所有数据分配给变量,然后将这些变量数据作为列表返回,但出现错误。我看过其他例子,但我不明白这里有什么问题是我所做的:
public class UserDAOImpl implements UserDAO{
public List<User> readUser() {
List<User> list = new ArrayList();
User u = new User();
try {
System.out.println("inside readuser impl");
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/userdb", "root", "");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from user");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String address = rs.getString("address");
u.setId(id);
u.setName(name);
u.setAddress(address);
System.out.println(u);
list.add(u); //adding user object to list
con.close();
}
} catch (Exception e) {
System.out.println(e);
}
return list; //returning to list for json response
}
}
这是我的控制器,它在获取对象后给出 json 响应
@Path("/rest")
public class UserController {
@GET
@Path("/getall")
@Produces(MediaType.APPLICATION_JSON)
public List<User> getAllUser(){
UserDAO udao = new UserDAOImpl();
return udao.readUser();
}
}
解决方案
您在一次迭代后关闭连接,这将导致在第二次迭代中ResultSet 关闭 javasql 异常后不允许操作,将 con.close 移到循环外
public class UserDAOImpl implements UserDAO{
public List<User> readUser() {
List<User> list = new ArrayList();
User u = new User();
try {
System.out.println("inside readuser impl");
Class.forName("com.mysql.jdbc.Driver");
Connection con =
DriverManager.getConnection("jdbc:mysql://localhost:3306/userdb", "root", "");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from user");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String address = rs.getString("address");
u.setId(id);
u.setName(name);
u.setAddress(address);
System.out.println(u);
list.add(u); //adding user object to list
}
} catch (Exception e) {
System.out.println(e);
}
con.close();
return list; //returning to list for json response
}
}
甚至你可以使用资源尝试它会自动关闭所有资源
public class UserDAOImpl implements UserDAO{
public List<User> readUser() {
List<User> list = new ArrayList();
User u = new User();
try( Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/userdb", "root", "");
Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("select * from user");){
System.out.println("inside readuser impl");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String address = rs.getString("address");
u.setId(id);
u.setName(name);
u.setAddress(address);
System.out.println(u);
list.add(u); //adding user object to list
}
} catch (Exception e) {
System.out.println(e);
}
return list; //returning to list for json response
}
}
我没有测试第二个,因为我在这台机器上没有环境
推荐阅读
- android - 如何使用存储在数据库中的颜色在 MPAndroidChart 中设置颜色?
- angular - 将数组分配给具有 Mock 数据的另一个数组时出现角度未定义错误
- c# - Xamarin 表单无法处理异常
- reactjs - 为什么我的 useState() 钩子没有在 useEffect() 中设置新状态?
- .net - 如何在使用 `dotnet test` 和 VS 执行测试之前运行命令?
- reactjs - 具有跨域支持和填充属性的嵌套 svg
- javascript - 如何实时知道网站何时发布新内容?
- opencv - 我可以在 OpenCV 的 yolo 检测模型中更改批量大小吗?
- android-studio - 无法创建抽象类 Android Studio 的实例
- swift - 如何在视图和类中使用全局变量?