专利名称:一种软件开发辅助工具包的制作方法
技术领域:
本发明属于软件开发领域,特别涉及一种不引入开源框架支持的敏捷J2EE应用开发场景。
背景技术:
J2EE是当前企业应用开发的主流技术之一。为了提高开发人员的工作效率,业界也涌现出各种强大且灵活的辅助性开源框架。通过在J2EE项目中引入这些框架,可以将开发人员从繁锁的重复代码中解放出来,从而重点关注于应用业务逻辑的实现。现在比较知名且有广泛应用的开源框架有Mruts、Spring以及Hibernate,三者可统一简称为SSH。它们分别关注于不同的代码设计层,如Hibernate就是一种典型的ORM 框架。它用于实现数据表与对象模型的关系映射,让开发人员无需再编写大量的SQL语句来操作后台数据库,可直接通过编写符合Java对象语义的代码来完成常用的数据处理。 Struts则对应于展现层及逻辑控制层,利用它可以使开发人员轻松完成数据对象的自动填充、传递、合法性校验以及界面数据自动绑定等功能。Spring则是一个业务组件的拼装器, 用于实现依赖反转(IoC)以及对象生命周期管理。使用开源框架来支持J2EE应用开发固然可以提高生产力,但有些场景下由于公司本身的技术传统习惯或者具体项目的特别要求,不适合引入框架进行开发。这时,需要一种更轻量的辅助工具包来简化开发人员的编码工作,做到脱离主流框架也能地将代码量降到最低,同时保障代码的高可维护性。
发明内容
本发明的目的是针对在某些J2EE项目开发中不适合引入已有开源框架作支撑的场景下,提供的一种可显著提高开发人员编码效率的轻量级开发辅助工具包。一、在MVC代码层次结构中经常会需要数据对象传递,此工具包中提供了实现对象自动填值(Copy Value)功能,可以从ReSultkt、RequeSt、Map或其它源数据对象中提取属性值并完成对目标对象的相应属性值的自动填充。如图1所示,此功能具体采用的技术方案如下>对目标对象的属性集进行“反射”(Reflection)遍历,获取待填充的属性名称集合;>对目标对象的每个属性进行“标注”(Annotation)分析,获取自动填充时所需的属性别名映射表;>对于属性别名存在规律性差异的情况下,用户可以注入一个自定义的别名转义处理类(实现至ftOpertyAliasMapper),那第二步中生成属性别名映射表时会优先使用此自定义实现类来完成,不再进行“标注”(Annotation)分析;>对源数据对象的属性集进行遍历,并统一转成Map对象。生成Map对象时会根据上述属性别名映射表,完成对Map对象keySet的重新生成,以完成目标对象与源数据对象之间待填充属性的一一对应关系;>最后直接调用 BeanUtils. populate (Object a, Map b)方法,将参数 a传入目标对象,参数b则传入从源数据对象生成的Map对象。此功能可以大量减少常规代码中setter/getter方法的出现次数,让开发人员仅用一行代码来完成对象属性值的自动填充,代码简洁而实用。二、针对DAO层的代码简化处理,此工具包提供了数据对象的SQL语句自动生成功能,能够直接将单表对象映射成基本的SQL DML语句。如图2所示,此功能具体采用的技术方案如下>首先,对数据对象类进行“标注”(Annotation)分析,从而获取到目标数据库表名以及主键列名信息。然后对数据对象的每个属性进行“标注”(Annotation)分析,获取转换成SQL时所需的属性别名映射表;>对于属性别名存在规律性差异的情况下,用户可以注入一个自定义的别名转义处理类(实现至ftOpertyAliasMapper),那上一步中生成属性别名映射表时会优先使用此自定义实现类来完成,不再进行“标注”(Annotation)分析;>对数据对象的属性集进行“反射”(Reflection)遍历,结合第一步获取的表名及主键列名信息生成目标SQL语句。此过程中会扫描对象属性名与表字段名的映射表,同时会对属性的数据类型进行差异化处理;该功能可以很大程度上简化单表操作SQL语句的编写工作量,同时支持灵活的对象属性名与表字段名的映射处理机制。
图1是本发明的对象数据自动填充功能类图;图2是本发明的SQL语句自动生成功能类具体实施例方式一,对象自动填值功能代码示例例如下代码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}对于 SampleTestModel 类的实例对象,可以用 HttpServletRequest, ResultSet,
4Map或其它JavaBean对象作为源对象完成自动填值,即对象值Copy ;例如下代码SampleTestModel model = SampleTestModel();ModelValueUtils. setValues(moael, sourceObject);其中,SourceObject可以为上述几种类型对象。属性自动填充处理过程中,对于 源对象与目标对象的属性映射关系,可以用ModelPropertyAlias标注类进行指定。或者,对于有一定规律的属性映射关系,不必针对目标对象的锋个属性进行“标 注”说明,可以实现一个自定义映射转换类。例如下代码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实现类是将目标对象所有属性的别名批量映射 成大写格式。将此实现注入到ModelValueUtils工具类中后,自动填值处理时源对象中的 属性名会统一按大写进行处理。例如下代码ModelValueUtils. setPropertyAliasMapper (newUpperCas ePropAiiasMapper());ModelValueUtils. setValues(model, map);其中,map对象的key值可以对应到model对象属性名称的大写格式,而model对 象本身不需要再指定ModelPropertyAlias标注。ニ,SQL语句自动生成功能代码示例在使用自动生成SQL语句的功能之前,需要给SampleI^estModel类增加一个 ModelForSQLConvert 标注。
例如下代码OModeIForSQLConvert(tab IeName = “ HELL0_W0RLD〃,keyFieIdName = “ id",autoValueFieldNames = “ id")public class SampleTestModel {......同时,对于insert或update语句的生成通常会依赖于已经填值的实例对象,因此需要先对目标对象的属性成员进行初始化。例如下代码SampleTestModel testModel = new SampleTestModel();testModel. setRecordld(l);testModel. setUserName(“ zh〃 );testModel. setUserAge(25);testModel. setTelephone(“ 88521717〃 );testMode 上· setAddress(〃 gz〃);常用的SQL语句生成代码如下 根据对象实例自动生成一条insert语句String sql = ModelToSQLUtils. generatelnsertSql(testModel);System, out. println(sql);assertEquals(〃 insert into HELLO WORLD(name,age,addr,tel)values('zh', 25,,gz,,,88521717,) “,sql); 根据对象类型以及指定条件自动生成一条select语句String sql =ModelToSQLUtils. prepareSelectSql(SampleTestModel. class, " name",'’ 2 = 2");System, out. println(sql);assertEquals (〃 select name from HELL0_W0RLD where 2 = 2〃,sql); 根据对象实例自动生成一条update语句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)。
权利要求
1.一种软件开发辅助工具包,其特征在于基于JDK1. 5或以上版本实现,适用于J2EE应用开发场景中的对象自动填值以及SQL自动生成处理。
2.一种软件开发辅助工具包,其特征在于利用Java反射(Reflection)机制,从而实现了对象属性名称集合的获取。
3.一种软件开发辅助工具包,其特征在于利用Java的标注(Annotation)机制,从而不需要依赖XML文件进行属性别名配置。
4.一种软件开发辅助工具包,其特征在于利用Java的接口 anterface)机制,从而灵活地实现了对象属性别名转义的自定义处理。
5.一种软件开发辅助工具包,其特征在于对象自动填值代码底层复用了 Apache Commons BeanUtils公用库中已有的方法。
6.根据权利要求1所述的软件开发辅助包,其特征在于不引入ORM框架的情况下,也能在很大程度上简化开发人员在涉及对象自动填值(Value Copy)以及SQL语句生成的代码量,以一种更简洁灵活地方式支持敏捷开发。
全文摘要
本发明提供了一种基于J2EE应用开发的代码辅助工具包。此工具包适应于在不引入ORM框架的情况下,也能在很大程度上简化开发人员在涉及对象自动填值(Value Copy)以及SQL语句生成的代码量,以一种更简洁灵活地方式支持敏捷开发。
文档编号G06F9/44GK102214092SQ201010504090
公开日2011年10月12日 申请日期2010年10月11日 优先权日2010年10月11日
发明者周环 申请人:新太科技股份有限公司