平常我们遍历结果集的时候,都必须创建一个实体bean,然后将结果集遍历的时候通过set方法放到这个实体bean对象中.
1 String sql="select * from book";
2 try{
3 Connection con = MyConnection.getConnection(); 4 Statement statement = con.createStatement(); 5 ResultSet resultSet = statement.executeQuery(sql); 6 // ResultSetMetaData rsmd = resultSet.getMetaData(); 7 // int count = rsmd.getColumnCount(); 8 while(resultSet.next()) 9 { 10 Book book = new Book(); 11 book.setBookName(resultSet.getString("bookName")); 12 book.setPrice(resultSet.getString("price")); 13 book.setPicUrl(resultSet.getString("picUrl")); 14 list.add(book); 15 }catch(SQLException e) 16 { e.printStackTrace(); 17 } catch (ClassNotFoundException e) { 18 e.printStackTrace(); 19 }
但是这种遍历结果集局限性很多,如果我们想通过第三方去查询别的数据库呢?难道我们还要把他们实体类通通拷贝过来么? 或者说我们每次查询都要提前知道查询的字段,有没有方法不用实体bean,我们只要数据,要实体bean做什么?
下面的方法,可以借鉴.
1 /** 2 * 把ResultSet中取出的数据转换为相应的数据值字符串 3 * 输出:如果成功执行,返回True,否则返回False,并且在Error中设置错误的详细信息 4 * @param rsmd ResultSetMetaData 5 * @param rs ResultSet 6 * @param i int 7 * @return String 8 */ 9 public String getDataValue(ResultSetMetaData rsmd, ResultSet rs, int i) 10 { 11 String strValue = ""; 12 13 try 14 { 15 int dataType = rsmd.getColumnType(i); 16 String name = rsmd.getColumnTypeName(i); 17 System.out.println("sql类型名称为:"+name); 18 int dataScale = rsmd.getScale(i); 19 int dataPrecision = rsmd.getPrecision(i); 20 //数据类型为字符 21 if ((dataType == Types.CHAR) || (dataType == Types.VARCHAR)) 22 { 23 //由于存入数据库的数据是GBK模式,因此没有必要做一次unicodeToGBK 24 // strValue = StrTool.unicodeToGBK(rs.getString(i)); 25 strValue = rs.getString(i); 26 } 27 //数据类型为日期、时间 28 else if ((dataType == Types.TIMESTAMP) || (dataType == Types.DATE)) 29 { 30 strValue = PubFun.getString(rs.getDate(i)); 31 } 32 //数据类型为浮点 33 else if ((dataType == Types.DECIMAL) || (dataType == Types.FLOAT)) 34 { 35 //strValue = String.valueOf(rs.getFloat(i)); 36 //采用下面的方法使得数据输出的时候不会产生科学计数法样式 37 strValue = String.valueOf(rs.getBigDecimal(i)); 38 //去零处理 39 strValue = PubFun.getInt(strValue); 40 } 41 //数据类型为整型 42 else if ((dataType == Types.INTEGER) || (dataType == Types.SMALLINT)) 43 { 44 strValue = String.valueOf(rs.getInt(i)); 45 strValue = PubFun.getInt(strValue); 46 } 47 //数据类型为浮点 48 else if (dataType == Types.NUMERIC || dataType == Types.BIGINT) 49 { 50 if (dataScale == 0) 51 { 52 if (dataPrecision == 0) 53 { 54 //strValue = String.valueOf(rs.getDouble(i)); 55 //采用下面的方法使得数据输出的时候不会产生科学计数法样式 56 strValue = String.valueOf(rs.getBigDecimal(i)); 57 } 58 else 59 { 60 strValue = String.valueOf(rs.getLong(i)); 61 } 62 } 63 else 64 { 65 //strValue = String.valueOf(rs.getDouble(i)); 66 //采用下面的方法使得数据输出的时候不会产生科学计数法样式 67 strValue = String.valueOf(rs.getBigDecimal(i)); 68 } 69 strValue = PubFun.getInt(strValue); 70 } 71 72 } 73 catch (SQLException ex) 74 { 75 ex.printStackTrace(); 76 } 77 78 return PubFun.cTrim(strValue); 79 }
若有别的更好的方法请告诉我,互相学习,谢谢!