添加字段並顯示
項目上線前夕,功能和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.面積相關頁面及後臺及存儲過程···
添加字段並顯示