我以前用Vector<Object[]> 、Object[]作为数据库查询结果的集合,但是数据库一旦发生细小改变,返回结果带来的上层逻辑变动将会变得特别大,并且容易会造成数组的越界异常。
因此,用一个新的类来保存数据库查询结果,这是非常有意义的。一方面可以降低两层之间的使用的复杂度(上层使用时得非常清楚数据库的设计细节)。另一方面,可以使得数据库的变动引起的上层的改动减小。当然,也便得数据库查询结果的使用更为安全,减少out of range的异常的发生。
类实现如下:
package lauo;
import java.util.*;
/*
* 一个用于管理SQL查询结果的类,
* 避免使用数组而产生的数据越界问题
*/
public class ResultMap
{
private HashMap<String,Object> map;
public ResultMap()
{
map = new HashMap<String,Object>();
}
/*
* 存入数据
*/
public Object put(String key,Object v)
{
return map.put(key, v);
}
/*
* 得到对应key的value值
*/
public Object get(String key)
{
return map.get(key);
}
/*
* 移去对应的key-value数值对,一般不用。
*/
public Object remove(String key)
{
return map.remove(key);
}
/*
* 得到存储的map
*/
public HashMap<String,Object> getMap()
{
return map;
}
/*
* 得到size of map
* 以得知结果的数量
*/
public int getSize()
{
return map.size();
}
}
注解:这个类还是非常简单的,咋一看下,有点像HashMap,又有点像ResultSet。其实像HashMap是对的,因为它的确是HashMap的简单封装,基本的数据成员就是HashMap<String,Object> !像ResultSet 嘛,是因为名字的原因。为什么叫ResultMap呢,因为他的目标就是作为数据库的查询结果返回的。
他与ResultSet的不同是:ResultSet会在stm关闭的时候,或者当下一个stm执行的时候,ResultSet会因此关闭。因而不能作为永久性存储容器!
使用HashMap/ResultMap作为存储容器,可以做到非易失性。并且有key-value的关系。可以实现键-值的有效存储,从而降低异常的出现、以及因数据库变动而引起的储多问题。
应用举例:
public Vector<ResultMap> query(String table)
{
if(table==null) return null;
try
{
Vector<ResultMap> v =new Vector<ResultMap>();
ResultSet rev = stm.executeQuery("select * from "+table);
ResultSetMetaData md = rev.getMetaData();//得到表的列描述信息
while(rev.next())
{
ResultMap m =new ResultMap(); //新建一个新的结果map
for(int i=1,size=md.getColumnCount();i<=size;i++)
{
m.put(md.getColumnName(i), rev.getObject(i));
}
v.add(m);
}
return v;
}
catch (Exception e )
{
e.printStackTrace();
return null;
}
}
此例程:查询一个表,返回以Vector<ResultMap> 为表示的结果集。
对于非多行(单行)的结果,可以只使用ResultMap作为其查询的结果。
返回的结果,可作如下应用:
/对于query及 ResultMap的一个应用的例子
Vector<ResultMap> res = s.query("user");//得到user表的所有内容
for(int i=0;res!=null&&i<res.size();i++)
{
ResultMap m = res.get(i);
System.out.println("id:"+m.get("id")+" psw:"+m.get("psw")+
" name:"+m.get("name")+" authority:"+m.get("authority")
+" des:"+m.get("des")+" noexist:"+m.get("noexist"));
}
/
从这里面的" noexist:"+m.get("noexist"));可以看到,即使返回的结果集中不存在此列名,那也是无所谓的,这样可以很好的屏蔽底层细节。查询key对应的value,不会有异常发生,非常安全!