平常我們遍歷結果集的時候,都必須創建一個實體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 }
若有別的更好的方法請告訴我,互相學習,謝謝!