//? 为什么要返回ArrayList ,而不是我们想到ResultSet
//1. ArrayList 中封装 User对象,更加符合面向对象的编程方式 OOP
//2.我们通过 Resulst->User对象->ArrayList这样ArrayList和 Resultset没有关系,就可以及时关闭数据库资源.
下面为二次封装的例子:
UserService中的分页函数————进一步进行二次封装,把散开的单纯Object,整理成为User对象:
//二次封装把ArrayList(object)->User对象 -> ArrayList(集合)(User)
ArrayListal=SQLHelper.executeQueryAL(sql, null);
try {
for(inti=0;i<al.size();i++){
Object[]obj=(Object[]) al.get(i);
//User对象如果放在外,al最终只有一个对象,而且是最后赋值的那个
//在内,每次都创立一个新的加入ArrayList中
//hibernate中有自动的方法进行二次封装
Useruser=new User();
user.setId((Integer)obj[0]);
user.setName((String)obj[1]);
user.setEmail((String)obj[2]);
user.setGrade((Integer)obj[3]);
user.setPwd((String)obj[4]);
//千万别忘记 u-> ArrayList
alUser.add(user);
}
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return alUser;
因为在executeQueryAL中,返回的ArrayList包含的是普通的object
ResultSetMetaDatarsmd = rs.getMetaData();
//得到查询语句有几列(几项)
intnumberOfColumns=rsmd.getColumnCount();
while (rs.next()) {
Object[] ob= newObject[numberOfColumns];
for(inti=1;i<=numberOfColumns;i++){
//此处i不能为0,因为后面getObject(i+1),而上面i<=numberOfColumns
//这样i+1就超过rs的范围了,报错
ob[i-1]=rs.getObject(i);
}
al.add(ob);
}