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

来源:互联网 发布:机器人路径 d算法 编辑:程序博客网 时间:2024/06/06 02:12

 

 
HashMap关系数据映射技术软件(PVO_v1.2)简介
 
2007-3-9
著作权人:胡开明
 
(说明:此文于2006年4月26日初次发表在CSDN,这次根据PVO_v1.2变化情况略作了修改,并修正了原文个别错误)
 
一、简介      
、技术原理      
三、包与类文件   
四、使用范例      
五、在Web中的应用,与Struts完美结合  
 
 
一、简介
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页 访问第:123…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技术能带来的效率就越明显。
 
 200739 修订
 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 护士电子化注册激活码搞丢了怎么办 香港地铁地铁错买了特惠票怎么办 湖北软考证书领取没有准考证怎么办 哈罗单车电动车骑着没电了怎么办 招聘线上测评的通行证过期了怎么办 上海落户在国企辞职后户口怎么办 老党员干部档案丢失人以去世怎么办 档案中的年龄有涂改办理退休怎么办 到办理退休不知档案在那怎么办 职工办理退休时档案丢了怎么办 老婆嫌我穷把我和孩子抛弃了怎么办 我招工表比我实际年龄小一岁怎么办 考上好学校名额被顶替了怎么办 面试题领导越级安排工作你怎么办 一个23岁的大学生身体肥胖怎么办 雷达手表把调时间的把出来了怎么办 农村没有住电表被卸载了怎么办 工商已吊销未注销要恢复营业怎么办 中专类学校取消后在编的老师怎么办 情迁微信内置抢红包版本过低怎么办 船运货给客户货到他不要怎么办 摩拜单车锁了还在计费怎么办 旧公司股份现成立新公司股份怎么办 比亚迪l3线路进水打不着火怎么办 新成立的建筑公司没有业绩怎么办 被骗做了深圳国税实名办税怎么办 天猫精灵生活灯老是离线怎么办 电信合约没到期不想用了怎么办 电信合约卡到期不想用了怎么办 欧普照明平板灯坏了怎么办 交通违章处理了但系统没更新怎么办 车里的空调一直吹的是热气怎么办 丰田雷凌保养手册丢了怎么办 海尔电视两年主板坏了怎么办 海信电视保修期内主板坏了怎么办 乐视电视的主板坏了怎么办 车电瓶没电了打不着火怎么办 面包车没电了打不着火怎么办 汽车电瓶没电了打不着火怎么办 自动挡的车没有电打不起来火怎么办 自动挡汽车没电了打不着火怎么办