结果集只有一行,debug时next()方法返回false,无法进入循环,但是运行时可以显示结果,说明循环已经进行(结果集有多行时正常,有几条就输出几条)
代码(只粘贴有关代码)
Servlet
//sql语句
String sql = "SELECT * FROM userdata WHERE id = ?";
//传入连接、接收数据的类,sql语句以及sql语句中?的替代
ArrayList<Data> arrayList = JDBC.search(connection, Data.class, sql, 1);
PrintWriter writer = response.getWriter();
for (Data d : arrayList) {
writer.println(d);
}
JDBC类
public static <T> ArrayList<T> search(Connection connection, Class<T> clazz, String sql, Object... args) {
PreparedStatement ps = null;
ResultSet result = null;
ArrayList<T> collection = new ArrayList<T>();
try {
ps = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
result = ps.executeQuery();
//获取结果集的元数据
ResultSetMetaData rsmd = result.getMetaData();
//之前没有用过next()
while (result.next()) {
//获取结果集列数
int columnCount = rsmd.getColumnCount();
//创建存储结果集数据的对象
T t = clazz.getDeclaredConstructor().newInstance();
for (int i = 0; i < columnCount; i++) {
//获取结果集一行的各列的数据
Object columnValue = result.getObject(i + 1);
//获取当前列的列名
String columnLabel = rsmd.getColumnLabel(i + 1);
//给对象的每个属性赋值
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}
collection.add(t);
}
} catch (SQLException | NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
} finally {
if (collection == null) {
System.out.println("Failed to search");
}
return collection;
}
}
debug时next()返回false,无法进入循环
运行时在页面可以显示