SpringMVC表單資料增刪改查簡易梳理(含例項程式碼)
使用SpringMVC建立表單進行資料的增刪改查是javaEE開發的基本功,本人根據自己最近開發的基於jeecms框架的網站平臺來梳理資料增刪改查的思路。
首先根據所需表單頁面設計資料庫,定義不同欄位的資料型別和長度,若存在多張資料表,還需設計不同表間的對應關係(例如one-to-one,many-to-one,many-to-many等),確定好對應關係(經常為主鍵和外來鍵的對應關係)後,完成實體類和hbm.xml檔案的編寫,至此底層資料庫設計及實體類對應工作完成。
由於jeecms框架採用Hibernate實現上層程式與底層資料庫的資料讀寫,因此DAO層使用的是hibernate框架操作相關函式。下面從action、manager和dao層詳細梳理資料的增刪改查。
1、資料插入
前臺form表單點選提交後,前臺寫入欄位通過表單提交或ajax方式傳遞至後臺,其中form標籤的action屬性中規定了該表單資料處理請求地址。一般後臺controller通過註解@RequestMapping對應相應請求的地址,例如表單中的form標籤如下
<form id="wlwForm" action="${base}/member/selectionwlw.jspx" method="post" enctype ="multipart/form-data" target="_blank">
相應後臺controller的接收函式為(注:函式的引數名稱需與前臺頁面form表單中input標籤的name相對應,引數型別需與後臺實體類和資料庫中相應欄位的型別對應)@RequestMapping(value = "/member/selectionwlw.jspx", method = RequestMethod.POST) public String submitIot(Integer siteId, Integer channelId, Integer modelId//引數省略..............{}
前臺表單提交後,經過Spring分發器,執行對應函式submitIot。在submitIot中,後臺接收到前臺提交的表單資料並將其作為引數傳入在manager層中宣告並實現的save函式中,由manager層完成具體的儲存邏輯。(注:在SpringMVC中manager層和dao層都需要先設計介面,然後設計實現的類。在controller中,通過@autowired自動裝配manager介面對應的bean,之後便可呼叫manager層實現類中設計好的save函式)
cmsSelectionWlwMng.save(member, ip, siteId, channelId, modelId, isSaved,........//引數省略
@Autowired
private CmsSelectionWlwMng cmsSelectionWlwMng;
執行進入manager層的save函式中,首先初始化儲存所需的實體類物件,然後使用set函式將傳入的引數賦值給物件所對應的屬性。將所有屬性賦值完畢後,呼叫dao層的save函式,傳入已經封裝好的例項物件
CmsSelectionWlw wlw=new CmsSelectionWlw();
wlw.setMember(member);
wlw.setIp(ip);
wlw.setSite(cmsSiteMng.findById(siteId));
wlw.setIsSaved(isSaved);
dao.save(wlw);
最後在dao層的save函式中,呼叫hibernate的getSession().save(wlw)方法將一個臨時物件載入到Session的快取中,轉變為持久化物件。提交事務時,Hibernate會生成相應的insert語句,將物件儲存到資料庫中。dao層save函式的具體實現如下。
@Override
public CmsSelectionWlw save(CmsSelectionWlw bean) {
getSession().save(bean);
return bean;
}
至此,我們實現了前臺表單資料插入後臺資料庫的功能。
2、資料查詢
在html頁面中寫入檢視後臺資料的連結,其中請求地址中攜帶需檢視資料記錄的ID值
<a href="selectionwlw_detail.jspx?id=${c.id}&nextUrl=selectionwlw_list.jspx">詳細|</a>
同樣後臺使用requestMapping註解定義相應的action處理函式
@RequestMapping(value = "/member/selectionwlw_detail.jspx")
public String detailIot(Integer id, HttpServletRequest request,
HttpServletResponse response, ModelMap model)
在detailIot函式中,呼叫manager層的findById函式,傳入前臺傳過來的ID值
CmsSelectionWlw cmsSelectionWlw = cmsSelectionWlwMng.findById(id);
而在manager層的findById函式的具體實現中,將id傳入dao層的findById函式並呼叫
@Transactional(readOnly = true)
public CmsSelectionWlw findById(Integer id) {
CmsSelectionWlw entity = dao.findById(id);
return entity;
}
dao層的findById函式負責根據傳入id在資料庫中查詢對應記錄,實現如下
@Override
public CmsSelectionWlw findById(Integer id) {
CmsSelectionWlw entity = get(id);
return entity;}
將查詢獲取到的物件逐層返回到action層,最後在前臺jsp頁面使用EL表示式展示查詢物件的相應屬性值。
<input name="projectName" type="text" value="${wlw.projectName!?html}" class="txt" vld="{required:true}"/>
至此,我們完成了後臺資料庫記錄查詢並返回前臺展示的功能。
3、資料修改
與資料插入類似,資料修改首先需要從前臺表單傳入資料庫對應實體物件的所有引數(包含需修改引數和不需修改引數),並在action層定義相應函式來接收前臺傳輸的引數值。
@RequestMapping(value = "/member/selectionwlw_update.jspx")
public String updateIot(Integer id, Integer siteId, Integer channelId, Integer modelId,
在updateIot函式中呼叫manager層的update函式。
cmsSelectionWlwMng.update(id,user, ip, siteId, channelId, modelId, isSaved,...//引數省略
在manager層的update函式中,同樣初始化一個實體類物件並將所有引數使用set函式封裝進該物件(注:一定要set物件的ID值,不然更新會找不到相應資料記錄而報錯)。物件封裝完畢後呼叫dao層的updateByUpdater函式。
CmsSelectionWlw wlw=new CmsSelectionWlw();
wlw.setId(id);
wlw.setUpdateTime(new Timestamp(System.currentTimeMillis()));
Updater<CmsSelectionWlw> updater = new Updater<CmsSelectionWlw>(wlw);
wlw=dao.updateByUpdater(updater);
在jeecms框架中dao層的updateByUpdater函式只在介面類中宣告,無需在實現類中具體實現。
至此,我們完成了在原有資料基礎上進行相應欄位修改並在資料庫中更新的功能。
4、資料刪除
最後完成資料庫記錄的刪除功能。首先在html頁面設定好請求地址,並將資料記錄的ID值追加在url後傳遞至後臺。
<a href="selectionwlw_delete.jspx?id=${c.id}&nextUrl=selectionwlw_list.jspx">刪除</a>
在後臺action層指定相應刪除函式
@RequestMapping(value = "/member/selectionwlw_delete.jspx")
public String deleteIot(Integer id, HttpServletRequest request,
String nextUrl, HttpServletResponse response, ModelMap model)
在deleteIot函式中呼叫manager層的deleteById(Integer id)函式。
cmsSelectionWlwMng.deleteById(id);
在manager層的deleteById函式中,呼叫dao層的deleteById(Integer id)函式。
wlw=dao.deleteById(id);
在dao層刪除函式的實現中,首先根據傳入的ID值呼叫get(id)查詢資料庫中是否有此ID值對應的物件,如果獲取的物件不為空,則使用getSession().delete()刪除,否則不需做任何操作。
@Override
public CmsSelectionWlw deleteById(Integer id) {
CmsSelectionWlw wlw = get(id);
if (wlw != null) {
getSession().delete(wlw);
}
return wlw;
}
至此,我們完成了根據ID值刪除資料庫對應資料記錄的功能。
表單的增刪改查是後臺操作的基本功,掌握各層間的邏輯關係是我們掌握整個過程的關鍵。有了基本型別欄位增刪改查的經驗,就可以在表單上繼續新增檔案增刪,富文字編輯、表單匯出等功能,這些功能我會在後續部落格中繼續更新,歡迎大家持續關注,批評指正~!