随笔-39  评论-33  文章-0  trackbacks-0

DAO + 通用持久类 + 通用动态 formBean 类,实现数据增、删、改、查

newxy( 新坐标 ) 技术运用之三

 

DAO类”: net.newxy.dbm.BaseDAO或其子类;

“通用持久类”: net.newxy.dbm.DynaDto;

“通用动态formBean类”: net.newxy.struts_faces.DynaFormBean

 

DAO + 通用持久类,实现数据增、删、改、查》 ( 又名《 不同于hibernate,利用通用持久类实现数据增、删、改、查,可极大提高开发效率 ) 文章中介绍的数据增、删、改、查方法比 hibernate 的方法已简单很多,如果引入通用动态 formBean ,开发效率会有更大提高。

 

net.newxy.struts_faces.DynaFormBean 类的类图

一、利用通用动态formBean类,实现数据增、删、改

struts ActionServlet 将用户 submit 来的数据绑定到 net.newxy.struts_faces.DynaFormBean 对象中,在后台,通过调用 net.newxy.struts_faces.DynaFormBean public Object getDto() public Object get(String name) 方法将上传的数据提出, net.newxy.struts_faces.DynaFormBean 起作传送数据的作用。

1 )数据插入: Object update(Object dto) throws Exception;

举例:

public ActionForward update(ActionMapping actionMapping, ActionForm actionForm,

				
						                              HttpServletRequest httpServletRequest,
		
				
						            HttpServletResponse httpServletResponse) throws Exception{
		
				
						            ......
		
				
						            net.newxy.struts_faces.DynaFormBean form=( net.newxy.struts_faces.DynaFormBean)actionForm;
				
						
						
				
		

try{

net.newxy.dbm.DynaDto dynaDto=( net.newxy.dbm.DynaDto)form.getDto();

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

dynaDto.set_table("table1");//设置表名

        Object result=dao.update(dynaDto);

    }catch(Exception e){

        ......

}

......

}

jsp页面不上传主关键字段值,主关键字段值会自动得到,是原有最大值加一。

如果jsp页面上传了主关键字段值,如:表单中有<html:text property=”id” />用户键入了id值。newxy(新坐标)会检查赋给的主关键字值是否已存在,如果存在,作更新(update)操作,如果不存在,作插入(insert)操作。

判断是更新还是插入操作,可以根据返回的result值来判断,如果result值为空,是作更新操作,如果result不空是作插入操作。

Object result=dao.update(dynaDto);

如果想需要知道自动赋给的主关键字段值,可以用如下方法:

Object result=dao.update(dynaDto);

Object idValue=null;

If(result!=null)

idValue=((DynaDto)result).get(“id”);

idValue 就是自动赋给的主关键字段值。

 

2)数据更新:

举例:

 

public ActionForward update(ActionMapping actionMapping, ActionForm actionForm,

                              HttpServletRequest httpServletRequest,

            HttpServletResponse httpServletResponse) throws Exception{

            ......

   DynaFormBean form=(DynaFormBean)actionForm;

try{

DynaDto dynaDto=(DynaDto)form.getDto();

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

dynaDto.set_table("table1");

       Object result=dao.update(dynaDto);

   }catch(Exception e){

        ......

}

......

}

数据更新方法与数据插入方法相同,需注意:如果 dynaDto 中没有主关键字段值,即 dynaDto.get(“id”)==null dynaDto.get(“id”) 所得主关键字段值在表中不存在 dao.update(dynaDto) 方法仍然作插入操作。

在进行 dao.update(dynaDto) 前,可以判断数据是否已存在于表中:

Object masterKey=dynaDto.get(“id”);

Object record=null;

if(masterKey!=null)

record=dao.load(dynaDto);

如果 masterKey==null record==null ,表中不存在该条记录, dao.update(dynaDto) 作插入操作,否则该条记录存在于表中,作更新操作。

那么在 jsp 页面上如何保证用户录入的是新插入数据或是编辑修改的数据呢?参看本文后面部分 jsp 页面上新建、编辑数据

3 )数据删除

举例:

