HashMap关系数据映射技术(简称PVO技术)

 

 
HashMap关系数据映射技术软件(PVO_v1.2)简介
 
2007-3-9
著作权人:胡开明
 
(说明:此文于2006年4月26日初次发表在CSDN,这次根据PVO_v1.2变化情况略作了修改,并修正了原文个别错误)
 
 
 
一、简介
PVO,Process Value Object的缩写,意为值对象加工,ProcessVO是本案的核心类,故将此技术简称为PVO技术。
PVO技术方案符合DAO设计模式思想,核心类ProcessVO封装了与数据库相关的所有基本操作,如:插入、更新、删除、查询,支持文件上传,并且实现了对查询结果集进行分页、筛选、排序、备份、获取子集的多种算法;有效地实现了数据库访问操作与业务逻辑的分离。与现有DAO之类设计模式技术相比,如JDO、OJB、hibernator,本案并没有采用XML语言来配置对象和关系型数据之间的映射,取而代之的是实现HashMap与关系型数据之间的映射,免去了复杂的XML之类的数据库表的描述文件,是一个“一次写成,到处运行”的通用的抽象级简化JDBC编程的工具。因此,可以更简洁、更方便地实现对数据库操作。在EJB、Application、Servlet、Applet等应用中均可不受限制地方便使用。使用此项技术,可以大大提高数据库编程的效率,同时可以大大减轻数据库服务器数据流量的负担。同传统的数据库编程技术相比,使用PVO工具可以将数据库编程的效率提高数倍、甚至是数十倍。工程项目越复杂,数据库的字段越多就越能体现PVO工具所带来的灵活、高效。
二、技术原理
不论是查询,还是插入、更新记录,均使用HashMap对象作为一条记录的载体。这个HashMap对象的键名是表中的字段名,或是字段的别名,键值为字段值,键值的类型是字段所对应的JDBC API的Java类。针对数据库的操作,如:插入、更新、删除、查询,该方法会将所传递的Map型参数转化成SQL语句的组成部分,自动生成完整的标准的SQL语句,供JDBC API调用。
三、包与类文件
1、包名:核心包cn.hkm.sql、web应用包cn.hkm.web
2、类文件:
cn.hkm.sql包括 :ProcessVO、DbCon、Tool、WhereString、QueryString、MapNode、MapTree、Label
cn.hkm.web包括: BaseMapForm、PvoPageTag、PvoSqlTag、PvoRecordTag、PvoImgsTag、PvoImgTag、PvoShowImgTag、PvoRecordMapTag以及标志库描述文件pvotag.tld
四、使用范例
1、查询,例:
ProcessVO pvo=new ProcessVO();
pvo.setCon(con);
//也可用ProcessVO pvo=new ProcessVO(con);
List v=pvo.getSomeRecord("select a.* ,b.name from… where …");//支持任何语法正确的查询
pvo.closeCon();
2、插入,例:
ProcessVO pvo=new ProcessVO(con);
int i = insertARecord (tableName, map);
//也可使用int i=pvo.insertARecord("insert into …");
pvo.closeCon();
3、更新,例:
ProcessVO pvo=new ProcessVO(con);
int i=pvo.updateARecord("table",map,new WhereString("key_id","=",id));
pvo.closeCon();
4、删除,例:
ProcessVO pvo=new ProcessVO(con);
int i=pvo.delRecord(“delete from …”);
pvo.closeCon();
五、在Web中的应用,与Struts完美结合
设数据库表如:
create table tel(
tel_id bigint primary key,
clerk_id bigint,
type varchar(8),
code varchar(32)
)
create table clerk(
clerk_id bigint primary key,
name varchar(32),
birthday varchar(10),
descreption varchar(255)
)
  本案可以与流行的Struts架构完美结合,使用时请将pvotag.tld复制到WEB-INF目录中。为了更方便地使用,cn.hkm.web.BaseMapForm类继承了Struts中的org.apache.struts.action.ActionForm,并且覆写了reset方法,增加了一个Map record属性,只要您的ActionForm继承BaseMapForm,并按以下方式覆写reset方法:
    public void reset(ActionMapping actionMapping,HttpServletRequest servletRequest) {
        super.reset(actionMapping,servletRequest);
}
这样,在理论上,除了上传文件外,只要有这一个Map record属性,就足够了。BaseMapForm中还提供了一组字符串验证方法、一组将上传文件保存到文件夹方法、一组将上传文件保存到record对象供存贮到数据库的方法、一组时间查询方法。用BaseMapForm上传文件,其方便性完全可与SmartUpload媲美。分页标签可以将分页工作简化至极。
1、查询,例:
ProcessVO pvo=new ProcessVO(con);
List v=pvo.getSomeRecord("select a.* ,b.name from tel as a, clerk as b where a.clerk_id=b.clerk_id");
session.setAttribute("clerk_tel_vector",v);
pvo.closeCon();
    //在页面中调用List结果集,以流行的Struts为例
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
        <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@ taglib uri="/WEB-INF/pvotag.tld" prefix="pvo" %>
    ……..
          <pvo:page id=" clerk_tel_v " name=" clerk_tel_vector " length="20"/>
     <table bgcolor="white" width="100%" cellpadding="0" cellspacing="1">
            <logic:present name="clerk_tel_v">
                <tr align=’center’>
