posts - 25, comments - 69, trackbacks - 0, articles - 2

          說明:根據(jù)提供的sql/標(biāo)題/參數(shù)列表進(jìn)行查詢,返回的二維String數(shù)組可以直接用來顯示,將會陸續(xù)增加排序/格式化等功能,核心的execQuery方法如下:

          public String[][] execSQL(String sql,String[] titles,Object[] params) throws Exception {

          //todo:驗證數(shù)據(jù)庫連接是否可用
          ??if(con==null||con.isClosed())throw new Exception("數(shù)據(jù)庫連接不可用");

          //todo:簡單的驗證輸入?yún)?shù)
          ??if(sql==null)
          ???throw new Exception("SQL語句不能為空");
          ??sql=sql.trim();
          ??if(sql.equals(""))
          ???throw new Exception("SQL語句不能為空");
          ??
          //對輸入?yún)?shù)做簡單的日志記錄??
          logger.info(sql);??
          ??logger.info(Dao.msgOfArray(titles));
          ??logger.info(Dao.msgOfArray(params));
          ???
          //準(zhǔn)備sql??
          PreparedStatement pst = con.prepareStatement(sql);

          //如果參數(shù)不空,則準(zhǔn)備參數(shù)??
          if(params!=null)
          ??{
          ???for(int i=0;i<params.length;i++)
          ???{
          ????if(params[i]==null)
          ????{
          ?????break;
          ????}
          ????pst.setObject(i+1,params[i]);? //此處依賴JDBC Driver實現(xiàn),不同的驅(qū)動可能實現(xiàn)的程度不一樣
          ???}
          ??}

          //查詢
          ??ResultSet rs = pst.executeQuery();
          ??
          //metaData
          ResultSetMetaData md = rs.getMetaData();
          ??int colCount = md.getColumnCount();
          ??ArrayList al = new ArrayList(maxCount); //maxCount為Dao的一個屬性,定義每次查詢返回的最大記錄數(shù)

          //如果參數(shù)沒有輸入表格頭信息,則從metadata取得列名字作為默認(rèn)值??
          if (titles == null) {
          ???titles = new String[colCount];
          ???for (int i = 0; i < colCount; i++) {
          ????String columnName = md.getColumnName(i + 1);
          ????if (columnName == null) {
          ?????columnName = "無列名";
          ????};
          ????titles[i] = columnName;
          ???}
          ??}

          ??int count = 0;
          ??al.add(count++, titles); // 標(biāo)題

          //遍歷結(jié)果集合?
          ?while (rs.next()) {
          ???String[] buffer = new String[colCount];
          ???for (int i = 0; i < colCount; i++) {
          ????int type = md.getColumnType(i + 1);
          ????int scale = md.getScale(i + 1);
          ????String value=null;

          //todo:根據(jù)對于頁面顯示的要求,對不同的數(shù)據(jù)類型用不同的方式格式化
          ????switch (type)
          ????{
          ????case Types.LONGVARCHAR: // -1 dataType="Long";
          ?????value=rs.getString(i+1);
          ?????break;
          ????case Types.CHAR: // 1 dataType="Character";
          ?????value=rs.getString(i+1);
          ?????break;
          ????case Types.NUMERIC: // 2
          ?????switch (scale) {
          ?????case 0: // dataType="Number";
          ??????value=rs.getString(i+1);
          ??????break;
          ?????case -127: // dataType="Float";
          ??????value=rs.getString(i+1);
          ??????break;
          ?????default:
          ??????value=rs.getString(i+1);
          ???????? break;
          ?????}
          ?????break;

          ????case Types.VARCHAR: // 12
          ?????// dataType="String";
          ?????value=rs.getString(i+1);
          ?????break;
          ????case Types.DATE: // 91
          ?????// dataType="Date";
          ?????value=rs.getString(i+1);
          ?????break;
          ????case Types.TIMESTAMP: // 93
          ?????// dataType="Date";
          ?????value=rs.getString(i+1);
          ?????break;
          ????case Types.BLOB:
          ?????// dataType="Blob";
          ?????value="不支持的數(shù)據(jù)類型";
          ?????break;
          ????default:
          ?????value=rs.getString(i+1);
          ????}
          ????
          ????buffer[i]=value;
          ???}
          ???al.add(count++, buffer);
          ???if (count >= maxCount) {
          ????break;
          ???}
          ??}

          //convert to String[][] and return??
          String[][] returnValue = new String[count][];
          ??for (int i = 0; i < count; i++) {
          ???returnValue[i] = (String[]) al.get(i);
          ??}
          ??return returnValue;
          ?}
          //end here


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 胶南市| 鄂州市| 肇庆市| 醴陵市| 中阳县| 广昌县| 许昌市| 眉山市| 荔浦县| 莲花县| 津南区| 射洪县| 治县。| 依安县| 买车| 离岛区| 南宁市| 新民市| 自治县| 连城县| 福贡县| 梅河口市| 屯昌县| 长治市| 上犹县| 瓮安县| 称多县| 延寿县| 孙吴县| 临泉县| 永平县| 瓮安县| 揭东县| 平乐县| 尉氏县| 新巴尔虎左旗| 竹山县| 营口市| 保亭| 信宜市| 林甸县|