国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Java EE數(shù)據(jù)初始化應(yīng)用中的設(shè)計(jì)模式解決方案①

2019-04-29 08:59:06歐陽(yáng)宏基
關(guān)鍵詞:設(shè)計(jì)模式對(duì)象數(shù)據(jù)庫(kù)

歐陽(yáng)宏基,葛 萌

(咸陽(yáng)師范學(xué)院 計(jì)算機(jī)學(xué)院,咸陽(yáng) 712000)

數(shù)據(jù)初始化是任何一個(gè)應(yīng)用系統(tǒng)運(yùn)行其業(yè)務(wù)邏輯的基礎(chǔ).初始化的數(shù)據(jù)一般都是基礎(chǔ)數(shù)據(jù),由當(dāng)前應(yīng)用系統(tǒng)的需求分析而確定.一部分?jǐn)?shù)據(jù)需要自行定義,一部分可能來(lái)自于和當(dāng)前系統(tǒng)相關(guān)的其他業(yè)務(wù)系統(tǒng).初始化的數(shù)據(jù)通常在系統(tǒng)正式上線運(yùn)行前或者運(yùn)行時(shí)添加到數(shù)據(jù)庫(kù)中,是應(yīng)用系統(tǒng)中其他業(yè)務(wù)數(shù)據(jù)賴以生存的前提,因此每一個(gè)系統(tǒng)都必須執(zhí)行數(shù)據(jù)初始化的操作.目前,常見(jiàn)的數(shù)據(jù)初始化操作方法有兩種:一種是為系統(tǒng)各模塊提供數(shù)據(jù)添加操作,通過(guò)用戶手工方式逐條錄入所需要的數(shù)據(jù),該方法適合規(guī)模較小、基礎(chǔ)數(shù)據(jù)量少的系統(tǒng)[1].第二種方法是通過(guò)數(shù)據(jù)庫(kù)第三方工具(例如MySQL 數(shù)據(jù)庫(kù)的SQLyog、Navicat 等)將存儲(chǔ)在Excel、XML、HTML 等文件中或者是其他信息系統(tǒng)數(shù)據(jù)庫(kù)中的相關(guān)數(shù)據(jù)批量導(dǎo)入到當(dāng)前應(yīng)用中,該方法適合規(guī)模、數(shù)據(jù)量較大的系統(tǒng),但是在操作過(guò)程中也必須單表逐個(gè)導(dǎo)入.無(wú)論采用上述哪種方法,用戶在操作時(shí)必須按照一定的順序,尤其是基礎(chǔ)數(shù)據(jù)之間存在較復(fù)雜依賴關(guān)系的請(qǐng)求下,無(wú)疑增加了用戶操作的復(fù)雜度,影響了用戶的操作體驗(yàn).

針對(duì)上述問(wèn)題,在研究建造者模式、策略模式以及單例模式的前提下,提出一種新的數(shù)據(jù)初始化方法,該方法在系統(tǒng)運(yùn)行前自動(dòng)讀取存儲(chǔ)在外部相關(guān)文件中的數(shù)據(jù)并保存到當(dāng)前應(yīng)用的數(shù)據(jù)庫(kù)中,避免了手動(dòng)操作的繁瑣.以高等院校目標(biāo)考核管理系統(tǒng)中的數(shù)據(jù)初始化操作為例,分析了各部分的初始化數(shù)據(jù)以及順序問(wèn)題.以Excel 文件作為數(shù)據(jù)初始化前的載體,利用JXL、JDBC 和Hibernate 作為混合數(shù)據(jù)持久化技術(shù)完成了數(shù)據(jù)的初始化操作,詳細(xì)闡述了上述各設(shè)計(jì)模式的具體實(shí)現(xiàn)過(guò)程,為數(shù)據(jù)初始化操作提供了一定的參考.

1 相關(guān)技術(shù)

