java 将返回list型 改为 返回数组型

我有这么一个.java文件 处理sql语句 返回值是list 型
public List quyListBySqlAndParams(String querystr, List params,int dno) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rst = null;
ResultSetMetaData rsmd = null;

List tmplist=new ArrayList();

try{

conn = myDataUtil.getConnection(dno);
pstmt = conn.prepareStatement(querystr);
//参数赋值
for(int i=0;i<params.size();i++){
String param = params.get(i)==null?"":params.get(i).toString().trim();
pstmt.setString(i+1,param);
}

rst = pstmt.executeQuery();
rsmd = rst.getMetaData();

while (rst.next()) {

Map tmpmap = new HashMap();
for ( int i = 1; i <= rsmd.getColumnCount(); i++ ){
tmpmap.put(rsmd.getColumnName(i), rst.getObject(i));
}
tmplist.add(tmpmap);
}

}catch(Exception e){
System.out.println("pubgetstr"+e.toString()+querystr);
}finally{
myDataUtil.free(rst,pstmt,conn);
return tmplist;
}
}

问题是怎样将返回值改为数组型?只能给100分了,望高手解答!

两种方案:
第一种:(推荐使用这种)
只要修改返回类型,并把
return tmplist改成return tmplist.totoArray();就行了 取出的是Object数组,需要强制转换成HashMap;

//返回值是数组
public Object[] quyListBySqlAndParams(String querystr, List params,int dno) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rst = null;
ResultSetMetaData rsmd = null;

List tmplist=new ArrayList();

try{

conn = myDataUtil.getConnection(dno);
pstmt = conn.prepareStatement(querystr);
//参数赋值
for(int i=0;i<params.size();i++){
String param = params.get(i)==null?"":params.get(i).toString().trim();
pstmt.setString(i+1,param);
}

rst = pstmt.executeQuery();
rsmd = rst.getMetaData();

while (rst.next()) {

Map tmpmap = new HashMap();
for ( int i = 1; i <= rsmd.getColumnCount(); i++ ){
tmpmap.put(rsmd.getColumnName(i), rst.getObject(i));
}
tmplist.add(tmpmap);
}

}catch(Exception e){
System.out.println("pubgetstr"+e.toString()+querystr);
}finally{
myDataUtil.free(rst,pstmt,conn);

//这里调用toArray()方法返回数组
return tmplist.toArray();
}
}


方案二:
原理就是将结果集的游标定位到最后一行,然后通过返回行号确定记录数,从而确定数组的长度。然后再将游标回退到beforefirst

但是一定要注意 这么做有个地方要考虑, 默认的ResultSet类型是TYPE_FORWARD_ONLY,只向前的游标,不允许指针回退;在定义时要将默认的ResultSet类型里的TYPE_FORWARD_ONLY改成ResultSet.TYPE_SCROLL_INSENSITIVE,把你那句改成这个
pstmt = conn.prepareStatement(querystr, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

//返回数组
public Object[] quyListBySqlAndParams(String querystr, List params,int dno) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rst = null;
ResultSetMetaData rsmd = null;

Object[] tmpAarry;

try{

conn = myDataUtil.getConnection(dno);
//注意 这里做了修改 pstmt=conn.prepareStatement(querystr,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

//参数赋值
for(int i=0;i<params.size();i++){
String param = params.get(i)==null?"":params.get(i).toString().trim();
pstmt.setString(i+1,param);
}

rst = pstmt.executeQuery();
rsmd = rst.getMetaData();

// 这里做了修改
rst.last();
int count = rst.getRow();
tmpAarry = new Object[count];
rst.beforeFirst();

while (rst.next()) {

Map tmpmap = new HashMap();
int j = 0;
for ( int i = 1; i <= rsmd.getColumnCount(); i++ ){
tmpmap.put(rsmd.getColumnName(i), rst.getObject(i));
}
tmpAarry[j]=tmpmap;
j++;
}

}catch(Exception e){
System.out.println("pubgetstr"+e.toString()+querystr);
}finally{
myDataUtil.free(rst,pstmt,conn);
// 返回的是个数组
return tmpAarry;
}
}

好了,这两种方法的结构是一样的,看是你也看到了,自己写有多麻烦,还要考虑很多意想不到的问题,比如那个滚动结果集。所以能用java api中提供的最好用,那都是经得住考验的,而且方便的很。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-23
这个很容易啊,你既然能得到一个list的结果,那么在finally中不就可以声明一个Object的数组,长度就是tmplist的size,然后遍历tmplist把值都放到数组中就可以了。至于你要返回String类型的,那么你也可以在遍历的同时取出来相应的数据放入数组中。
最后return这个数组就可以了
第2个回答  2011-03-23
new一个object 数组,行数为上面通过结果集rst 取得的返回行数

然后在循环的时候 obj[i] =tmpmap 最后return 这个就可以了。追问

问题是初始化数组的时候要附长度,可是在处理完sql之前我并不知道有多少数据要存储。要怎么声明 让return的时候认识这个数组?还有 我想要返回一String类型的数组

追答

首先将指针移到最后一条记录rs.last();
然后检索当前所在的行数rs.getRow();
这样就能够得到结果集的行数了。

我看你的程序里面返回map列表,value 为object 型 ,不知道你具体要返回什么数据,
如果能用字符串解释出来,你可以尝试自已组合成json类型字符串,调用后再拆开,
有很多方法可以实现的。

第3个回答  2011-03-23
很容易啊
list有一个方法的
你的list是存放map的,

可以修改return tmplist为
return tmpList.toArray(new HashMap[0]);
这样就可以很方便的返回HashMap[]数组了
第4个回答  2011-03-23
调用ArrayList的toArray方法。
toArray
public <T> T[] toArray(T[] a)返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组,则返回放入此列表元素的数组。否则,将根据指定数组的运行时类型和此列表的大小分配一个新的数组。
比如List list = new ArrayList();
list.add("1");
list.add("2");
final int size = list.size();
String[] arr = (String[])list.toArray(new String[size]);
相似回答