public ActionForward remove(ActionMapping actionMapping, ActionForm actionForm,

				
						
								                              HttpServletRequest httpServletRequest,
				
		
				
						
								            HttpServletResponse httpServletResponse) throws Exception{
				
		
				
						
								            ......
				
		
				
						
								
										            DynaFormBean form=(DynaFormBean)actionForm;
								
										
										
								
						
				
		

try{

    // 删除 formBean 当前数据对应的记录:

Object record=form.getDto();

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

dynaDto.set_table("table1");// 设置表名,如果上传数据的 jsp 页面表单中没有 <html:hidden name=”_table” value=”table1”/>

        dao.remove(dynaDto);

 

        // httpServletRequest.getParameter(“_index”) 值代表记录号,删除该条记录

        String index= httpServletRequest.getParameter(“_index”);

        Object record=form.getDto(index);

        dao.remove(record);

    }catch(Exception e){

        ......

}

......

}

 

二、利用通用动态formBean类,实现多项查询

   1、后台代码

       public ActionForward find(ActionMapping actionMapping, ActionForm actionForm,

               HttpServletRequest httpServletRequest,

               HttpServletResponse httpServletResponse) throws Exception{

           DynaFormBean form=(DynaFormBean)actionForm;

           net.newxy.util.FormBeanUtils. createForm(form,httpServletRequest);

           . .....

       }

    net.newxy.util.FormBeanUtils. createForm(form,httpServletRequest)方法将查询结果放在form的_coll属性中。后台代码极其简单,

那么httpServletRequest中包含了什么数据?下面是jsp页面表单对上传数据的组织。

   2、前台查询条件的组织

<html:form action="/myAction.do?method=find">

  <html:hidden property="_dao" value="dao.myDAO1"/>

  <html:hidden property="_sql" value="select a.industry,b.* from industry as a,enterprise as b where{a.code=b.industry_code}"/>

  <table border="1">

    <tr>

      <td>逻辑</td>

      <td colspan="2">

        <html:radio property="_lg" value="1">并且</html:radio>

        <html:radio property="_lg" value="0">或者</html:radio>

      </td>

    </tr>

    <tr>

      <td>行业</td>

      <td>等于</td>

      <td>

        <nhtml:hidden property="_item1" value="a.code"/>

        <html:hidden property="_item1" value="="/>

        <html:select property="_item1">

          <html:option value=""></html:option>

          <html:option value="A">农、林、牧、渔业</html:option>

          <html:option value="B">采矿业</html:option>

          <html:option value="C">制造业</html:option>

        </html:select>

      </td>

    </tr>

    <tr>

      <td>企业名称</td>

      <html:hidden property="_item2" value="b.name"/>

      <td>

        <html:select property="_item2">

          <html:option value=""></html:option>

          <html:option value="=">等于</html:option>

          <html:option value="like">包含</html:option>

        </html:select>

      </td>

      <td>

        <html:text property="_item2" size="40">

        </html:text>

      </td>

    </tr>

    <tr>

      <td>企业地址</td>

      <html:hidden property="_item3" value="b.address"/>

      <td>

        <html:select property="_item3">

          <html:option value=""></html:option>

          <html:option value="=">等于</html:option>

          <html:option value="like">包含</html:option>

        </html:select>

      </td>

      <td>

        <html:text property="_item3" size="40">

        </html:text>

      </td>

    </tr>

    <tr>

      <td align="right" colspan="3"><html:submit value=" 查 询 "/></td>

    </tr>

  </table>

</html:form>

该例是对企业表、行业表的连表查询,查询的基本条件是industry.code=enterprise.industry_code。

      industry:行业代码表

      industry.code:行业代码

      enterprise:企业表

      enterprise.industry_code:企业的行业代码

下面是表单中包含的几个属性:

(1)_dao ,是DynaFormBean的保留属性,是DAO类的别名,告诉后台由哪个DAO类来操作数据。别名在WEB-INF/classes下的newxy.properties文件中指定,假设有一DAO类如下:

          package common;

          public class MyDAO1 extends net.newxy.dbm.BaseDAO{

              ......

}

          在newxy.properties文件中定义DAO类别名如下:

                 dao.mydao1=common.MyDAO1

     如果DAO类common.MyDAO1的别名是dao.default,则表单无需上传属性_dao。

(2)_sql ,是DynaFormBean的保留属性,是查询的基本条件,其中where跟随其后的是大括号{},是最终组成查询条件存放的地方。用户选择的查询条件不管是”and”连接的还是”or”连接的,最终与_sql属性中的初始条件都以”and”关系连接。最后产生的sql语句可能是这样的:

             select a.industry,b.* from industry as a,enterprise as b where((a.code=b.industry_code)and (name=’....公司’ or  ......))

     其中红色是初始条件,蓝色是用户选择的条件,二者以”and”相连。

 