設(shè)計(jì)模式(design pattern)是面向?qū)ο蠹夹g(shù)中被精心編制的接口與類的組合,在特定的應(yīng)用場(chǎng)景中使用特定的模式可以獲得結(jié)構(gòu)清晰、易于擴(kuò)展和理解的代碼結(jié)構(gòu)[2,3].建造者模式(Builder Pattern)屬于創(chuàng)建型模式的一種,主要用于將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,向用戶屏蔽復(fù)雜對(duì)象組成部分的創(chuàng)建細(xì)節(jié)[4].單例模式(singleton pattern)也屬于創(chuàng)建型模式,主要用于約束某個(gè)類的對(duì)象只能被實(shí)例化一次.策略模式(strategy pattern)屬于行為型模式,該模式通常將某個(gè)行為的不同實(shí)現(xiàn)方式定義為某個(gè)單獨(dú)的類,允許調(diào)用端根據(jù)特定情況更換行為的實(shí)現(xiàn)方式[5].

基于Java EE 平臺(tái)的應(yīng)用系統(tǒng)通常利用JDBC 或Hibernate 技術(shù)進(jìn)行關(guān)系型數(shù)據(jù)庫(kù)的訪問(wèn).JDBC 通過(guò)Connection、Statement、ResultSet 等接口執(zhí)行原生SQL 語(yǔ)句操作數(shù)據(jù)庫(kù)[6];Hibernate 是ORM 協(xié)議的具體實(shí)現(xiàn),對(duì)JDBC 進(jìn)行了輕量級(jí)封裝,以映射文件或注解為基礎(chǔ)實(shí)現(xiàn)對(duì)象模型與數(shù)據(jù)庫(kù)表的映射,并且自動(dòng)管理對(duì)象與對(duì)象之間的關(guān)聯(lián)關(guān)系[7].Hibernate 提供了Configuration、SessionFactory、Session、Transaction和Query 和Criteria 等6 個(gè)核心接口對(duì)持久化對(duì)象進(jìn)行存儲(chǔ)和事務(wù)控制,交互過(guò)程如圖1所示.其中,Configuration 負(fù)責(zé)讀取配置文件并創(chuàng)建SessionFactory;SessionFactory 是重量級(jí)組件采用了單例設(shè)計(jì)模式,在啟動(dòng)時(shí)創(chuàng)建全局唯一對(duì)象并常駐內(nèi)容,主要用來(lái)管理Session 對(duì)象和部分緩存數(shù)據(jù).Session 對(duì)象代表了一條與數(shù)據(jù)庫(kù)的連接,用來(lái)創(chuàng)建Query 或Criteria 對(duì)象.Query 或Criteria 負(fù)責(zé)執(zhí)行HQL 語(yǔ)句,在Transaction 的管理下利用映射文件實(shí)現(xiàn)持久化對(duì)象與數(shù)據(jù)庫(kù)的交互[8].

圖1 Hibernate 核心接口交互圖

2 數(shù)據(jù)初始化

2.1 數(shù)據(jù)初始化的順序

Java EE 應(yīng)用的初始化過(guò)程中會(huì)涉及眾多的對(duì)象,他們之間必然存在復(fù)雜的關(guān)聯(lián)關(guān)系.通過(guò)ORM 將這些對(duì)象保存到數(shù)據(jù)庫(kù)中,并維持之間的外鍵關(guān)系,就必須考慮初始化的順序問(wèn)題.例如在采用BRAC 模型實(shí)現(xiàn)的權(quán)限管理系統(tǒng)中,權(quán)限、角色和用戶三者存在著關(guān)聯(lián)關(guān)系[9].角色關(guān)聯(lián)權(quán)限,用戶關(guān)聯(lián)角色,首先應(yīng)初始化權(quán)限數(shù)據(jù),再初始化角色數(shù)據(jù),最后初始化用戶數(shù)據(jù).因此,當(dāng)對(duì)象的關(guān)聯(lián)關(guān)系之間具有先后順序時(shí),需要先保存被關(guān)聯(lián)的對(duì)象數(shù)據(jù).

2.2 基于設(shè)計(jì)模式的數(shù)據(jù)初始化方法

