Posted on 2006-04-10 10:40
壮士日志 阅读(297)
评论(0) 编辑 收藏
说明:根据提供的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