唐 權(quán)
(四川職業(yè)技術(shù)學(xué)院,遂寧 629000)
SSM(Spring+SpringMVC+Mybatis)框 架 是一個非常優(yōu)秀的Java EE輕量級框架,應(yīng)用于Java EE企業(yè)級項目的開發(fā)中,成為當前主流Web應(yīng)用程序開發(fā)框架。在Web應(yīng)用項目中數(shù)據(jù)維護是基礎(chǔ)性工作,具有非常重要的作用,也是工作量較大的環(huán)節(jié),主要包括對數(shù)據(jù)的查詢、增加、刪除與修改。項目開發(fā)中如何減輕這些工作量,實現(xiàn)方式與標準統(tǒng)一,節(jié)省開發(fā)時間,提高工作效率具有重要的作用。本文就數(shù)據(jù)維護中的條件分頁查詢,把PageHelper技術(shù)整合到SSM框架中,對SSM框架以最小的侵入,實現(xiàn)快速分頁查詢。
SSM框架包括三個部分,分別是Spring技術(shù)、SpringMVC技術(shù)、Mybatis技術(shù)。Spring技術(shù)是整個框架的核心,通過Spring依賴注入模式,把SpringMVC與MyBatis框架整合在一起。其中SpringMVC主要實現(xiàn)模塊的 MVC(Model View Controller)功能,負責(zé)把用戶的請求根據(jù)映射關(guān)系提交到對應(yīng)的控制器;MyBatis實現(xiàn)數(shù)據(jù)訪問層的功能,通過ORM映射與數(shù)據(jù)庫進行數(shù)據(jù)交互,讀取數(shù)據(jù)庫的數(shù)據(jù)或保存數(shù)據(jù)實現(xiàn)數(shù)據(jù)持久化;業(yè)務(wù)邏輯層也叫服務(wù)層,實現(xiàn)應(yīng)用程序的業(yè)務(wù)邏輯,向上給控制層的提供服務(wù),向下調(diào)用數(shù)據(jù)訪問層和數(shù)據(jù)庫進行數(shù)據(jù)交互。SSM框架整合后數(shù)據(jù)查詢業(yè)務(wù)流程各模塊對象序列圖如圖1所示。
第一.用戶通過Browser發(fā)送查詢請求,被SpringMVC框架的DispatcherServlet攔截,通過請求映射關(guān)系,轉(zhuǎn)到對應(yīng)的控制器Con
圖1 SSM整合框架查詢業(yè)務(wù)序列圖
第二.Controller根據(jù)請求的url找到對應(yīng)的處理方法,在方法中調(diào)用服務(wù)層Service對應(yīng)的方法查詢數(shù)據(jù)。
第三.Service層查詢數(shù)據(jù)方法又去調(diào)用數(shù)據(jù)訪問層Dao層對應(yīng)的數(shù)據(jù)查詢接口。
第四.Dao層接口最終通過MyBatis提供的ORM映射,在數(shù)據(jù)庫中完成查詢業(yè)務(wù),并返回查詢結(jié)果對象信息。
第五.根據(jù)各層對象的調(diào)用關(guān)系,最終會把查詢結(jié)果封裝在對象列表中,返回到控制層Controller,最終到瀏覽器顯示查詢結(jié)果。
本節(jié)將以用戶管理實例來展現(xiàn)條件查詢業(yè)務(wù)的在SSM框架中具體實現(xiàn)過程,其中用戶的數(shù)據(jù)結(jié)構(gòu)是User(id,name,password,department)。
Dao層的實現(xiàn)包括三個過程,其一編寫User對象用來封裝查詢用戶信息,其二是編寫數(shù)據(jù)查詢訪問接口,其三是配置接口映射文件實現(xiàn)接口的中數(shù)據(jù)查詢。
第一.創(chuàng)建User類:根據(jù)用戶表的信息及字段,定義用戶對象User類及其屬性和getters、setters方法,為了簡便可以把字段名與對象的屬性名定義成相同名字。
第二.創(chuàng)建用戶條件查詢接口:創(chuàng)建用戶接口類 UserDao,定義查詢接口findUserList,其中返回值為User對象列表,查詢參數(shù)也是User封裝的查詢用戶各字段的屬性值。
第三.創(chuàng)建配置接口映射文件:創(chuàng)建映射文件UserDao.xml,其中namespace屬性與接口類名稱對應(yīng),select元素對應(yīng)執(zhí)行查詢sql語句,id屬性對應(yīng)接口查詢用戶方法名,parameterType對應(yīng)接口方法中參數(shù)類型,resultType屬性對應(yīng)查詢返回結(jié)果類型。MyBatis框架會通過ORM映射把查詢結(jié)果的記錄轉(zhuǎn)換成User對象放在列表中。接口方法的參數(shù)User中封裝查詢條件,通過if子句測試每一個查詢條件,如何不為空就加入到查詢條件的sql語句中,關(guān)鍵代碼如下:
Service層也叫業(yè)務(wù)邏輯層,在服務(wù)層創(chuàng)建服務(wù)類UserService,注入數(shù)據(jù)訪問層UserDao接口,定義服務(wù)層查詢業(yè)務(wù)的方法find-UserList,在方法中調(diào)用數(shù)據(jù)訪問層UserDao的用戶查詢接口實現(xiàn)數(shù)據(jù)查詢,返回結(jié)果為User對象列表供控制層調(diào)用。主要實現(xiàn)代碼如下:
關(guān)鍵說明:
(1).@Service注解是表示服務(wù)類會被Spring框架掃描并裝配成Bean對象;
(2).@Transactional注解表示在服務(wù)層所有的方法都會被納入SSM框架的事務(wù)管理器管理,保證服務(wù)層方法的原子性;
(3).@Autowired注解表示服務(wù)層類對數(shù)據(jù)訪問層接口UserDao的依賴性,框架會通過類型自動裝配成Bean并注入到當前類的Bean中。
SSM框架中的Controller層由程序員開發(fā),通過SpringMvc框架的DispathcerServlet處理把客戶請求轉(zhuǎn)到控制層,其關(guān)鍵代碼如下:
關(guān)鍵代碼說明:
(1)@Controller注解表示該控制層類被Spring框架掃描裝配成控制器的Bean對象;
(2)@Autowired按類型裝配服務(wù)層的userService為Bean對象,自動注入到控制器;
(3)@RequestMapping注解表示查詢用戶的url映射為findUserList,即瀏覽器發(fā)出的以findUserList為后綴的請求會映射到當前控制器的findUserSeletive方法進行處理。
(4)findUserSelective方法的參數(shù)map封裝方法查詢結(jié)果數(shù)據(jù)到表示層;參數(shù)user封裝的查詢條件信息,供查詢使用。
(5)通過返回字符串“findUserSelective”,SpringMVC框架會解析到指定路徑下對應(yīng)的Jsp頁面顯示查詢結(jié)果。
圖2 條件查詢結(jié)果
表示層用于顯示查詢結(jié)果數(shù)據(jù),主要包括條件查詢表單與查詢結(jié)果顯示兩部分。
查詢表單封裝查詢關(guān)鍵字段,為了方便查詢參數(shù)自動封裝成user對象,要求表單查詢條件輸入項的name屬性與User類的屬性名相同,表單提交后就會自動封裝到成user對象,作為控制層的輸入?yún)?shù)。查詢結(jié)果通過標簽庫〈c:forEach items="${lists}"var="user"〉把控制器map參數(shù)中的列表lists通過EL表達式${lists}循環(huán)取出來存放在變量user中,然后再通過EL表達式${user.id}、${user.name}、${user.department}等方式在表格中顯示出來。通過以上各層的操作,能夠正確在SSM框架中實現(xiàn)數(shù)據(jù)的條件查詢業(yè)務(wù),執(zhí)行結(jié)果如圖2所示。
上節(jié)的SSM框架實現(xiàn)了條件查詢業(yè)務(wù),但是還沒有完成分頁功能,如果查詢結(jié)果數(shù)據(jù)量較大,必須進行分頁操作,就是在SSM框架上整合MyBatis的分頁插件PageHelper,快捷實現(xiàn)查詢數(shù)據(jù)分頁功能。
MyBatis的分頁插件包括兩個軟件包,分別是pagehelper-4.1.4.jar與jsqlparser-0.9.5.jar。不同的版本號可以通過網(wǎng)絡(luò)平臺下載,下載后導(dǎo)入到項目的WEB-INF下的lib文件夾中,然后在SSM框架的MyBatis-config.xml文件中進行插件配置。
配置文件中兩個最主要點必須配置:其一是通過“interceptor”屬性在框架中引入Page-Helper插件類;其二是通過屬性"dialect"配置底層數(shù)據(jù)庫的類型,本文項目中使用的是mysql數(shù)據(jù)庫。其它屬性是對分頁其它功能進行規(guī)范可參考說明文檔進行選擇配置。
配置好分頁插件后就是在項目中使用插件完成分頁工作,該項工作主要集中在控制層與表示層兩個方面。
(1)控制層分頁實現(xiàn):控制層查詢方法處作如下改變:其一是修改控制層查詢方法中的參數(shù),加入頁號pageNum與頁面記錄數(shù)pageSize;其二是在執(zhí)行查詢之間加入PageHelper.startPage(pageNum,pageSize)語句;其三是把查詢結(jié)果封裝成分頁信息PageInfo對象;其四是通過map參數(shù)封裝查詢條件與分頁信息到表示層,主要代碼如下:
(2)表示層的實現(xiàn):表示層改變主要是在表格下面增加分頁控件,并綁定分頁請求地址和請求參數(shù),分頁請求地址與查詢地址相同,分頁請求參數(shù)包括查詢條件與頁面信息,查詢條件從返回的map對象的user屬性中讀取,頁面參數(shù)通過返回的PageInfo對象成員中獲取。其中PageInfo包含 了 成 員 有 :firstPage、prePage、nextPage、lastPage、pages、total 等,分別封裝了首頁、前一頁、下一頁、最后頁的頁號和頁面總數(shù)、記錄總數(shù)可以作為頁面導(dǎo)航的參數(shù)。如:下一頁的導(dǎo)航請求可寫為 〈a href="findUserList?pageNum=${page.nextPage}&pageSize=${page.page-Size}&id=${user.id}&name=${user.name}&department=${user.department}〉 下一頁〈/a〉這樣的形式。
通過控制層與表示層的簡單改變,就可以簡潔實現(xiàn)數(shù)據(jù)的條件查詢分頁任務(wù),而且不會改變服務(wù)層與數(shù)據(jù)訪問層的任何代碼,以最小的侵入完成了條件查詢分頁功能,分頁后的效果如圖3所示。
圖3 分頁條件查詢結(jié)果
本文應(yīng)用于SSM框架,從數(shù)據(jù)訪問層、服務(wù)層、控制層、表示層來構(gòu)建了表單查詢功能的實現(xiàn)過程,并在此基礎(chǔ)上加入MyBatis的分頁插件PageHelper,通過對控制層與表示層的簡單的改造,快速實現(xiàn)了數(shù)據(jù)維護中的綜合查詢分頁功能,為實際的項目開發(fā)過程提供了一種較的解決方案。