【Java开源代码栏目提醒】:以下是网学会员为您推荐的Java开源代码-NHibernate代码生成器 - 讲义教程,希望本篇文章对您学习有所帮助。
2009.2009.11NHibernate是一个面向.NET环境的对象/关系数据库映射工具。
NHibernate很好地实现了关系型数据库到面向对象实体的映射并且提供数据查询和获取数据的方法从而大幅度减少开发时人工使用SQL和ADO.NET处理数据的时间提高了效率和安全性。
但是在使用NHibernate之前需要手写大量配置文件和POJO类并且一旦有错误就会导致整个程序的错误也就提高了整个项目的复杂性。
那么如何才能有效地去完成这项
工作呢在此将向大家介绍NHibernate的
代码生成器同时也可以参考实现其他功能的
代码生成器。
1实现原理综合大部分的
代码生成器不难看出绝大多数都采用了XML、XSLT技术。
其主要原因在于首先XML的国际标准化其次XML可以表示层次结构有利于。
而XSLT是一种将XML文档转换为其他文本文档的语言它是建立在XML和XPath之上的国际标准功能强大。
两者结合可以很容易实现
代码生成功能。
考虑到NHibernate是ORM工具而XML可以很容易地实现数据表的层次结构同时C语言中包含了实现对XML和XSLT的操作的类库。
所以在此也将采用XML、XSLT技术实现NHibernate
代码生成器。
基本的原理如图1所示。
2设计原理要实现将关系数据库模型通过
代码生成器映射为所需要的
代码首先要将关系数据库模型转换为
代码生成器可以读取的文件然后
代码生成器从这些输入文件中提取出模型中的信息并生成相应的
代码。
那么在这里使用的是XML文档就必须将关系型数据库模型转换为XML文档。
为了实现较好的通用性本
代码生成器可以实现Access、MsSQL、Oracle这三个数据库转换功能。
接着将使用XSLT作为模板完成从XML到
代码的转换过程从而实现
代码生成器的基本功能。
2.1数据库模型到XML文档的转换这里关键是获取数据库的基本信息包括表、字段、索引、键等这次都可以通过数据库中的系统表获得下面给出3个数据中数据库的基本信息获取方法。
对于MsSQLServer数据库中有SysObjects和SysColumns这两个系统表可以查询系统表来获得所有的表名称和字段名称以及格式还有一个sp_helpindex的系统预定义存储过程来获得指定表的字段索引信息。
对于Oracle数据库有一个名为Col的
系统预定义视图可以
查询这个视图获得所有的表名和字段定义信息。
还有一个user_ind_columns的系统预定义视图可以获得关键字段信息。
对于Access2000数据库没有这些系统表因此使用.
NET框架中的OleDB数据连接对象的GetOleDbSchemaTable函数来获得数据库表和字段定义信息。
现在通过上面的方法可以获取数据库的信息后面要做的就是将它生成指定的XML
文档。
GetTableXMLstringtableName方法实现了读取数据库信息并生成XML字符串的功能。
////实现对单个表的转换为XML
文档的函数////表名//XML字符串publicstringgetSQLTableXMLstringtableNamestringfieldTypestringstrSQLnull//用户查询单个表中的字段属性strSQLselectsysobjects.namesyscolumns.namesystypes.namesyscolumns.lengthsyscolumns.isnullablesysobjects.typefromsyscolumnssysobjectssystypeswheresyscolumns.idsysobjects.idandsyscolumns.xusertypesystypes.xusertypeandsysobjects.typeUorsysobjects.typeVandsystypes.name_default_andsystypes.namesysnameandsysobjects.nametableNameorderbysysobjects.namesyscolumns.nameDataViewmydvSQLHelper.ExecuteDataViewstrSQLStringBuildersbnewStringBuilder//构建XML字符串NHibernate
代码生成器李伟摘要采用
代码生成技术能大幅度提高软件开发的质量和生产率降低软件开发的风险。
文中讲解了基于C的NHibernate
代码生成器的
设计与实现过程并分析了常见的
代码生成技术同时结合实例说明核心源
代码。
关键词
代码生成器CNHibernateXML172009.11ifmydv.Count0sbAppendsbAppendsbAppendusingSystemsbAppendsbAppendtestsbAppendsbAppendmydv00ToStringsbAppendforinti0irole_idintint4role_namevarchar50role_remarkvarchar100这样就完成了数据库模型向XML文档的转换。
这里需要注意的是转换中要将数据库数据类型转换为C语言或其他语言的数据类型。
代码如下所示privatestringgetTypestringdbtypeswitchdbtypecasevarchar:…returnstringcasedate:…returnDateTime…return2.2制定生成
代码的模板XSLT是一种将XML文档转换为其他文本文档的语言它是建立在XML和XPath之上的国际标准功能强大。
这里使用XSLT作为模板可以方便地将XML文档转换为具体的
代码。
下面是一个简单的模板用于生成POJO类usingSystemnamespacepublicclass_182009.2009.11publicgetreturn_set_Vaue当然模板可以自己定义然后在程序中动态地加载从而实现多语言
VB.NET、
Java等并且可以设计自己的专用模板来生成自己想要的
代码。
2.3将XML转换为
代码现在已经完成了XML和XSLT这两个文档下面就是.NET平台下的System.Xml.Xsl.XslCompiledTransform类来实现生成
代码xmg.getTaeXMLt_sys_rol//获取表的基本信息存储到XML文件中Systm.Xm.Xs.XsCompTransformtransformnewSystm.Xm.Xs.XsCompTransformtransform.Loa_HN_POJO.xst//加载POJO的XSLT文件transform.Transform“roe.xm””roe.cs”//使用Transform方法实现
代码的生成生成文件为roe.cs//复制生成文件到指定的目录下System.IO.Fe.CopyprojectPathroe.cstxtProjectFoder.Textmappngtruetransform.Load_HN_HBM.xst//加载HBM的XSLT文件transform.Transform“roe.xm””roe.hbm.xm”System.IO.Fe.CopyprojectPathroe.hbm.xmtxtProjectFoder.Textmappngtrue通过以上的
代码完成了将role.xml转换为role.cs的过程。
生成后的
代码效果如下usngSystemnamespacetestpubccasst_sys_roent_roe_d…pubcnt_roe_dgetreturn_roe_dset_roe_dVaue…同时也生成了需要的hbm.
xml文件。
3程序构架
程序的整个结构如图1所示。
其中的
代码核心部分在KitCore类库中DataBaseInfo.cs、FieldInfo.cs、TableInfo.cs分别用于表述数据库信息、字段信息、表信息。
2SQLHelper.cs主要实现操作SQL数据库的帮助类。
3GenerateCore.cs主要实现
代码生成的类。
NHibernateKit应用程序是主要完成界面的功能MainForm.cs是主界面AboutBox.cs是
软件信息KitHelper.cs是一些帮助类。
界面如图2用于数据库的连接、图3选择生成的数据表、图4设置相关的参数、图5生成
代码、图6设置用于生成的模板。
3.1获取本地的SQL服务器名prvatevodbtnRrs_CkojtsnrEvntArstryts.CursorCursors.WatCursor//修改鼠标的状态为沙漏状//获取本地计算机SQL服务器名图1程序结构图192009.11图3图2图4图5202009.2009.11图6cmbServerNames.DataSourceSystem.Data.Sql.SqlDataSourceEnumerator.InstanceGetDataSourcescmbServerNamesDisplayMemberServerName…3.2获取指定服务器下的数据库列表privatevoidcmbDatabaseNames_DropDownobjectsenderEventArgsetrythisCursorCursorsWaitCursor/通过SQLHelpercs中的getDataSet方法返回数据//源其中selectnamedbidfromsysdatabases用于返回服务//器中的所有数据库。
cmbDatabaseNamesDataSourceSQLHelpergetDataSetselectnamedbidfromsysdatabasescmbDatabaseNamesDisplayMembernamecmbDatabaseNamesValueMemberdbid…3.3获取指定数据库下的数据表
列表privatevoidbtnNext_ClickobjectsenderEventArgse…thisCursorCursorsWaitCursorSetConnectionStringDataTabledtdataClassExecuteReaderSELECTTableNamesonameIDsoidFROMsysobjectssoWHEREOBJECTPROPERTYso.idIsMsShipped0ANDsoxtypeUchklistTablesItemsClearforeachDataRowdrindtRowschklistTablesItemsAdddrTableName…3.4生成
代码按钮的
代码privatevoidtoolStripButton1_ClickobjectsenderEventArgse//调用GenerateCorecs中的Generate方法来生成
代码。
//绝大部分
代码已经在设计原理中给出了这里不在重复给出了SystemThreadingThreadtnewSystemThreadingThreadnewSystemThreadingThreadStartgcGeneratetStart图3、4、6主要是一些参数的设置其
代码部分比较简单在此不一一列出了。
4结语主要讨论了通过XML、XSLT技术来设计NHibernate
代码生成器使用XML来描述数据库结构而XSLT来完成模板功能最后通过C语言完成
代码的生成目前
代码生成技术已经广泛地应用到实际的项目开发之中大量的单位和个人都进入到这个方面通过设计模型驱动编码的思想已经逐步开始实现并应用到实际项目之中参考文献1陈翔王学斌吴泉源.
代码生成技术在MDA中的实现.
计算机应用研究200647.2范秋生.XML的
代码生成器.长江大学学报自然科学版20085:2.3王忠杰战德臣徐晓飞.基于对象关系模型的企业应用软件
代码生成器.计算机集成制造系统2007502.4袁永福.C发现之旅.收稿日期2009-4-621