(3)_lg ,是DynaFormBean的保留属性,是“逻辑”的意思,如果_lg==”1”,上传的查询条件以”and”关系组织,否则以”or”关系统组织。

(4)_item开头的属性 ,这种属性都以一个数字跟随其后,这样的属性一上传就有三个。如果在“企业名称”的<select name=”_item2”>...</select>项选择“等于”,在<input type=”text” name=”_item2”/>项填入“......公司”,上传数据后可得到如下字符串数组:

String[] itemValues=request.getParameterValues(“_item2”);

itemValues是三个字符串构成的数组,三个字符串分别是 “a.name” “=” “......公司”,拼这一起可构成”a.name=’......公司’”,它构成查询条件的一部分。之所以这么解说,是增加对查询条件构成的理解。可参看 newxy(新坐标)网站 范例的“多项查询”。

三、 利用通用动态formBean类, 向前台展现查询结果

newxy(新坐标)查询的记录集保存在DynaFormBean类的_coll属性中,DynaFormBean另有一个属性_navigate,负责对记录集的分页计算。jsp页面可以用<nlogic:navigate/>标签为formBean的记录集分页导航。

举例:

如果struts的myAction的name=”enterprises”,查询后,formBean以”enterprises”为名保存的会话或其它scope中。

<div><nlogic:navigate formName="enterprise" length="20"/></div><!--导般标签-->

<logic:notEmpty name="enterprises" property="_coll">

  <table>

  <logic:iterate id="rec" name="enterprises" property="_coll">

    <tr>

      <td><bean:write name="rec" property="industry"/></td> <!--行业-->

      <td><bean:write name="rec" property="name"/></td> <!--企业名称-->

    </tr>

  </logic:iterate>

  </table>

</logic:notEmpty>

属性_coll是通用动态formBean类DynaFormBean的保留属性,保存了查询的记录,类型是List,其元素是 org.apache.commons.beanutils.BasicDynaBean 类型。

       

四、通用动态formBean类DynaFormBean及其父类的重要方法

     net.newxy.struts_faces.DynaFormBean类继承自net.newxy.struts_faces.FormBean,下面是net.newxy.struts.faces.DynaFormBean及其父类net.newxy.struts.faces.FormBean的几个重要方法

1、public void append(java.lang.Object dto)

在结果集_coll的最后追加一条记录。同时将索引号指向最后一条。并用最后一条记录数据填写formBean。

2、public java.lang.String setCollection(java.lang.Object objs)

设置结果集,与set_coll(Collection _coll)相比,该方法除了作set_coll(Collection _coll)操作外,还对与分页浏览的相关属性值进行计算,将计算结果重新填入formBean的_navigate属性中,并重新设置索引号。

3、public void setDto(java.lang.String no)

formBean中的数据填写到以no参数值为索引号的记录中。

4、public void setForm(java.lang.String no)

no参数值为索引号,查找该条记录,如果存在,将该条记录数据填入的formBean中,并以no值为索引号。

5、public void setForm(java.lang.Object dto)

dto为包含数据的javaBean。将该Bean的值填入formBean中。这个javaBean类继承自net.newxy.dbm.Dto,但在目前版本只介绍formBean类 net.newxy.struts.faces.FormBean 及持久类net.newxy.dbm.Dto,参数dto暂理解成通用持久类net.newxy.dbm.DynaDto。

6、public java.lang.Object getDto()

formBean得到持久类实例。

7、public java.lang.Object getDto(java.lang.String no)

no为序号,返回这条记录。如果不存在,返回空。

8、public void remove(java.lang.String no)

从结果集中删除以no参数值为序号的记录。

9、public java.lang.Object cloneDto(java.lang.String no)

no参数值为索引号,得到这条记录的克隆

10、public void empty()

formBean数据清空,但保留属性不会被清除,包括保存了记录集的属性_coll。

11、public java.util.Map getValues()

获取保存了属性值对的HashMap,页面表单submit上传的属性保存在这个Map中。

12、public java.lang.Object get(java.lang.String name)

获取以name值为属性名的属性值

13、public void set(java.lang.String name, java.lang.Object value)

设置属性值。如果name是保留属性,将不进行set操作。

