java:数据库查询结果类:ResultMap 屏蔽数据库设计细节,减弱强联系。

我以前用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);
}
/*
得到对应keyvalue值
*/
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,不会有异常发生,非常安全!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值