綜合應(yīng)用單例、建造者、策略設(shè)計(jì)模式的數(shù)據(jù)初始化模型類圖關(guān)系如圖2所示.其中,SysData、SysData Builder、SysDataExcelBuilder 和SysDataDirector構(gòu)成建造者模式.SysData 表示產(chǎn)品,定義所有要初始化的數(shù)據(jù);SysDataBuilder 表示抽象建造者,SysData ExcelBuilder 表示具體建造者;SysDataDirector 表示指揮者,其中的construct()方法控制初始化數(shù)據(jù)的順序.JDBCUtil 為單例設(shè)計(jì)模式,該類的主要作用有兩個(gè),①封裝加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)、創(chuàng)建數(shù)據(jù)庫(kù)連接和釋放資源;② 創(chuàng)建和刪除數(shù)據(jù)庫(kù).SysInit、InitStrategy 和ConcreteStrategy 構(gòu)成策略模式.SysInit 為環(huán)境類、InitStrategy 為策略接口,ConcreteStrategy 為具體初始化策略,包括開(kāi)發(fā)階段的初始化策略和系統(tǒng)部署上線運(yùn)行階段的策略.

圖2 數(shù)據(jù)初始化方法類圖

3 在高等院校目標(biāo)考核系統(tǒng)中的應(yīng)用

目標(biāo)考核系統(tǒng)是采用計(jì)算機(jī)與網(wǎng)絡(luò)技術(shù)所實(shí)現(xiàn)的對(duì)高校各部門(mén)年度目標(biāo)任務(wù)進(jìn)行信息化管理的Web 系統(tǒng).系統(tǒng)基于Java EE 平臺(tái),采用MVC 模式設(shè)計(jì),由Struts2+Spring+Hibernate 輕量級(jí)框架構(gòu)建[10].核心功能包括目標(biāo)任務(wù)的編制、任務(wù)的下達(dá)、任務(wù)完成數(shù)據(jù)的上傳、任務(wù)完成數(shù)據(jù)的審核、量化打分以及匯總等功能.通過(guò)該系統(tǒng)實(shí)現(xiàn)了目標(biāo)考核工作的數(shù)字化管理,提高了考核過(guò)程的透明度、結(jié)果的公平性和公正性,對(duì)全校教職工的工作具有良好的引導(dǎo)和激勵(lì)作用,為學(xué)校領(lǐng)導(dǎo)層作決策提供了數(shù)據(jù)支撐.

3.1 目標(biāo)考核系統(tǒng)中的數(shù)據(jù)初始化順序

由于目標(biāo)考核工作涉及較多的職能部門(mén)(發(fā)展規(guī)劃處、人事處、科技處、學(xué)生工作處、教務(wù)處、學(xué)科辦、團(tuán)委、黨委組織部、黨委宣傳部等)、各二級(jí)教學(xué)單位和全體教職工.考核目標(biāo)覆蓋了教育教學(xué)、科學(xué)研究、師資隊(duì)伍建設(shè)、學(xué)生工作、黨風(fēng)廉政建設(shè)等各個(gè)方面,因此系統(tǒng)運(yùn)行所需要的基礎(chǔ)數(shù)據(jù)較多.按照考核工作的職責(zé)、對(duì)象和任務(wù),將基礎(chǔ)數(shù)據(jù)劃分為三大部分,包括:用戶數(shù)據(jù)、權(quán)限數(shù)據(jù)和指標(biāo)數(shù)據(jù).其中用戶數(shù)據(jù)包含技術(shù)職務(wù)、黨政職務(wù)、黨政職務(wù)級(jí)別、崗位級(jí)別、部門(mén)、教工基本信息、部門(mén)賬戶和科研類別.權(quán)限數(shù)據(jù)包括權(quán)限和角色.指標(biāo)包括綜合指標(biāo)和業(yè)務(wù)指標(biāo)兩部分,每部分又細(xì)分為一級(jí)指標(biāo)、二級(jí)指標(biāo)和三級(jí)指標(biāo).其中一個(gè)一級(jí)指標(biāo)包含多個(gè)二級(jí)指標(biāo),一個(gè)二級(jí)指標(biāo)包含多個(gè)三級(jí)指標(biāo).上述各項(xiàng)數(shù)據(jù)的具體初始化先后順序依次是:技術(shù)職務(wù)、黨政職務(wù)、黨政職務(wù)級(jí)別、崗位級(jí)別、部門(mén)、權(quán)限、角色、教工基本信息、部門(mén)賬戶、科研級(jí)別、一級(jí)綜合指標(biāo)、二級(jí)綜合指標(biāo)、三級(jí)綜合指標(biāo)、業(yè)績(jī)一級(jí)指標(biāo)、二級(jí)業(yè)績(jī)指標(biāo)、三級(jí)業(yè)績(jī)指標(biāo).

