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

说明:根据提供的sql/标题/参数列表进行查询,返回的二维String数组可以直接用来显示,将会陆续增加排序/格式化等功能,核心的execQuery方法如下:

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

//todo:验证数据库连接是否可用
  if(con==null||con.isClosed())throw new Exception("数据库连接不可用");

//todo:简单的验证输入参数
  if(sql==null)
   throw new Exception("SQL语句不能为空");
  sql=sql.trim();
  if(sql.equals(""))
   throw new Exception("SQL语句不能为空");
  
//对输入参数做简单的日志记录  
logger.info(sql);  
  logger.info(Dao.msgOfArray(titles));
  logger.info(Dao.msgOfArray(params));
   
//准备sql  
PreparedStatement pst = con.prepareStatement(sql);

//如果参数不空,则准备参数  
if(params!=null)
  {
   for(int i=0;i<params.length;i++)
   {
    if(params[i]==null)
    {
     break;
    }
    pst.setObject(i+1,params[i]);  //此处依赖JDBC Driver实现,不同的驱动可能实现的程度不一样
   }
  }

//查询
  ResultSet rs = pst.executeQuery();
  
//metaData
ResultSetMetaData md = rs.getMetaData();
  int colCount = md.getColumnCount();
  ArrayList al = new ArrayList(maxCount); //maxCount为Dao的一个属性,定义每次查询返回的最大记录数

//如果参数没有输入表格头信息,则从metadata取得列名字作为默认值  
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); // 标题

//遍历结果集合 
 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:根据对于页面显示的要求,对不同的数据类型用不同的方式格式化
    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="不支持的数据类型";
     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


只有注册用户登录后才能发表评论。


网站导航: