李 劍
LI Jian
(南京化工職業技術學院,南京 210048)
隨著保險業管理要求和風險防范意識的增強,通過大量的數據統計,可以分析經營趨勢,為保險行業決策者提供參考。因此,如何在規定的時間段收集保險子公司經營數據并進行統計分析就成了保險行業需要解決的問題。然而,目前保險行業總部依靠各地下屬部門層層上報數據,該方法已經不能適應保險行業對數據及時性的需求。因此,利用先進的JSF-Guice-iBATIS集成框架技術研發保險行業數據統計系統,具有較強的現實意義。
該保險業數據統計系統需求:
1)設定周一至周五的夜間23:30,觸發數據采集程序;
2)該系統數據采集功能將各子公司的經營數據存儲到總部數據庫;
3)總部人員登錄系統后,可以瀏覽總部數據庫的數據,通過應用系統提供的圖形統計方法,進行決策分析。
該保險行業數據統計系統主要模塊功能如下:
1)數據采集模塊:系統每個工作日定時從各地分公司數據庫采集數據到總部數據庫,里面包括定時觸發程序。
2)統計分析模塊:包括瀏覽數據和分析決策兩項功能。其中,瀏覽數據就是指總部人員瀏覽各地分公司經營數據;分析決策就是指總部人員按時間縱向比較、按不同分公司橫向比較,可以對險種銷售數據進行分類,按照不同子公司、按照不同時段進行統計,生成相應折線、柱狀對比圖形。
2.1 系統邏輯結構設計
該保險行業數據統計系統采用JSF- GuiceiBATIS集成框架,如圖1所示。其中,JSF是一個基于Java Web的用戶界面標準,同時又符合MVC模式的Web應用程序框架,它主要作用是將視圖層與模型層分開,解開其中的耦合性;Guice是一個優于Spring的實現控制反轉(IoC)及面向切面編程(AOP)的輕量級框架;iBATIS是以SQL為中心的數據持久層框架。三者共同構成JSF- GuiceiBATIS集成框架。
在圖1中,控制層用JSF框架構建,負責系統用戶界面和控制器,其中C代表控制器FaceServlet,V代表視圖JSP,負責顯示功能,M代表Backing Bean,JSP頁面的數據經簡單處理后,被傳輸給業務層;業務層由Guice框架構建,根據業務邏輯來決定下一步操作;持久層由iBATIS框架構建,負責與數據庫層進行交互。
JSF- Guice- iBATIS集成框架包含對持久性、事務管理、安全性、日志記錄等問題的現成解決方案,同時本身又具有很強的普適性和實用性,從而使開發者在應用該框架技術時,能夠大大提高該保險行業數據統計系統開發的效率。

圖1 JSF-Guice-iBATIS集成框架示意圖
圖1所示的系統邏輯結構能夠更好地遵循Sun J2EE平臺中兩個主要的設計原則:“多層架構,松耦合”。由于采用分層的設計方式,各個模塊功能相互獨立封裝,層與層之間的關聯少,保持松耦合連接,系統的穩定性高,便于擴展和維護。另外,項目中的每一層所采用的技術都是可替換的,例如JSF可以被Struts或者Tapestry等其它的表示層實現框架替換掉,Guice 可以換成Spring框架,iBATIS可以替換成JDO或Hibernate框架。在每個層中都不同程度地應用了J2EE平臺中常用的設計模式,并且使用基于POJO的輕量級架構實現系統中的各個核心的功能組件,從而使得系統易于測試、移植、縮短開發周期。
2.2 系統接口設計
2.2.1 DAO層設計
當開發該保險行業數據統計系統時,利用一個通用API層將實體操作的細節封裝起來。DAO(Data Access Objects)允許程序員通過一個簡單接口的來操作數據,從而屏蔽了具體實現細節。利用DAO,程序員可以動態配置應用程序來訪問不同的實體存儲機制。該保險行業數據統計系統包含復雜的應用,需要用到子公司的數據庫,DAO讓程序員建立一個一致的API,讓系統的其它部分來調用。圖2為本地持久層接口SupdataDao與接口實現類SupdataDaoImpl的類圖。
在圖2中,Filiale類構成了子公司數據表實體模型,而SupdataDao接口調用這個Filiale模型來定義具體的DAO方法,SupdataDaoImpl類則是SupdataDao接口的實現類。SupdataDao接口則調用了Filiale類模型來定義接口的一些方法。

圖2 Filiale模型DAO層類結構圖
2.2.2 業務邏輯層設計
該保險行業數據統計系統業務邏輯層提供統一的Facade接口,前臺Web層僅僅調用這個Facade接口,這樣,Web層與后臺耦合非常松散,即使替換整個Web層也較容易。
圖3為該保險行業數據統計系統業務邏輯結構示意圖。

圖3 該系統業務邏輯結構示意圖
在圖3中,業務層處在DAO層之外,除負責該保險行業數據統計系統業務處理外,還通過DAO層管理業務邏輯到持久層實現、提供與其它層交互接口、管理業務對象之間依賴關系及管理事務。
圖4為子公司Filiale模型Service層類關系圖。在圖4中,FilialeServiceImpl類實現了接口FilialeService所定義的方法,并且調用了FilialeDao接口,而FilialeService接口則引入了Filiale對象模型。這里調用的是FilialeDao接口,不是調用的FilialeDao接口實現類。調用FilialeDao接口而不關注具體的實現類FilialeServiceImpl的好處,就是研發人員修改某一實現類的時候不需修改調用層的代碼,降低了該保險行業數據統計系統的開發復雜性。

圖4 Filiale模型Service層類關系圖
在系統需求分析與總體設計的基礎上,完成系統詳細設計與實現,這部分內容包括公共類設計、系統持久層實現、數據自動采集功能實現、統計分析功能實現以及系統關鍵問題解決方案,限于篇幅,下文著重闡述后三部分。
3.1 數據自動采集功能實現
3.1.1 控制器組件實現
該保險行業數據統計系統數據采集模塊沒有視圖層,控制器FacesServlet也無需另外開發,但需要在web.xml文件和faces-config.xml兩個配置文件中進行定義。
3.1.2 Service層組件實現
在該保險行業數據統計系統開發過程中,業務層,根據圖3該系統業務邏輯結構示意圖可以看出,該層最容易出現與其它層緊耦合現象。例如,該層與持久層的交互的處理、事務的管理。在該保險行業數據統計系統中,利用Guice作為業務層來解決這類問題。其中包括業務層接口FilialeService、業務層接口實現類FilialeServiceImpl。
業務層接口FilialeService包括以下方法聲明:
1)獲取持久層插入數據方法insertData(Filiale Filiale);
2)獲取持久層遍歷xuzhoudata、zhenjiangdata等各保險分公司數據庫的方法selectXuZhouData()、selectZhenJiangData();
業務層接口實現類FilialeServiceImpl類實現了接口FilialeService所定義的方法,并且調用了FilialeDao接口,而FilialeService接口則引入了Filiale對象模型。
關于接口類FilialeService與其實現類FilialeServiceImpl之間的綁定在“4.3.4 業務模塊綁定問題”中闡述。
3.1.3 DAO層組件實現
SupDataDao接口類接受業務層接口實現類FilialeServiceImpl的調用,進行持久化操作。具體包括以下方法:
1)向保險總公司數據庫插入信息insert
Data();
2)遍歷xuzhoudata、zhenjiangdata、…、taizhoudata等各保險分公司數據庫的方法:selectXuZhouData()、selectZhenJiangData()、
…、selectTaiZhouData();
SupDataDaoImpl繼承SqlMapClientDaoSupp
ort,是接口類SupDataDao的實現類,使用Ibatis進行持久化操作。在Filiale模型DAO層類結構中,Filiale類構成了實體模型,而FilialeDao接口調用這個Filiale模型來定義具體的DAO方法,FilialeDaoImpl類則是FilialeDao接口的實現類。
關于接口類FilialeDao與其實現類FilialeDaoImpl之間的綁定在“4.5.4 業務模塊綁定問題”中闡述。
3.2 統計分析功能實現
保險公司總部人員每天一上班,就可以登錄系統,查看每一個子公司的數據險種銷售經營額,并可進行按照日、月、年對各個子公司進行分析,統計分析圖形顯示借助插件JFreeChart完成。
3.2.1 各分支機構數據及統計結果展示
各分支機構數據及統計結果展示手段包括各分公司保險日經營額匯總顯示以及任意時間段經營額統計。
3.2.2 各分支機構數據圖形化比較
在該保險行業數據統計系統中,對于圖的表示方法,柱狀圖表示業績,其中的每一個柱表示實際的業績,用數值表示;線狀圖用來表達趨勢,通常按時序排列其中的點,每個點對應的值也是實際業績,用數值表示。下面利用JFreeChart生成統計結果圖表。
前面從數據庫中取出了連續一段時間每天的經營額,并保存在MNPeriodsale對象中。MNPeriodsale是由JFreeChart提供的輔助類,用來生成統計報表。JFreeChart是開放源代碼Java項目,它主要用來生成各種各樣的圖形。
1)使用ChartFactory來創建時間序列的折線圖標對象
日經營額統計調用的dayTurnover方法。該方法首先獲得要統計日經營總額,調用TurnoverHandle的getDayTurnover方法從數據庫中獲取數據集,并將數據集保存在request對象中。處理完畢后,流程轉向頁面day.jsp。視圖頁面首先從request對象中取出數據集,然后調用ChartHandle的generateZizagChart方法來生成圖形,最后將圖形展示在界面上。
2)使用ChartFactory來創建時間序列的柱狀圖標對象
通過統計最近幾個月每月的經營額,可以從較大的時間段上反映經營額變化情況。對于這些數據的比較與分析,保險公司決策層可以采取更有效的措施刺激保險業績的增長。
getMonthTurnover方法用于獲取當月在內,前幾個月的保險營銷額,并保存到數據集中返回,供JfreeChart調用。其中參數count為要統計多少月的數據,結果集中包含前count月每月的經營總額。
用柱狀圖來描述每月的保險總額,主要實現過程是使用ChartFactory創建柱狀JfreeChart。
3.3 關鍵問題解決方案
3.3.1 讀取多數據源問題
該保險行業數據統計系統iBATIS配置文件中分公司數據庫配置文件分別為farData1.xml、farData2.xml、分公司數據庫映射文件distanceData.xml、字段配置文件column.properties、分公司數據表查詢條件配置文件farTable.xml。
在該保險行業數據統計系統中,讀取分公司的數據源的步驟如下:
1)設定查詢條件,本應用中的查詢條件設定為:xuzhouid=1與zhenjiangid=2,……
2)利用ParameterColmn類,讀取字段配置文件column.properties,獲得資源數據庫表名稱和字段信息。
3)利用ParseFarXml類解析分公司數據查詢條件farTable.xml。
4)根據Guice容器加載的filepath文件獲得資源數據庫iBATIS客戶端(一共得到兩個客戶端實例:farData1、farData2)。
5)設定臨時文件,存儲查找的數據,供應用程序DistanceDataRowHandler.java解析,轉存到ArrayList中。
3.3.2 自動采集過程觸發器問題
Quartz是輕量級的組件,能夠用來完成J2EE應用中的定時操作。簡單的來說,Quartz把一個定時事件分成Job(任務)及Trigger(觸發器)兩個模塊,Job用于定義工作內容,Trigger用于定義觸發條件,也就是定義任務開始的時間。
關鍵代碼為:
CronTrigger cTrigger = new CronTrigger
("myTrigger",Scheduler.DEFAULT_GROUP,"0 30 23 ? * MON-FRI");
利用上述代碼,就可實現從周一到周五每天晚上的23點30分觸發保險公司總部應用系統,完成從分公司數據源進行數據采集。
3.3.3 數據采集程序
在該保險行業數據統計系統中,數據采集涉及到的程序是DistanceDataRowHandler類、DistanceDataTrigger類、DistanceDataTrigger
Impl類。下面分別闡述。
1)開發DistanceDataRowHandler類
這一步建立查詢工具,將得到的數據存到ArrayList對象中,開發的具體類名稱為DistanceDataRowHandler類,在這個類中,重寫iBATIS的RowHandler方法,利用iBATIS的客戶端進行數據查詢。查詢分公司數據庫數據過程為:首先使用組裝好的查詢條件SQL語句,然后將得到的數據重新組裝成完整的插入語句,最后將這些插入語句整體存儲在List中。
2)開發DistanceDataTrigger類、Distance DataTriggerImpl類
首先查找分公司數據庫,然后利用查詢工具DistanceDataRowHandler類將得到的數據存儲到總部數據庫中,開發的類為DistanceDataTrigger、DistanceDataTriggerImpl,前者是接口,后者是該接口的實現類。
3.3.4 業務模塊綁定問題
1)該保險行業數據統計系統綁定類Bind類在該保險行業數據統計系統中,業務層的綁定利用Guice解決。
在工程根目錄下新建一個繼承AbstrctModule的Bind類,此類中的configure()方法用來將所有的接口和實現類綁定。主要代碼如下:

