999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Spring環境下的敏捷ORM框架設計與實現

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

伍文彬

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

關鍵詞:Spring;開發效率;數據庫;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中的關系模型結構,不必在系統開發中操作SQL語句字符串,只需處理相關Java對象即可對數據庫中的數據進行操作[1]。ORM框架為代碼操作數據提供了一座橋梁[2],ORM也為開發者解決了面向對象開發時與數據庫之間的匹配技術難題[3]。

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

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

1 框架設計

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

1.1 通用SQL快速生成模塊

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

1.2 多模式數據庫通用CRUD模塊

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

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

1.3 數據表格分頁查詢模塊

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

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

1.4 快速CRUD方法模塊

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

2 框架模塊實現

2.1 通用SQL模塊實現原理

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

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

2.2 通用CRUD模塊實現原理

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

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

2.3 快速CRUD方法模塊實現原理

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

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

3 結語

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

參考文獻:

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

[2] 梁文菲,黃厚寬. 對象/關系映射技術與面向對象數據庫技術比較分析[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持久化層的設計與實現[J]. 計算機技術與發展,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的通用數據持久層的研究與設計[J]. 微計算機信息,2007,23(43):172-174.

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

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

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

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

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

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

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

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

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

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

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

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

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

(責任編輯:杜能鋼)

猜你喜歡
數據庫
數據庫
財經(2017年15期)2017-07-03 22:40:49
數據庫
財經(2017年2期)2017-03-10 14:35:35
兩種新的非確定數據庫上的Top-K查詢
數據庫
財經(2016年15期)2016-06-03 07:38:02
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
數據庫
財經(2015年3期)2015-06-09 17:41:31
數據庫
財經(2014年21期)2014-08-18 01:50:18
數據庫
財經(2014年6期)2014-03-12 08:28:19
數據庫
財經(2013年6期)2013-04-29 17:59:30
主站蜘蛛池模板: 伊伊人成亚洲综合人网7777| 精品剧情v国产在线观看| 国产第一福利影院| 日本AⅤ精品一区二区三区日| 好久久免费视频高清| 欧美激情网址| 久久综合亚洲鲁鲁九月天| 国产在线精彩视频论坛| 久久久精品无码一区二区三区| 99九九成人免费视频精品| 国产69囗曝护士吞精在线视频| 亚洲色图欧美在线| 99久久精品国产麻豆婷婷| 久996视频精品免费观看| 久久黄色视频影| 思思热在线视频精品| 超清人妻系列无码专区| 国产96在线 | 亚洲无码91视频| 国产精品人成在线播放| 午夜福利在线观看入口| 欧美日韩午夜| 国内a级毛片| 免费日韩在线视频| 国产精品99在线观看| 免费又爽又刺激高潮网址| 欧美日韩在线亚洲国产人| 青青草国产免费国产| 91精品国产自产在线老师啪l| 成年午夜精品久久精品| 国产在线精品香蕉麻豆| 久久99蜜桃精品久久久久小说| 欧美一级夜夜爽www| 青青青国产视频| 久久久久青草大香线综合精品| 国产日韩AV高潮在线| 中文字幕无线码一区| 伊在人亚洲香蕉精品播放| 在线高清亚洲精品二区| 人人看人人鲁狠狠高清| 夜夜操天天摸| 精品一区二区三区视频免费观看| 99re视频在线| 日韩视频免费| 黄色网在线| 亚洲国产中文欧美在线人成大黄瓜| 天天色天天综合网| 国产精品爽爽va在线无码观看| 99re经典视频在线| 国内黄色精品| 成人国产小视频| 99在线观看免费视频| 国产精品真实对白精彩久久| 国产三级韩国三级理| 国产极品美女在线| 亚洲资源站av无码网址| 亚洲综合狠狠| 日韩欧美国产另类| 欧美色图久久| 国产91视频观看| 无码AV高清毛片中国一级毛片| 在线免费a视频| 亚洲精品无码在线播放网站| 免费一级成人毛片| 久热中文字幕在线| 亚洲床戏一区| 萌白酱国产一区二区| 久久精品国产电影| 色亚洲成人| 婷婷99视频精品全部在线观看 | 免费又黄又爽又猛大片午夜| 国产欧美日韩另类精彩视频| 欧美α片免费观看| 国产午夜人做人免费视频中文 | 亚洲日韩Av中文字幕无码 | 国产福利在线观看精品| 91网站国产| 亚洲精品大秀视频| 亚洲永久免费网站| 中文天堂在线视频| 国产h视频在线观看视频| 在线看免费无码av天堂的|