專(zhuān)利名稱(chēng):一種軟件開(kāi)發(fā)輔助工具包的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于軟件開(kāi)發(fā)領(lǐng)域,特別涉及一種不引入開(kāi)源框架支持的敏捷J2EE應(yīng)用開(kāi)發(fā)場(chǎng)景。
背景技術(shù):
J2EE是當(dāng)前企業(yè)應(yīng)用開(kāi)發(fā)的主流技術(shù)之一。為了提高開(kāi)發(fā)人員的工作效率,業(yè)界也涌現(xiàn)出各種強(qiáng)大且靈活的輔助性開(kāi)源框架。通過(guò)在J2EE項(xiàng)目中引入這些框架,可以將開(kāi)發(fā)人員從繁鎖的重復(fù)代碼中解放出來(lái),從而重點(diǎn)關(guān)注于應(yīng)用業(yè)務(wù)邏輯的實(shí)現(xiàn)?,F(xiàn)在比較知名且有廣泛應(yīng)用的開(kāi)源框架有Mruts、Spring以及Hibernate,三者可統(tǒng)一簡(jiǎn)稱(chēng)為SSH。它們分別關(guān)注于不同的代碼設(shè)計(jì)層,如Hibernate就是一種典型的ORM 框架。它用于實(shí)現(xiàn)數(shù)據(jù)表與對(duì)象模型的關(guān)系映射,讓開(kāi)發(fā)人員無(wú)需再編寫(xiě)大量的SQL語(yǔ)句來(lái)操作后臺(tái)數(shù)據(jù)庫(kù),可直接通過(guò)編寫(xiě)符合Java對(duì)象語(yǔ)義的代碼來(lái)完成常用的數(shù)據(jù)處理。 Struts則對(duì)應(yīng)于展現(xiàn)層及邏輯控制層,利用它可以使開(kāi)發(fā)人員輕松完成數(shù)據(jù)對(duì)象的自動(dòng)填充、傳遞、合法性校驗(yàn)以及界面數(shù)據(jù)自動(dòng)綁定等功能。Spring則是一個(gè)業(yè)務(wù)組件的拼裝器, 用于實(shí)現(xiàn)依賴(lài)反轉(zhuǎn)(IoC)以及對(duì)象生命周期管理。使用開(kāi)源框架來(lái)支持J2EE應(yīng)用開(kāi)發(fā)固然可以提高生產(chǎn)力,但有些場(chǎng)景下由于公司本身的技術(shù)傳統(tǒng)習(xí)慣或者具體項(xiàng)目的特別要求,不適合引入框架進(jìn)行開(kāi)發(fā)。這時(shí),需要一種更輕量的輔助工具包來(lái)簡(jiǎn)化開(kāi)發(fā)人員的編碼工作,做到脫離主流框架也能地將代碼量降到最低,同時(shí)保障代碼的高可維護(hù)性。
發(fā)明內(nèi)容
本發(fā)明的目的是針對(duì)在某些J2EE項(xiàng)目開(kāi)發(fā)中不適合引入已有開(kāi)源框架作支撐的場(chǎng)景下,提供的一種可顯著提高開(kāi)發(fā)人員編碼效率的輕量級(jí)開(kāi)發(fā)輔助工具包。一、在MVC代碼層次結(jié)構(gòu)中經(jīng)常會(huì)需要數(shù)據(jù)對(duì)象傳遞,此工具包中提供了實(shí)現(xiàn)對(duì)象自動(dòng)填值(Copy Value)功能,可以從ReSultkt、RequeSt、Map或其它源數(shù)據(jù)對(duì)象中提取屬性值并完成對(duì)目標(biāo)對(duì)象的相應(yīng)屬性值的自動(dòng)填充。如圖1所示,此功能具體采用的技術(shù)方案如下>對(duì)目標(biāo)對(duì)象的屬性集進(jìn)行“反射”(Reflection)遍歷,獲取待填充的屬性名稱(chēng)集合;>對(duì)目標(biāo)對(duì)象的每個(gè)屬性進(jìn)行“標(biāo)注”(Annotation)分析,獲取自動(dòng)填充時(shí)所需的屬性別名映射表;>對(duì)于屬性別名存在規(guī)律性差異的情況下,用戶(hù)可以注入一個(gè)自定義的別名轉(zhuǎn)義處理類(lèi)(實(shí)現(xiàn)至ftOpertyAliasMapper),那第二步中生成屬性別名映射表時(shí)會(huì)優(yōu)先使用此自定義實(shí)現(xiàn)類(lèi)來(lái)完成,不再進(jìn)行“標(biāo)注”(Annotation)分析;>對(duì)源數(shù)據(jù)對(duì)象的屬性集進(jìn)行遍歷,并統(tǒng)一轉(zhuǎn)成Map對(duì)象。生成Map對(duì)象時(shí)會(huì)根據(jù)上述屬性別名映射表,完成對(duì)Map對(duì)象keySet的重新生成,以完成目標(biāo)對(duì)象與源數(shù)據(jù)對(duì)象之間待填充屬性的一一對(duì)應(yīng)關(guān)系;>最后直接調(diào)用 BeanUtils. populate (Object a, Map b)方法,將參數(shù) a傳入目標(biāo)對(duì)象,參數(shù)b則傳入從源數(shù)據(jù)對(duì)象生成的Map對(duì)象。此功能可以大量減少常規(guī)代碼中setter/getter方法的出現(xiàn)次數(shù),讓開(kāi)發(fā)人員僅用一行代碼來(lái)完成對(duì)象屬性值的自動(dòng)填充,代碼簡(jiǎn)潔而實(shí)用。二、針對(duì)DAO層的代碼簡(jiǎn)化處理,此工具包提供了數(shù)據(jù)對(duì)象的SQL語(yǔ)句自動(dòng)生成功能,能夠直接將單表對(duì)象映射成基本的SQL DML語(yǔ)句。如圖2所示,此功能具體采用的技術(shù)方案如下>首先,對(duì)數(shù)據(jù)對(duì)象類(lèi)進(jìn)行“標(biāo)注”(Annotation)分析,從而獲取到目標(biāo)數(shù)據(jù)庫(kù)表名以及主鍵列名信息。然后對(duì)數(shù)據(jù)對(duì)象的每個(gè)屬性進(jìn)行“標(biāo)注”(Annotation)分析,獲取轉(zhuǎn)換成SQL時(shí)所需的屬性別名映射表;>對(duì)于屬性別名存在規(guī)律性差異的情況下,用戶(hù)可以注入一個(gè)自定義的別名轉(zhuǎn)義處理類(lèi)(實(shí)現(xiàn)至ftOpertyAliasMapper),那上一步中生成屬性別名映射表時(shí)會(huì)優(yōu)先使用此自定義實(shí)現(xiàn)類(lèi)來(lái)完成,不再進(jìn)行“標(biāo)注”(Annotation)分析;>對(duì)數(shù)據(jù)對(duì)象的屬性集進(jìn)行“反射”(Reflection)遍歷,結(jié)合第一步獲取的表名及主鍵列名信息生成目標(biāo)SQL語(yǔ)句。此過(guò)程中會(huì)掃描對(duì)象屬性名與表字段名的映射表,同時(shí)會(huì)對(duì)屬性的數(shù)據(jù)類(lèi)型進(jìn)行差異化處理;該功能可以很大程度上簡(jiǎn)化單表操作SQL語(yǔ)句的編寫(xiě)工作量,同時(shí)支持靈活的對(duì)象屬性名與表字段名的映射處理機(jī)制。
圖1是本發(fā)明的對(duì)象數(shù)據(jù)自動(dòng)填充功能類(lèi)圖;圖2是本發(fā)明的SQL語(yǔ)句自動(dòng)生成功能類(lèi)具體實(shí)施例方式一,對(duì)象自動(dòng)填值功能代碼示例例如下代碼public class SampleTestModel {iModelPropertyAliasC id")private int recordld ;iModelPropertyAliasC name")private String userName ;iModelPropertyAliasC age")private int userAge ;iModelPropertyAliasC addr〃 )private String address ;......//setter or getter}對(duì)于 SampleTestModel 類(lèi)的實(shí)例對(duì)象,可以用 HttpServletRequest, ResultSet,
4Map或其它JavaBean對(duì)象作為源對(duì)象完成自動(dòng)填值,即對(duì)象值Copy ;例如下代碼SampleTestModel model = SampleTestModel();ModelValueUtils. setValues(moael, sourceObject);其中,SourceObject可以為上述幾種類(lèi)型對(duì)象。屬性自動(dòng)填充處理過(guò)程中,對(duì)于 源對(duì)象與目標(biāo)對(duì)象的屬性映射關(guān)系,可以用ModelPropertyAlias標(biāo)注類(lèi)進(jìn)行指定?;蛘?,對(duì)于有一定規(guī)律的屬性映射關(guān)系,不必針對(duì)目標(biāo)對(duì)象的鋒個(gè)屬性進(jìn)行“標(biāo) 注”說(shuō)明,可以實(shí)現(xiàn)一個(gè)自定義映射轉(zhuǎn)換類(lèi)。例如下代碼PropertyAliasMapper{public HashMap<String, String>getPropertyAliasMap(Object oDj,String key)throws Except ion{HashMap<String, String>m = new HashMap<String, String)();Field[] fields = obj. getClass (). getDeclaredFields ();String alias ;for(Field field :fields){alias = field. getName (). toUpperCase ();if(key. equals (" name as_key‘ ノ){m. put (field. getName (),alias);}else{m. put (alias, field. getName ());}}return m ;}}上述UpperCasePropAliasMapper實(shí)現(xiàn)類(lèi)是將目標(biāo)對(duì)象所有屬性的別名批量映射 成大寫(xiě)格式。將此實(shí)現(xiàn)注入到ModelValueUtils工具類(lèi)中后,自動(dòng)填值處理時(shí)源對(duì)象中的 屬性名會(huì)統(tǒng)一按大寫(xiě)進(jìn)行處理。例如下代碼ModelValueUtils. setPropertyAliasMapper (newUpperCas ePropAiiasMapper());ModelValueUtils. setValues(model, map);其中,map對(duì)象的key值可以對(duì)應(yīng)到model對(duì)象屬性名稱(chēng)的大寫(xiě)格式,而model對(duì) 象本身不需要再指定ModelPropertyAlias標(biāo)注。ニ,SQL語(yǔ)句自動(dòng)生成功能代碼示例在使用自動(dòng)生成SQL語(yǔ)句的功能之前,需要給SampleI^estModel類(lèi)增加一個(gè) ModelForSQLConvert 標(biāo)注。
例如下代碼OModeIForSQLConvert(tab IeName = “ HELL0_W0RLD〃,keyFieIdName = “ id",autoValueFieldNames = “ id")public class SampleTestModel {......同時(shí),對(duì)于insert或update語(yǔ)句的生成通常會(huì)依賴(lài)于已經(jīng)填值的實(shí)例對(duì)象,因此需要先對(duì)目標(biāo)對(duì)象的屬性成員進(jìn)行初始化。例如下代碼SampleTestModel testModel = new SampleTestModel();testModel. setRecordld(l);testModel. setUserName(“ zh〃 );testModel. setUserAge(25);testModel. setTelephone(“ 88521717〃 );testMode 上· setAddress(〃 gz〃);常用的SQL語(yǔ)句生成代碼如下 根據(jù)對(duì)象實(shí)例自動(dòng)生成一條insert語(yǔ)句String sql = ModelToSQLUtils. generatelnsertSql(testModel);System, out. println(sql);assertEquals(〃 insert into HELLO WORLD(name,age,addr,tel)values('zh', 25,,gz,,,88521717,) “,sql); 根據(jù)對(duì)象類(lèi)型以及指定條件自動(dòng)生成一條select語(yǔ)句String sql =ModelToSQLUtils. prepareSelectSql(SampleTestModel. class, " name",'’ 2 = 2");System, out. println(sql);assertEquals (〃 select name from HELL0_W0RLD where 2 = 2〃,sql); 根據(jù)對(duì)象實(shí)例自動(dòng)生成一條update語(yǔ)句String sql = ModelToSQLUtils. generateUpdateSql(testModel);System, out. println(sql);assertEquals (“ update HELL0_W0RLD setname =,zh', age = 25,addr =,gz', tel =,88521717' where id = I",sql)。
權(quán)利要求
1.一種軟件開(kāi)發(fā)輔助工具包,其特征在于基于JDK1. 5或以上版本實(shí)現(xiàn),適用于J2EE應(yīng)用開(kāi)發(fā)場(chǎng)景中的對(duì)象自動(dòng)填值以及SQL自動(dòng)生成處理。
2.一種軟件開(kāi)發(fā)輔助工具包,其特征在于利用Java反射(Reflection)機(jī)制,從而實(shí)現(xiàn)了對(duì)象屬性名稱(chēng)集合的獲取。
3.一種軟件開(kāi)發(fā)輔助工具包,其特征在于利用Java的標(biāo)注(Annotation)機(jī)制,從而不需要依賴(lài)XML文件進(jìn)行屬性別名配置。
4.一種軟件開(kāi)發(fā)輔助工具包,其特征在于利用Java的接口 anterface)機(jī)制,從而靈活地實(shí)現(xiàn)了對(duì)象屬性別名轉(zhuǎn)義的自定義處理。
5.一種軟件開(kāi)發(fā)輔助工具包,其特征在于對(duì)象自動(dòng)填值代碼底層復(fù)用了 Apache Commons BeanUtils公用庫(kù)中已有的方法。
6.根據(jù)權(quán)利要求1所述的軟件開(kāi)發(fā)輔助包,其特征在于不引入ORM框架的情況下,也能在很大程度上簡(jiǎn)化開(kāi)發(fā)人員在涉及對(duì)象自動(dòng)填值(Value Copy)以及SQL語(yǔ)句生成的代碼量,以一種更簡(jiǎn)潔靈活地方式支持敏捷開(kāi)發(fā)。
全文摘要
本發(fā)明提供了一種基于J2EE應(yīng)用開(kāi)發(fā)的代碼輔助工具包。此工具包適應(yīng)于在不引入ORM框架的情況下,也能在很大程度上簡(jiǎn)化開(kāi)發(fā)人員在涉及對(duì)象自動(dòng)填值(Value Copy)以及SQL語(yǔ)句生成的代碼量,以一種更簡(jiǎn)潔靈活地方式支持敏捷開(kāi)發(fā)。
文檔編號(hào)G06F9/44GK102214092SQ201010504090
公開(kāi)日2011年10月12日 申請(qǐng)日期2010年10月11日 優(yōu)先權(quán)日2010年10月11日
發(fā)明者周環(huán) 申請(qǐng)人:新太科技股份有限公司