3.2 建造者設(shè)計(jì)模式的應(yīng)用

建造者設(shè)計(jì)模式包括抽象建造者、具體建造者、指揮者和產(chǎn)品4 個(gè)角色,如圖3所示.將目標(biāo)考核系統(tǒng)的所有要初始化的數(shù)據(jù)看作一個(gè)整體,充當(dāng)其中的產(chǎn)品角色,每個(gè)部分的數(shù)據(jù)作為產(chǎn)品的一個(gè)成員,用List集合表示,因此產(chǎn)品是一個(gè)較復(fù)雜的POJO 對(duì)象.抽象建造者角色關(guān)聯(lián)一個(gè)受保護(hù)的產(chǎn)品對(duì)象,定義初始化各部分?jǐn)?shù)據(jù)的抽象接口,其中每一個(gè)buildXXX()方法創(chuàng)建一類要初始化的數(shù)據(jù),通過(guò)getResult()方法得到所關(guān)聯(lián)的產(chǎn)品對(duì)象.具體建造者繼承抽象建造者實(shí)現(xiàn)每一個(gè)buildXXX()方法,定義每一類數(shù)據(jù)的初始化邏輯.

圖3 建造者設(shè)計(jì)模式類圖

本文所實(shí)現(xiàn)的目標(biāo)考核系統(tǒng)的初始化數(shù)據(jù)存儲(chǔ)在Excel 文件中,所以定義SysDataExcelBuilder 類作為具體的建造者.其中包含每一類初始化數(shù)據(jù)對(duì)應(yīng)的Service 組件作為屬性,其對(duì)象通過(guò)@Resource 注解從Spring IOC 容器獲取.Service 對(duì)象通過(guò)@Resource 注解關(guān)聯(lián)的Dao 對(duì)象完成初始化操作,Dao 對(duì)象封裝了Hibernate API 具體負(fù)責(zé)初始化數(shù)據(jù)的增、刪、改、查操作.具體建造者通過(guò)讀取applicationContext.xml 文件創(chuàng)建Spring IOC 容器,用ApplicationContext 對(duì)象表示.另外還包含一個(gè)InputStream 對(duì)象用作讀取Excel 文件的流對(duì)象,一個(gè)Workbook 對(duì)象用來(lái)表示Excel 的工作表,通過(guò)JXL 完成對(duì)Excel 工作表和單元格數(shù)據(jù)的訪問(wèn)[11].

3.3 策略設(shè)計(jì)模式的應(yīng)用

策略設(shè)計(jì)模式包括環(huán)境、抽象策略和具體策略三個(gè)角色,如圖4所示.該模式可以根據(jù)環(huán)境或者條件的不同而選擇不同的策略來(lái)完成某項(xiàng)任務(wù).InitStrategy為抽象策略接口,其中initData 方法定義數(shù)據(jù)初始化算法.DevelopmentStrategy 和RunningStratey 是兩個(gè)具體的初始化策略,DevelopmentStrategy 是系統(tǒng)開(kāi)發(fā)階段使用的策略,具體的數(shù)據(jù)初始化算法是如果數(shù)據(jù)庫(kù)存在先刪除數(shù)據(jù)庫(kù),再創(chuàng)建數(shù)據(jù)庫(kù)并通過(guò)建造者模式的指揮者對(duì)象調(diào)用初始化操作.RunningStrategy 是系統(tǒng)部署上線運(yùn)行時(shí)采用的策略,具體的數(shù)據(jù)初始化算法是獲取初始化完成標(biāo)記信息,判斷是否已經(jīng)執(zhí)行過(guò)初始化操作,如果已經(jīng)執(zhí)行則忽略;如果沒(méi)有初始化過(guò),那么先創(chuàng)建數(shù)據(jù)庫(kù),通過(guò)建造者模式的指揮者對(duì)象調(diào)用初始化操作并設(shè)置初始化完成標(biāo)記,標(biāo)記信息存儲(chǔ)在特定數(shù)據(jù)庫(kù)表中.

圖4 策略設(shè)計(jì)模式類圖

3.4 單例設(shè)計(jì)模式的應(yīng)用

單例設(shè)計(jì)模式能夠確保某個(gè)類只能擁有自己的一個(gè)對(duì)象,在某些工具類的定義中普遍應(yīng)用單例模式.這種工具類基本上貫穿程序始終,必然會(huì)頻繁調(diào)用.如果每一次調(diào)用都要重新生成實(shí)例,帶來(lái)的就是內(nèi)存堆空間的浪費(fèi),所以單例模式能夠提高程序的運(yùn)行速度,減少資源消耗.文獻(xiàn)[12]分析了單例模式實(shí)現(xiàn)的5 種方式,總結(jié)了每種方式的優(yōu)缺點(diǎn)和應(yīng)用場(chǎng)景.本初始化模型在操作數(shù)據(jù)庫(kù)時(shí)采用JDBC 與Hibernate 相結(jié)合的混合持久化技術(shù),所以采用靜態(tài)內(nèi)部類方式作為單例模式的實(shí)現(xiàn)方法,因?yàn)樵摲椒ň哂姓{(diào)用效率高、線程安全、支持延遲加載等優(yōu)點(diǎn).

由于Hibernate 框架能夠創(chuàng)建并更改數(shù)據(jù)庫(kù)表結(jié)構(gòu),實(shí)現(xiàn)對(duì)象與表、對(duì)象之間關(guān)系與表之間關(guān)聯(lián)的映射,但無(wú)法自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù),因此需要通過(guò)JDBC 執(zhí)行SQL 自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù).利用單例模式定義JDBCUtil,用來(lái)封裝JDBC 的加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)、獲取Connection對(duì)象和釋放資源等3 個(gè)操作,這個(gè)單例對(duì)象作為JDBC操作的全局唯一入口.同樣為了簡(jiǎn)化Hibernate進(jìn)行持久化操作代碼的重復(fù)性,利用單例模式定義HibernateUtil,該類完成對(duì)Hibernate 有關(guān)代碼的封裝,其中包含的主要操作有g(shù) e t S e s s i o n F a c t o r y()、getSession()和closeSession().在各部分初始化數(shù)據(jù)對(duì)應(yīng)的泛型DAO 實(shí)現(xiàn)類中對(duì)HibernateUtil 單例對(duì)象進(jìn)行調(diào)用,完成公共的save()、delete()、update()、getById()、getByIds()和findAll()方法的邏輯.

4 初始化方法應(yīng)用測(cè)試

系統(tǒng)實(shí)施所采用的相關(guān)工具信息如表1所示.

表1 系統(tǒng)相關(guān)工具信息表

要導(dǎo)入到系統(tǒng)中的初始化數(shù)據(jù)存放在Excel 文件中,共包括16 張worksheet,其中技術(shù)職務(wù)表有數(shù)據(jù)52 條、黨政職務(wù)類別表有數(shù)據(jù)6 條、黨政職務(wù)名稱表28條、崗位類別表4條、部門(mén)信息表48條、權(quán)限數(shù)據(jù)表126 條、角色表有27 條、部門(mén)賬戶表有60 條、教工信息表1248 條、科研級(jí)別表47條、一級(jí)指標(biāo)表5條、二級(jí)指標(biāo)表30條、三級(jí)指標(biāo)表109 條、業(yè)績(jī)一級(jí)指標(biāo)表6條、業(yè)績(jī)二級(jí)指標(biāo)表23條、業(yè)績(jī)?nèi)?jí)指標(biāo)表67條,文件總大小為680 KB.進(jìn)行開(kāi)發(fā)階段的策略測(cè)試時(shí),在JUnit 單元測(cè)試中調(diào)用初始化數(shù)據(jù)的代碼,如下代碼所示:

