亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Spring環(huán)境下的敏捷ORM框架設(shè)計(jì)與實(shí)現(xiàn)

        2019-05-24 14:17:58伍文彬
        軟件導(dǎo)刊 2019年5期
        關(guān)鍵詞:數(shù)據(jù)庫

        伍文彬

        摘 要:伴隨著互聯(lián)網(wǎng)的發(fā)展,各行各業(yè)信息化程度不斷提升,各種系統(tǒng)應(yīng)運(yùn)而生。要提高系統(tǒng)開發(fā)效率就必須提高數(shù)據(jù)庫訪問層開發(fā)效率。通過對(duì)多個(gè)項(xiàng)目的DAL層進(jìn)行統(tǒng)計(jì)分析,得出通用的CRUD方法集合形成父接口;結(jié)合JPA自定義的相關(guān)功能注解以及Spring的AOP功能,對(duì)Java反射的核心接口InvocationHandler進(jìn)行JDK的動(dòng)態(tài)代理功能實(shí)現(xiàn);配合基于注解的SQL快速生成并且針對(duì)不同數(shù)據(jù)庫模式對(duì)LIMIT查詢進(jìn)行邏輯處理,完成分頁查詢功能,從而完成基于Spring環(huán)境開發(fā)的快捷ORM實(shí)現(xiàn)。系統(tǒng)開發(fā)者可根據(jù)預(yù)定義的注解和相關(guān)通用查詢方法快捷操作數(shù)據(jù)庫,避免了在Java文件中編寫大量的sql文本和xml文件,降低了代碼錯(cuò)誤率,提高了開發(fā)效率。

        關(guān)鍵詞:Spring;開發(fā)效率;數(shù)據(jù)庫;ORM

        DOI:10. 11907/rjdk. 191289

        中圖分類號(hào):TP319 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2019)005-0134-03

        Abstract:Along with the development of the Internet, the degree of informatization of all walks of life has also increased, and various systems have emerged. In order to improve the development efficiency of the overall system, it is indispensable to improve the development efficiency of the database access layer. Through statistical analysis of the DAL layer methods of multiple projects, the general CRUD method set is formed into a parent interface; combined with JPA and custom related function annotations and Spring AOP functions, the core interface InvocationHandler is used for Java reflection. The implementation of the dynamic proxy function of the JDK is realised with the rapid generation of annotation-based SQL and the logical processing of the LIMIT query for different database schemas, and the function of paging query is completed to make the implementation of the fast ORM based on the development of the Spring environment. System developers can quickly operate the database according to predefined annotations and related fast general query methods, avoiding to write large quantities of sql strings or xml files in Java files, reducing code error rate and improving development efficiency.

        Key Words:Spring; development efficiency; database; ORM

        0 引言

        ORM(OBJECT RELATIONAL MAPPING)框架,是通過對(duì)Java對(duì)象的映射表示SQL中的關(guān)系模型結(jié)構(gòu),不必在系統(tǒng)開發(fā)中操作SQL語句字符串,只需處理相關(guān)Java對(duì)象即可對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行操作[1]。ORM框架為代碼操作數(shù)據(jù)提供了一座橋梁[2],ORM也為開發(fā)者解決了面向?qū)ο箝_發(fā)時(shí)與數(shù)據(jù)庫之間的匹配技術(shù)難題[3]。

        目前高頻率使用的開源ORM框架有JdbcTemplate、MyBatis、Hibernate/JPA等。Hibernate是對(duì)jpa規(guī)范的實(shí)現(xiàn),提供了強(qiáng)大的對(duì)象到關(guān)系數(shù)據(jù)庫的持久化服務(wù)。開發(fā)者無需關(guān)心數(shù)據(jù)庫,只需要管理對(duì)象狀態(tài)即可[4],不僅管理數(shù)據(jù)庫表的映射,還提供大量的注解緩存查詢功能[5]。MyBatis主要由DAO組件和SQL Map兩大組件組成,通過SQL Map與DAO組件之間的映射對(duì)數(shù)據(jù)庫進(jìn)行操作[6],通過SQL Map的xml文件將DAO組件映射為SQL語句,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的接口式訪問。JdbcTemplate則屬于Spring下的一個(gè)內(nèi)部封裝組件,它將JDBC流程封裝起來,包含捕捉異常、執(zhí)行SQL以及對(duì)SQL執(zhí)行結(jié)果的轉(zhuǎn)化等 [8],統(tǒng)一了資源的建立和釋放,避免了關(guān)閉連接等常見錯(cuò)誤[9]。

        以上3個(gè)框架都是對(duì)底層JDBC訪問有一定程度的封裝,Hibernate提供映射服務(wù)數(shù)據(jù)緩存等功能[10],但在框架中會(huì)使用大量注解。MyBatis需要用戶書寫大量的SQL代碼,并且由xml和JAVA代碼配合[11]。JdbcTemplate主要對(duì)JDBC中的幾大組件進(jìn)行流程化處理[12],三者都需要開發(fā)者做額外的維護(hù)工作,增加了代碼維護(hù)的難度。本文實(shí)現(xiàn)的ORM框架博采眾長(zhǎng),著重于輕量級(jí)注解和增刪查改(Create、Read、Update、Delete,CRUD)方法的通用性上,對(duì)DAL層進(jìn)行大量通用化和敏捷化處理,彌補(bǔ)了上述方法的不足。

        1 框架設(shè)計(jì)

        本文ORM框架名稱為template-module-orm,包含通用SQL快速生成模塊(template-module-sql)、多模式數(shù)據(jù)庫通用CRUD模塊(template-module-jpa)、數(shù)據(jù)表格分頁查詢模塊(template-module-pagination)以及快速CRUD方法4個(gè)模塊(template-module-repository),每個(gè)模塊對(duì)應(yīng)處理不同內(nèi)容,通過4個(gè)模塊的合作達(dá)到對(duì)DAL層的高效開發(fā)。

        1.1 通用SQL快速生成模塊

        系統(tǒng)開發(fā)需要大量的CRUD操作,尤其select方法占據(jù)系統(tǒng)代碼量很大一部分。本模塊中基于Java實(shí)體和表格結(jié)構(gòu)的兩種模式,分別實(shí)現(xiàn)兩種不同系統(tǒng)中常用的CRUD基本語句SQLBeanBuilder和SQLTextBuilder,滿足了系統(tǒng)大部分的CRUD,省去了開發(fā)者構(gòu)建基礎(chǔ)sql語句的時(shí)間。SQLBeanBuilder接口設(shè)計(jì)包含SQLTextBuilder和SQLBeanBuilder中類似的方法:①生成以count為開頭的統(tǒng)計(jì)方法sql(包含有無where統(tǒng)計(jì)等);②生成以select為開頭的查詢方法sql(包含where條件選擇和查詢結(jié)果列的選擇等);③生成以insert為開頭的插入方法sql(包含插入字段的選擇以及主鍵是否參與等);④生成以u(píng)pdate為開頭的更新方法sql(包含set字段選擇和where字段選擇等);⑤生成以delete為開頭的刪除方法sql(包含where的選擇和主鍵參數(shù)的選擇等)。

        1.2 多模式數(shù)據(jù)庫通用CRUD模塊

        JdbcTemplate是隸屬于Spring框架下的一個(gè)封裝組件。由于JDBC API過于底層,直接進(jìn)行JDBC操作會(huì)很繁瑣,因此Spring對(duì)其做了初級(jí)模板化處理,開發(fā)人員只需編寫業(yè)務(wù)代碼和SQL語句即可[13],這導(dǎo)致代碼中存在大量條件判斷語句和SQL語句疊層,增加了代碼維護(hù)難度。

        本模塊針對(duì)SQL與Java代碼的疊合情況進(jìn)行分類,實(shí)現(xiàn)針對(duì)特定類別的sql(如DDL、DML等區(qū)別)、特定類型的sql參數(shù)(如Map類型、Bean類型、數(shù)組類型等)、特定類型的返回結(jié)果(如Java基本類型、集合類型、Page類型等)分別進(jìn)行處理,高效完成數(shù)據(jù)庫操作,同時(shí)支持MySQL、SqlServer、Oracle等10種常用數(shù)據(jù)庫。主要接口方法有:①以callProcedure為開頭的存儲(chǔ)方法(包含對(duì)參數(shù)和結(jié)果的數(shù)量和類型的處理);②以insert為開頭的插入方法(包含插入?yún)?shù)、返回結(jié)果類型和主鍵的返回與否處理);③以execute為開頭的方法(可執(zhí)行任何insert/update/delete語句的基礎(chǔ)方法);④以executeBatch為開頭的方法(同上,只不過為批量處理);⑤以findNumber為開頭數(shù)學(xué)查詢方法(查詢函數(shù)結(jié)果,包含對(duì)參數(shù)和結(jié)果的類型處理);⑥以findPrimitive為開頭的基本類型結(jié)果查詢方法(返回值預(yù)期為Java基本類型);⑦以findList為開頭的多列查詢方法(查詢多列多行,包含參數(shù)和結(jié)果的類型處理);⑧以findPage為開頭的分頁查詢方法(自動(dòng)判斷數(shù)據(jù)庫類型,生成sql并處理返回結(jié)果)。

        1.3 數(shù)據(jù)表格分頁查詢模塊

        主要針對(duì)后臺(tái)管理中的表格分頁數(shù)據(jù)進(jìn)行管理(dataTable)。模塊包含3個(gè)對(duì)象:①Table:主要呈現(xiàn)當(dāng)前頁的數(shù)據(jù)(List接口的泛型對(duì)象數(shù)據(jù));②Query:一些頁面的信息(頁碼、頁大小、是否支持[多列]排序、排序字段等);③Sorting:排序字段(排序字段、排序方向等)。

        將以上3個(gè)對(duì)象作為參數(shù),根據(jù)模塊的Pagination處理分頁邏輯,Pagination中主要包含如下方法接口:①getPageNo:獲取當(dāng)前頁面的頁碼;②getPageSize:獲取當(dāng)前頁面的數(shù)據(jù)量大?。虎踘etParamsMap:獲取查詢參數(shù)的集合處理結(jié)果;④getSql:獲取分頁查詢部分的sql模塊(根據(jù)不同數(shù)據(jù)庫種類生成不同語句)。

        1.4 快速CRUD方法模塊

        本模塊為核心模塊,根據(jù)用戶定義的子接口及方法生成對(duì)應(yīng)的DAL層實(shí)例。本模塊基于通用CRUD模塊實(shí)現(xiàn),子接口必須定義模塊中預(yù)定義的父接口方可實(shí)現(xiàn)快速CRUD功能,父接口如下:①以save開頭:處理插入動(dòng)作,針對(duì)不同的參數(shù)和主鍵情況返回預(yù)期值和類型;②以delete開頭:處理刪除方法,根據(jù)不同參數(shù)和主鍵返回預(yù)期值;③以count/exist開頭:根據(jù)不同參數(shù)處理統(tǒng)計(jì)和存在的方法;④以find開頭:處理查詢select動(dòng)作;⑤以u(píng)pdate開頭:根據(jù)不同參數(shù)和返回類型處理更新操作;⑥除以上之外的用戶定義接口方法:根據(jù)方法名自動(dòng)判斷執(zhí)行內(nèi)容。

        2 框架模塊實(shí)現(xiàn)

        2.1 通用SQL模塊實(shí)現(xiàn)原理

        Java反射機(jī)制根據(jù)一個(gè)實(shí)例引用解析類的屬性和方法,也可新建一個(gè)實(shí)例[14]。工廠模式可讓設(shè)計(jì)者自行獲取產(chǎn)品并規(guī)范產(chǎn)品種類,抽象產(chǎn)品,進(jìn)而保證工廠模式的統(tǒng)一性[15]。合理的單例模式能減少對(duì)象的創(chuàng)建次數(shù),減少內(nèi)存消耗,提高復(fù)用性[16]。

        本模塊根據(jù)參數(shù)類型,使用工廠類SQLGen生成單例的SQLBeanBuilder或SQLTextBuilder類,之后根據(jù)生成的單例類中的方法,通過反射參數(shù)中的類名、屬性名、方法等關(guān)鍵信息,生成所需要的SQL文本。執(zhí)行流程如圖1所示。

        2.2 通用CRUD模塊實(shí)現(xiàn)原理

        基于Spring框架結(jié)構(gòu),依賴注入(dependency Injection,DI)可為任意的Java對(duì)象動(dòng)態(tài)提供所需及生成相對(duì)應(yīng)的實(shí)例[17]。

        本模塊依賴Spring環(huán)境下的IOC模式,通過模塊中的DaoFactory工廠類實(shí)現(xiàn)InitializingBean接口,把工廠類中DataSourceMap提供給Spring進(jìn)行屬性注入,之后通過訪問defaultDao等屬性訪問方法。DaoFactory加載賦值流程如圖2所示。

        2.3 快速CRUD方法模塊實(shí)現(xiàn)原理

        代理模式尤其是Java的動(dòng)態(tài)代理模式使軟件開發(fā)人員無須定義代理類,只需指定一組接口及被代理類的對(duì)象便可動(dòng)態(tài)獲得代理類[18]。Java的動(dòng)態(tài)代理由Proxy類和InvocationHandler接口實(shí)現(xiàn)。Proxy類提供了創(chuàng)建動(dòng)態(tài)代理的類及其實(shí)例的靜態(tài)方法[19]。運(yùn)行過程中Java通過調(diào)用動(dòng)態(tài)處理類的bind方法完成被代理類綁定,可無限制地調(diào)用被代理類的方法[20]。

        本模塊依賴Spring環(huán)境下基于JDK的動(dòng)態(tài)代理方式,通過RepositoryProxyFactory實(shí)現(xiàn)InvocationHandler接口功能,同時(shí)使用RepositoryRegistry類BeanDefinitionRegistryPostProcessor接口實(shí)現(xiàn)對(duì)代理類的注冊(cè),實(shí)現(xiàn)流程如圖3所示。

        3 結(jié)語

        本框架是一個(gè)全能的DAL層工具,具有Hibernate/JPA強(qiáng)大的注解功能以及MyBatis易于上手的優(yōu)點(diǎn),適用于以SQL為中心同時(shí)又要求快速編碼的應(yīng)用。本框架在處理OneToMany(即一對(duì)多)表的關(guān)系時(shí)使用非常順暢,但在處理ManyToMany(多對(duì)多)和ManyToOne(多對(duì)一)表的關(guān)系時(shí)還存在一些疑難問題,這是今后研究改進(jìn)的重點(diǎn)。

        參考文獻(xiàn):

        [1] 丁昊志. 對(duì)象關(guān)系映射模型研究[D]. 北京:華北電力大學(xué),2006.

        [2] 梁文菲,黃厚寬. 對(duì)象/關(guān)系映射技術(shù)與面向?qū)ο髷?shù)據(jù)庫技術(shù)比較分析[J]. 中國(guó)科技信息, 2006(21):154-156.

        [3] AMBLER S W. Mapping objects to relational databases: O/R mapping in detail[EB /OL]. http://www.agiledata.org/essays/mappingObjects.html,2013.

        [4] 張少應(yīng),程傳旭. 基于Hibernate持久化層的設(shè)計(jì)與實(shí)現(xiàn)[J]. 計(jì)算機(jī)技術(shù)與發(fā)展,2014(12):101-104.

        [5] THE HIBERNATE TEAM,THE JBOSS VISUAL DESIGN TEAM.Hibernate reference document[EB/OL]. http://docs.jboss.org/hibernate/orm/4.3/manual/en-Us/html, 2013.

        [6] 徐雯,高建華. 基于Spring MVC及MyBatis的Web應(yīng)用框架研究[J]. 微型電腦應(yīng)用,2012(7):1-4.

        [7] 王錢,王蓉. 基于ibatis的通用數(shù)據(jù)持久層的研究與設(shè)計(jì)[J]. 微計(jì)算機(jī)信息,2007,23(43):172-174.

        [8] 丁振凡,李馨梅. 基于JdbcTemplate的數(shù)據(jù)庫訪問處理[J]. 智能計(jì)算機(jī)與應(yīng)用,2012(3):29-32.

        [9] 劉泉,趙曉明. 基于模板方法的JDBC API的抽象封裝與實(shí)現(xiàn)[J]. 計(jì)算機(jī)應(yīng)用,2006(9):2222-2224.

        [10] 汪萌,曲俊華. 基于Hibernate技術(shù)的持久層解決方案及實(shí)現(xiàn)[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用,2010(3):154-157.

        [11] 榮艷冬. 關(guān)于Mybatis持久層框架的應(yīng)用研究[J]. 信息安全與技術(shù),2015(10):86-88.

        [12] 張俐,張維璽. 改進(jìn)的 JDBC 框架在數(shù)據(jù)持久層的應(yīng)用[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2010(8):1746-1749.

        [13] 趙璘,王紅霞. 基于SpringMVC+JDBCTemplate的Web系統(tǒng)的研究與應(yīng)用[J]. 軟件工程,2017(1):5-8.

        [14] 溫立輝. Java語言反射機(jī)制原理探析[J]. 信息系統(tǒng)工程,2016(8):99-100.

        [15] 杜增毅. 淺談主要的 Java 設(shè)計(jì)模式[J]. 軟件應(yīng)用,2017(8):40-41.

        [16] 葛萌,歐陽宏基,陳偉. 單例設(shè)計(jì)模式的研究與實(shí)現(xiàn)[J]. 微型電腦應(yīng)用,2017(9):68-74.

        [17] 王臻,郭芊羽. 基于Spring框架的依賴注入研究[J]. 才智,2014(12):358-359.

        [18] 丁民豆. 代理模式的研究與使用[J]. 電腦知識(shí)與技術(shù),2011(36):9385-9387.

        [19] 盧楠. Java動(dòng)態(tài)代理的研究與應(yīng)用[J]. 計(jì)算機(jī)與網(wǎng)絡(luò),2014(12):50-52.

        [20] 沈凱. 利用反射和動(dòng)態(tài)代理機(jī)制實(shí)現(xiàn)面向切面的程序設(shè)計(jì)[J]. 計(jì)算機(jī)時(shí)代,2010(11):56-58.

        (責(zé)任編輯:杜能鋼)

        猜你喜歡
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        视频在线观看免费一区二区| 国产日韩久久久久69影院| 2020最新国产激情| 亚洲av大片在线免费观看 | 亚洲国产人成综合网站| 制服丝袜一区二区三区| 三年片大全在线观看免费观看大全| 人成午夜免费大片| 级毛片无码av| 亚洲性av少妇中文字幕| 麻豆资源在线观看视频| 国模无码一区二区三区不卡| 久久综合精品国产丝袜长腿| 99久久久精品免费| 自拍av免费在线观看| 亚洲天堂二区三区三州| 国产农村熟妇videos| 欧美性videos高清精品| 无码伊人久久大蕉中文无码| 精品中文字幕精品中文字幕| 亚洲av天堂免费在线观看| 丁字裤少妇露黑毛| 无码视频一区二区三区在线观看| 亚洲精品二区在线观看| 国内精品国产三级国产| 岳丰满多毛的大隂户| 亚洲精品午睡沙发系列| 久久中文字幕日韩无码视频| 一区二区视频资源在线观看| 亚洲国产精品久久又爽av| aⅴ精品无码无卡在线观看| 两个人看的www高清视频中文| 中国人妻沙发上喷白将av| 亚洲午夜精品第一区二区| 日韩精品无码熟人妻视频| 国产精品嫩草影院av| 亚洲Va中文字幕无码毛片下载| 男女视频在线观看一区二区 | 日本一二三区视频在线| 人人添人人澡人人澡人人人人| 日韩人妻无码精品二专区|