14、public void setValue(java.lang.String name,java.lang.Object value)

保留属性的set方法,通过此方法给以改变保留属性的值。

15、public void set_dao(java.lang.String _dao)

设置DAO类别名,_dao是保留属性,也可用方法setValue(“_dao”,_dao)。

16、public void set_index(java.lang.String _index)

设置记录集的索引号,_index是保留属性,也可用方法setValue(“_index”,_index)。

 

五、在jsp页面上新建、编辑数据

1、后台查询数据

       public ActionForward find(ActionMapping actionMapping, ActionForm actionForm,

               HttpServletRequest httpServletRequest,

               HttpServletResponse httpServletResponse) throws Exception{

           DynaFormBean form=(DynaFormBean)actionForm;

           net.newxy.util.FormBeanUtils. createForm(form,httpServletRequest);

           . .....

       }

  2 、编辑更新记录

FormBeanUtils. createForm(form,httpServletRequest) 查询的记录集保存在DynaFormBean的_coll属性中并且以第一条记录填写到formBean的属性中。

jsp页面上有下列表单及其属性:

<html:form action="/myAction.do?method=update">

  <html:hidden property="_table" value="enterprise"/>

  <html:hidden property="industry_code" value="A"/>

  注册号:<html:text property="register_id"></html:text><br/>

  负责人:<html:text property="principal"></html:text><br/>

  企业名称:<br />

  <html:text property="name" size="36"></html:text><br />

  企业地址:<br />

  <html:text property="address" size="36"></html:text><br />

  经营范围:<br/>

  <textarea name="dealIn" cols="36" rows="10">

  <bean:write name="enterprise" property="dealIn"/>

  </textarea><br/>

  <html:submit value=”提交”/>

</html:form>

页面上显示的是每一条记录,用户编辑修改数据提交到后台,绑定到formBean中,覆盖原有数据。因为表单中没有主关键字段属性enterprise_id,数据提交后就不会改变原有的enterprise_id值, net.newxy.util.FormBeanUtils. createForm(form,httpServletRequest) 方法调用 DAO 类的 update(Object dto) 方法就会作更新操作。

(1) 在页面上为 formBean 选择第 10 条记录

jsp 页面 <html:form></html:form> 标签前加入 java 脚本 <%......%>

<%

    net.newxy.faces.DynaFormBean form=( net.newxy.faces.DynaFormBean)pageContext.getAtribute(“enterprises”,3);// session 中得到 formBean;

    form.setForm(“9”);

%>

(2) 在后台为 formBean 选择第 10 条记录

public ActionForward  selectRecord(ActionMapping actionMapping, ActionForm actionForm,

                              HttpServletRequest httpServletRequest,

            HttpServletResponse httpServletResponse) throws Exception{

    ......

DynaFormBean form=(DynaFormBean)actionForm

form.set(“10”);

......

}

jsp页面显示的便是第10条记录。用户可以对其编辑上传保存到数据库。

 

3、新建插入记录

本篇介绍的 数据插入: Object update(Object dto) throws Exception 方法表明,如果 dto 不包含主关键字段属性, update(dto) 作插入操作。如果在表单提交数据前调用 net.newxy.faces.DynaFormBean 类的 empty() 方法会清空 formBean 中的数据,但不清除保留属性,包括保存了记录集的属性 _coll 。这样用户得到的页面表单是空白的。而且提交数据后因为已清除了主关键字段属性, Object update(Object dto) throws Exception 方法会作数据插入操作。

(1) jsp 页面上清空 formBean

jsp 页面 <html:form></html:form> 标签前加入 java 脚本 <%......%>

<%

    net.newxy.faces.DynaFormBean form=( net.newxy.faces.DynaFormBean)pageContext.getAtribute(“enterprises”,3);// session 中得到 formBean;

    form.empty();

%>

(2) 在后台页面上清空 formBean

public ActionForward  selectRecord(ActionMapping actionMapping, ActionForm actionForm,

                              HttpServletRequest httpServletRequest,

            HttpServletResponse httpServletResponse) throws Exception{

    ......

DynaFormBean form=(DynaFormBean)actionForm

form.empty();

......

}

jsp 页面显示的是空白表单,用户输入数据提交后会作插入操作。

 

 

newxy( 新坐标 ) 技术网站: http://www.newxy.net

posted on 2006-07-08 08:41 newxy新坐标 阅读(438) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: