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