執(zhí)行后發(fā)現(xiàn)在MySQL 中生成了對(duì)應(yīng)的數(shù)據(jù)庫(kù)以及相應(yīng)的表,每個(gè)表中都插入了對(duì)應(yīng)Excel 工作表中的數(shù)據(jù).第二次再執(zhí)行會(huì)先刪除上次創(chuàng)建的數(shù)據(jù)庫(kù),再重新生成數(shù)據(jù)庫(kù)及對(duì)應(yīng)的表.多次測(cè)試后平均完成初始化操作的時(shí)間為195s.針對(duì)運(yùn)行時(shí)策略的測(cè)試,由于運(yùn)行時(shí)策略在系統(tǒng)正式部署時(shí)使用,所以定義了初始化監(jiān)聽(tīng)器執(zhí)行上述代碼,將具體策略換成RunningStrategy.初始化監(jiān)聽(tīng)器在web.xml 中的配置位置位于Spring IOC 容器的配置后,因?yàn)橹挥蠸pring 容器初始化后,才能通過(guò)容器對(duì)象得到各部分初始化數(shù)據(jù)對(duì)應(yīng)的Service 組件.經(jīng)過(guò)測(cè)試,初始化操作會(huì)在Web 服務(wù)器啟動(dòng)后自動(dòng)執(zhí)行,以后再次啟動(dòng)Web 服務(wù)器初始化操作不再執(zhí)行.

5 結(jié)論與展望

設(shè)計(jì)模式是面向?qū)ο蟪绦蛟O(shè)計(jì)中通用問(wèn)題的一種可復(fù)用解決方案.將建造者、策略和單例模式應(yīng)用到基礎(chǔ)數(shù)據(jù)的初始化設(shè)計(jì)中,簡(jiǎn)化了初始化操作.同時(shí),應(yīng)用系統(tǒng)如需增加其他初始化數(shù)據(jù),只需更改產(chǎn)品、抽象建造者和具體建造者角色;如果需要從其他存儲(chǔ)方式中讀取初始化數(shù)據(jù),只需重新定義具體建造者角色.因此,所提出的數(shù)據(jù)初始化方法具有較高的復(fù)用性、維護(hù)性和擴(kuò)展性.

猜你喜歡
設(shè)計(jì)模式對(duì)象數(shù)據(jù)庫(kù)
仿生設(shè)計(jì)模式的創(chuàng)新應(yīng)用探索
玩具世界(2023年6期)2024-01-29 12:14:36
神秘來(lái)電
睿士(2023年2期)2023-03-02 02:01:09
“1+1”作業(yè)設(shè)計(jì)模式的實(shí)踐探索
交通機(jī)電工程設(shè)計(jì)模式創(chuàng)新探討
攻略對(duì)象的心思好難猜
意林(2018年3期)2018-03-02 15:17:24
數(shù)據(jù)庫(kù)
基于熵的快速掃描法的FNEA初始對(duì)象的生成方法
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
區(qū)間對(duì)象族的可鎮(zhèn)定性分析
海宁市| 彩票| 云和县| 三门峡市| 紫金县| 德惠市| 临澧县| 辰溪县| 靖远县| 禹州市| 咸宁市| 盐源县| 朔州市| 达拉特旗| 孟州市| 沈丘县| 万宁市| 礼泉县| 新竹县| 离岛区| 吴旗县| 阳朔县| 剑阁县| 射阳县| 贵定县| 绍兴市| 德令哈市| 新丰县| 辽宁省| 阿瓦提县| 吉隆县| 慈溪市| 北海市| 娄烦县| 星子县| 夹江县| 南郑县| 翼城县| 宿松县| 鹤岗市| 彰武县|