通過以上程序,將DistanceDataTriggerImpl、FilialeDaoImpl 、FilialeServiceImpl等實現類與DistanceDataTrigger、FilialeDao、FilialeService等接口類實現綁定。
然后,在當前當前目錄下新建一個類Injectors,用Injectors類將Binds類中的綁定進行注入。這樣,就可以使用Injectors類中的Injecting方法來調用Binds類的注入了。
2)該保險行業數據統計系統業務層具體工作過程
下面討論該保險行業數據統計系統業務層具體工作過程。
1)Guice啟動時的流程
Guice在該保險行業數據統計系統是如何工作的,首先來看Guice對接口FilialeService及其實現類FilialeServiceImpl之間的綁定過程。
在該保險行業數據統計系統中,利用Guice進行接口綁定序列圖如圖5所示。

圖5 該系統使用Guice進行接口綁定序列圖
(1)根據該保險行業數據統計系統業務需求定義業務接口及其實現類。
(2)定義接口FilialeService的實現類FilialeServiceImpl,并覆蓋模塊FilialeService接口中configure方法,同時利用Binder類完成具體綁定。Binder類的具體實現在“4.5.3 數據采集程序”小節“3.業務模塊綁定問題”詳細闡述。
(3)調用com.google.inject包中的Guice類,利用此類的createInjector方法來完成注入。
(4)用“Guice.createInjector(new Bind()).getInstance(FilialeService)”調用綁定接口FilialeService,完成接口FilialeService與實現類FilialeServiceImpl的依賴注入。
2)Guice的運行
在該保險行業數據統計系統中,利用啟動階段創建的注入器(Guice.createInjector())注入對象并內省綁定(將FilialeServiceImpl與FilialeService)。Guice運行時的模型由一個可管理一定數量綁定的注入器(Injector)組成。由Injector調用綁定類,這樣調用接口FilialeService就等于調用FilialeServiceImpl。
該保險業數據統計系統采用JSF-Guice-iBATIS集成框架構建。其中,JSF作為表示層框架,Guice作為業務層框架,iBATIS作為持久層框架。在開發過程中,通過Guice提供的依賴注入,結合靈巧的iBATIS持久化框架和動態的XML解析,再將Guice的受管Bean注入到JSF的后臺Bean中,實現了這三者的結合,達到保險行業數據統計系統良好的復用目的,使系統的開發變得更加容易。與同類系統相比,該保險業數據統計系統具有以下優勢:
4.1 JSF框架backing bean模式的應用
在進行JSF頁面開發的過程中,對于每一個JSF頁面,其后臺都應有一個JavaBean與其對應。頁面中要顯示的信息和要輸入的信息都綁定到后臺JavaBean的屬性上,在進行顯示或請求提交時,JSF框架會自動調用與該屬性相對應的get或set方法。
4.2 JSF與Guice的集成
由于JSF和Guice都支持IoC,因此在開發過程中,可以通過配置文件將Guice的受管Bean注入到JSF的后臺Bean中,實現JSF和Guice的完美結合。
4.3 Guice動態注入的使用
Guice把業務邏輯層組件之間的依賴關系通過Guice容器來管理,動態注入,提高了靈活性和運行效率,達到系統組件良好的復用目的。而且,Guice容器保證把代碼修改和配置文件修改同步。
4.4 數據訪問層采用iBATIS框架
數據訪問層采用iBATIS Database Layer框架,在分公司數據庫結構不同情況下,易于維護。另外,與Hibernate框架相比,降低了開發難度,提高開發效率。
4.5 數據層多數據源的使用
因為該保險行業數據統計系統數據采集來源屬于不同的分公司,因此,在設計中,數據層采用多數據源的方式,也可有效提高系統的水平伸縮性。
4.6 面向接口編程
在數據層設計過程中,分為SQL Maps和DAO層。在DAO層設計過程中,采用接口與實現分離的方式,并通過對象關系模型分析DAO層類關系。這種方式在業務層設計過程中同樣采用,使系統層次更加清晰,便于維護。
4.7 利用插件quartz實現觸發器
在該保險行業數據統計系統中,利用Quartz解決定時觸發問題,并針對該保險行業數據統計系統數據定時采集特殊需求,比較了Quartz中三種觸發器功能,最后利用CronTrigger解決問題。
4.8 模型差異
從MVC角度來看,同類系統視圖層采用Struts框架,其中ActionForm模型必須繼承框架類,這樣導致程序緊耦合。該保險行業數據統計系統采用的JSF框架,將Struts框架中的ActionForm組件和業務控制器Action組件合并成一個Backing Bean組件,Backing Bean組件屬于POJO,不需要繼承框架類,顯得比較靈活。
4.9 使用JFreeChart完成圖形分析
借助JFreeChart來實現保險公司經營額時間序列的折線圖、柱狀圖,完成各分支機構數據及統計結果表格展示,可以直觀地反映經營額變化情況,便于保險公司決策層采取更有效的措施刺激保險業績的增長。
應用該保險業數據統計系統,能夠極大地提高數據統計效率,以往需要層層上報數據進行匯總的統計方式,現在完全由該保險業數據統計系統自動完成,提高了數據統計的準確性和及時性。
該保險業數據統計系統將有關分公司數據整合起來,對分支機構數據進行綜合分析,將數據轉化為有用信息,便于管理層關注數據的地區及不同時段的差異性,為保險公司產品開發、客戶服務提供可靠的依據。
該保險業數據統計系統便于保險公司積累成功實施經驗,保險營銷管理流程得到進一步優化,為保險企業規避風險提供了保障;數據集中和圖形分析為保險公司管理水平的提升奠定了基礎,促使保險公司從傳統粗放型的管理向精細化管理邁進。
[1]孟平揚.淺析中國保險的社會管理功能[J].技術與市場,2009,(1):21-21.
[2]梁遠航,齊琳琳.我國保險行業協會自律的反思與完善[J].財經科學,2009,(6):40-46.
[3]余香.淺談我國保險營銷模式的創新[J].福建商業高等專科學校學報,2009,(1):33-36.
[4]曹紅欣.我國保險營銷制度改革探討[J].管理觀察,2009,(13):44-45.
[5]白兆華,張峰.軟件保險問題中動態加密的研究[J].科技信息,2009,(16):202-205.
[6]胡玉琴.中國養老保險制度改革中性別利益的精算分析[J].統計與信息論壇,2009,(5):63-67.
[7]張曉婷,程耕國,鮑考明.基于JSF框架的化驗室管理系統的設計[J].計算機工程與設計,2009,(9):2289-2292.
[8]朱佳.JSF技術在基金管理系統中的應用與分析[J].科技資訊,2009,(10):18-20.
[9]雷沖,廉迎戰.JSF框架的研究及其應用[J].網絡安全技術與應用,2009,(5):69-70.
[10]彭勝,劉衛國.基于JSF定制生命周期的AjaX組件開發[J].計算機應用,2009,(7):1764-1766.
[11]北京皓辰網域網絡信息技術有限公司.http://publish.itpub.net/zt/guice/[EB/OL/].Guice輕量級框架學習專題,2006-07-05.
[12]北大青鳥.Google Guice [EB/OL/].http://www.bdaccp.com/xw/news_view.asp?newsid=1211,2008-6-8.
[13]yiketree.Guice與Spring框架的區別[EB/OL/].http://hi.baidu.com/yiketree/blog/item/351d4301da27ded1277fb5d2.html,2008-12-10.
[14]scansoft.Guice[EB/OL/].http://baike.baidu.com/view/890473.htm?fr=ala0_1,2009-11-15.
[15]章文躍.在J2EE持久層中用Spring+iBATIS實現Webwork開發[J].福建電腦,2009,(5):172-173.
[16]李澎林,朱國清,吳斌.基于iBatis SQL Map的數據持久層實現應用研究[J].浙江工業大學學報,2008,(1):72-76.[17]馮浩.基于Struts與iBatis框架的Web開發在國稅部門的應用研究[J].科技情報開發與經濟,2007,(34):212-14.
[18]邢波.用ibatis提升一類數據庫檢索查詢的性能[J].計算機應用與軟件,2007,(12):205-207.
[19]王付強,方麗娜.基于MVC和Ibatis的Web開發研究[J].新鄉師范高等專科學校學報,2007,(5):58-61.
[20]田秋艷,王蕾,吳慶,等.基于JSF+Spring+Hibernate架構的教學資源共享平臺[J].長春工業大學學報,2009,(3):337-340.
[21]孫華林.基于JSF-Spring-Hibernate架構的研究與應用[J].信息技術,2009,(5):208-211.