笔记:ResultSet中数据不存在的情况

来源:互联网 发布:合肥怎么样知乎 编辑:程序博客网 时间:2024/06/05 20:04
在写自己的dbtuil时遇到的问题result中不存在数据,结果集遍历会报下标异常的错误
try {PreparedStatement ps=conn.prepareStatement(sql);ResultSet rs=ps.executeQuery();if(rs!=null){li=new ArrayList<T>();while(rs.next()==true){T obj=(T)t.getClass().newInstance();for(int i=0;i<fields.length-1;i++){ // 获取属性的名字String fname = fields[i].getName();String name=fname.substring(fname.lastIndexOf(".")+1);                name = name.substring(0, 1).toUpperCase() + name.substring(1);             //   System.out.println("属性名是:"+fname);                //获取属性的类类型                String type=fields[i].getGenericType().toString();                  //  System.out.println("属性的类类型是:"+type);                    Method writeField=null;

因为ps.excuteQuery()返回的结果集中无论是否存在数据结果集都不会为空,

因此rs!=null的判断是多此一举,

并且此时当数据库中不存在自己要查询的数据时遍历结果集会报下标异常的错误(java.lang.IndexOutOfBoundsException: Index: 0, Size:0)

代码改进

try {PreparedStatement ps=conn.prepareStatement(sql);ResultSet rs=ps.executeQuery();if(rs!=null){if(rs.next()==true){li=new ArrayList<T>();rs.beforeFirst();while(rs.next()==true){T obj=(T)t.getClass().newInstance();for(int i=0;i<fields.length-1;i++){ // 获取属性的名字

光标首先在第一行之前,当有下一行数据时rs.next()会返回true,没有下一行则返回false,

因此先让光标移动一行用来确定第一行是否存在

如果返回true证明resultset中有数据,

将光标移回第一行之前(rs.beforeFirst())遍历结果集



0 0