项目上线前夕,功能和bug基本解决完毕,最烦的就是这种添加字段的需求,难度不大但需要照顾的点特别多,更可怕的是这种需求不一次提完,造成大量无意义的重复工作。下面以增加【面积性质】字段为例梳理一下整个流程。
需求:要求在项目中添加【面积性质】字段,在点击如下红框内菜单跳出的对话框内显示,且在点击编码显示详细信息页面时也显示,实现该字段的添加保存、修改、读取及两张表中该字段值的一致。其实项目中如果不存在这个字段的话相对来说更好改,能够毫无顾忌的按照流程完成添加字段操作,但现在项目中有这个字段,你也不知道你现在做的模块里到底存不存在这个字段,做这个模块之前还要走一遍代码看看究竟有没有它,给开发的流畅性造成了很大困扰。
开发流程:
1.数据库表中增加该字段(使该字段在居民用户表和居民面积表里都有保存,后期增改时字段值的一致需要注意)
alter table SF_JMYH_T add ( MJXZ VARCHAR2(60)); comment on column SF_JMYH_T.MJXZ is '面积性质'; alter table SF_JMMJ_T add ( MJXZ VARCHAR2(60)); comment on column SF_JMMJ_T.MJXZ is '面积性质';
2.项目entity层实体类增加字段及getter&setter方法,hbm映射文件增加映射(这里强调一下,hbm里没有添加映射的话,就不能匹配到数据库的值,做这个功能时,看到实体类里已存在该字段,想当然以为映射里也早就有了映射,结果做完添加功能,数据能保存进数据库,页面上却读取不到)
SfJmyhT.java
/*为保持字段在用户表和面积表里的一致,在添加用户信息时将该字段保存在面积表内,所以在SfJmyhT里引入SfjmmjT,将字段在保存进yh(用户)对象的同时也保存进mj(面积)对象中。 */ private String mjxz; // 面积性质 public String getMjxz() { return mjxz; } public void setMjxz(String mjxz) { this.mjxz = mjxz; } public SfJmmjT getSfJmmjT(){ SfJmmjT mj = new SfJmmjT(); ···· mj.setMjxz(this.mjxz); ···· mj.setXxx(this.xxx); return mj; }
SfJmyhT.hbm.xml
<property generated="never" lazy="false" name="mjxz" type="java.lang.String"> <column length="60" name="MJXZ" /> </property>
节省篇幅,以下主要介绍用户表相关功能的字段添加,面积模块基本一致。
3.页面添加该字段(这个操作也可以放在后台功能完成之后再做,我的习惯是先占好坑,当然在这之前你需要明确你页面上的这个字段将要在后台和数据库匹配哪个对象的哪个属性值,是否只读、什么样式等··· 如果没规划好的话建议先完成后台功能再配置前台对应的字段)
sf_user_add.jsp
<td class="labelCss"> 面积性质: </td> <td class="contentCss""> <select id="mjxz" name="sfjmyh.mjxz" class="easyui-combobox"
data-options="url:'DataAction!getTypeList.action?name=MJXZ',editable:false,lazy:true"> </select> </td>
4.设置js方法(相关保存、修改等功能性的和页面的显示等非功能性的),调用相关功能相关的Action
5.主要配置dao层
UserDaoImpl.java
public Map addUserSave(SfJmyhT sfjmyh, BDXCPageContext context) { ······· Procedure procedure = new Procedure("SF_INS_JMYH_P") .add(sfjmyh.getYhbm()) .add(sfjmyh.getYhkh()) ····· .add(sfjmyh.getMjxz()) // 面积性质 ········; procedure.add(Parameter.getMsg()).add(Parameter.getStatus()); Map result = executeProceduresForMap(procedure); return result;
}
public Map updateUserSave(SfJmyhT sfjmyh, BDXCPageContext context) { String proceduresName = "SF_UPD_JMYH_P"; Map result = null; Object[][] parm = null; parm = new Object[][] { { BDXCStatics.PROCEDURES_TYPE_IN, sfjmyh.getYhbh(), "", "" }, { BDXCStatics.PROCEDURES_TYPE_IN, sfjmyh.getYhbm(), "", "" }, ··· // 面积性质 { BDXCStatics.PROCEDURES_TYPE_IN, sfjmyh.getMjxz(), "", "" }, ···
}; try { result = this.executeProceduresForMapMsg(proceduresName, parm); } catch (BDXCException e) { e.printStackTrace(); logger.error(BDXCUtil.getExceptionString(e)); } return result; }
6.存储过程
SF_INS_JMYH_P
V_MJXZ SF_JMMJ_T.MJXZ%TYPE, --面积性质 ··· IF V_MJXZ IS NOT NULL THEN --面积性质 V_MEMO := V_MEMO || '[面积性质]' || V_MJXZ || ';'; V_SHNR := V_SHNR || ',"面积性质":"' || V_MJXZ || '"'; END IF; ··· SH_INS_JMYH_P(V_YHBM, V_YHKH, V_YHMC, V_QY, V_FGS, V_RY, V_GX, V_RLZ,······ V_MJXZ,··· ···) ···
实现保存用户时将面积相关字段保存进面积表的存储过程在SH_INS_JMYH_P(用户增加存在审核,审核通过后调用该存储过程将信息存入SF_JMYH_T和SF_JMMJ_T表内)
SF_UPD_JMYH_P和SH_UPD_JMYH_P(用户更改相关存储过程)也要修改,这里主要注意以下几点:
(1)存储过程字段顺序应和dao层字段顺序保持一致,避免出错和利于后期维护。
(2)涉及到三个模块(增加、修改、审核)两张表(用户表、面积表)的数据一致性需要注意。
(3)做好注释,便于阅读和其他人维护。
7.页面中的哪个地方需要显示该字段,是否在dao层select并在js中获取且显示等细节性问题
sf_userList_model.js(定义显示列表的方法并提取字段值)
function loadUserList(userListId,url,onClickFun,datagridTitle) { $("#"+userListId).datagrid({ //fit : true, title : datagridTitle ? datagridTitle : "用户基础信息", nowrap: true, border:false, rownumbers:true, autoRowHeight: false, striped: true, singleSelect:true, collapsible:true, url:url, remoteSort: false, showHeader: true, showFooter: true, idField:'YHBH', // sortOrder:"asc", // sortName: "YHBH", frozenColumns:[[ {field:'YHBH',checkbox:true,width:10}, ···· {field:'MJXZ',title:'面积性质',width:100,sortable:true}, ···· }); }
8.面积相关页面及后台及存储过程···