• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

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

      伍文彬

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

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

      DOI:10. 11907/rjdk. 191289

      中圖分類號:TP319 文獻標識碼:A 文章編號: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)框架,是通過對Java對象的映射表示SQL中的關系模型結構,不必在系統(tǒng)開發(fā)中操作SQL語句字符串,只需處理相關Java對象即可對數(shù)據(jù)庫中的數(shù)據(jù)進行操作[1]。ORM框架為代碼操作數(shù)據(jù)提供了一座橋梁[2],ORM也為開發(fā)者解決了面向對象開發(fā)時與數(shù)據(jù)庫之間的匹配技術難題[3]。

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

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

      1 框架設計

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

      1.1 通用SQL快速生成模塊

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

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

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

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

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

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

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

      1.4 快速CRUD方法模塊

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

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

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

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

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

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

      基于Spring框架結構,依賴注入(dependency Injection,DI)可為任意的Java對象動態(tài)提供所需及生成相對應的實例[17]。

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

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

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

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

      3 結語

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

      參考文獻:

      [1] 丁昊志. 對象關系映射模型研究[D]. 北京:華北電力大學,2006.

      [2] 梁文菲,黃厚寬. 對象/關系映射技術與面向對象數(shù)據(jù)庫技術比較分析[J]. 中國科技信息, 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] 張少應,程傳旭. 基于Hibernate持久化層的設計與實現(xiàn)[J]. 計算機技術與發(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應用框架研究[J]. 微型電腦應用,2012(7):1-4.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      (責任編輯:杜能鋼)

      猜你喜歡
      數(shù)據(jù)庫
      數(shù)據(jù)庫
      財經(jīng)(2017年15期)2017-07-03 22:40:49
      數(shù)據(jù)庫
      財經(jīng)(2017年2期)2017-03-10 14:35:35
      數(shù)據(jù)庫
      財經(jīng)(2016年15期)2016-06-03 07:38:02
      數(shù)據(jù)庫
      財經(jīng)(2016年3期)2016-03-07 07:44:46
      數(shù)據(jù)庫
      財經(jīng)(2016年6期)2016-02-24 07:41:51
      數(shù)據(jù)庫
      財經(jīng)(2010年20期)2010-10-19 01:48:32
      门头沟区| 灵川县| 绥阳县| 邻水| 黔东| 铜鼓县| 沙坪坝区| 甘德县| 南木林县| 海城市| 乌兰浩特市| 盖州市| 司法| 上虞市| 平顺县| 九江市| 霍山县| 临泽县| 当雄县| 文登市| 临澧县| 德江县| 聂拉木县| 汤阴县| 大英县| 靖远县| 中方县| 马尔康县| 绿春县| 永昌县| 商洛市| 长垣县| 正宁县| 慈利县| 旺苍县| 左云县| 广宗县| 梅河口市| 崇阳县| 天柱县| 武鸣县|