<td>姓名</td>
<td>分类</td>
<td>号码</td>
</tr>
              <logic:iterate id="record" name="clerk_tel_v">
                <tr>
                  <td><bean:write name="record" property="name"/></td>
                  <td><bean:write name="record" property="type"/></td>
                  <td><bean:write name="record" property="code"/></td>
                </tr>
              </logic:iterate>
            </logic:present>
          </table>
 
如果表中有记录,则会有类似以下的结果:

共x页 共xxx条 当前第x页 访问第: 1 2 3…x页
姓名
分类
号码
张三
手机
13955668899
张三
电话
0553-6823888
张三
传真
0553-6823888

 
2、数据录入(新建记录与修改记录),例:
页面中的表单
      <p><h1 style="color:yellow">人员信息录入</h1></p>
    <html:form action="/menuAction.do?method=clerk" method="post">
    <p>
姓名
          <html:hidden property="id"/>
          <html:text property="record.name"/>
       </p>
    <p>出生日期<html:text property="record.birthday"/></p>
<p>简介<html:text property="record.descreption"/></p>
<p><html:submit>提交</html:submit></p>
</html:form>
 
/**MenuAction中的clerk方法,新建记录和修改记录使用相同的方法完成*/
 public ActionForward clerk(ActionMapping actionMapping,
                             ActionForm actionForm,
                             HttpServletRequest servletRequest,
                             HttpServletResponse servletResponse) throws
      SQLException {
      String id=servletRequest.getParameter("id");
      MapForm form = (MapForm) actionForm;
form.reset(actionMapping,servletRequest);//准备提取record数据
      Map map=form.getRecord();//获取表单中的记录
      ProcessVO pvo=new ProcessVO(con);
      try {
          pvo.setAutoCommit(false);
          if ("".equals(id))  //新插入一条记录
              id = pvo.insertKey("clerk", "clerk_id").toString();
          pvo.updateARecord("clerk", map,"where clerk_id="+ id));//修改记录
          pvo.commit();
      } catch (SQLException ex) {
         pvo.rollback();
         ex.printStackTrace();
      }
      finally{
        pvo.closeCon();
}
      return actionMapping.findForward("clerk");
 }
 
 /**clerk_edit方法,从数据库中提取一条指定的记录,供表单编辑使用*/
 public ActionForward clerkEdit(ActionMapping actionMapping,
                               ActionForm actionForm,
                               HttpServletRequest servletRequest,
                               HttpServletResponse servletResponse) throws
      SQLException {
      String id=servletRequest.getParameter("id");
      ProcessVO pvo = new ProcessVO(con);
      try {
          Map map = pvo.getARecord("clerk", "clerk_id", id);
          MapForm form = (MapForm) actionForm;
          form.setId(id);
          form.setRecord(map); //仅一句,就可设置好所有表单属性值
      }
finally{
    pvo.closeCon();
      }
      return actionMapping.findForward("clerk");
 }
 
请注意无论是插入一条新记录,还是更新一条记录以及为表单准备数据,操作都十分简洁。更值得一提的是,如果数据库表中的字段类型发生变化,不须修改clerk方法,如果表中增加了一些新的字段,也不须修改clerk方法,只要在表单中添加相应的属性。假如:表中添加了新字段,
age int,
sex varchar(2),
在表单中添加以下两行即可:
<p>年龄<html:text property="record.age"/></p>
<p>性别<html:text property="record.sex"/></p>
注意!使用格式是:record.字段名。
从以上的例子可以看出,无论是与常规的JDBC数据库编程技术相比,还是与现有流行的DAO技术相比,此方案可能会在一个项目开发中,将数据库的编程效率提高数倍、甚至是数十倍。数据库字段越多,PVO技术能带来的效率就越明显。
 
 2007 年3月9日 修订
 
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值