构建代码生成工具

在软件开发的过程中,重复性工作是不可避免的。随着时间的推移,这种重复性工作会让人感到厌烦,因此寻找更高效的方法变得尤为重要。每当发现自己在不同的项目中重复做相同的事情时,就会开始寻找简化这个过程的方法。这就是尝试构建一个代码生成工具的动机,这个工具可以根据实体关系图(ERD)生成ORM类和存储过程。希望构建一个简单的工具,它可以跨多种数据库使用,并为多种编程语言生成源文件。虽然市面上有许多功能更复杂、价格更昂贵、功能更丰富的商业产品,但这个工具在许多情况下都能满足需求。

背景 这个工具的第一个版本可以为Sqlserver构建存储过程(SELECT ONE, SELECT ALL, INSERT, UPDATE, DELETE),并且可以根据配置生成Java、C#或VB.NET的ORM对象。这个工具很容易扩展到其他数据库。有许多工具可以做到同样的事情,并且提供更多此类功能,但想要一个简单的东西来满足目的。喜欢能够看到事物的源代码,并根据需要对其进行修改、扩展或简化。日常工作是使用C#和Sqlserver,这也是关注的重点。选择用Java编写这个工具,没有特别的原因。使用Eclipse编写了这个代码。已经包含了所有的源代码。

使用代码 这个程序包含4个包,大约14个类。程序的入口点是下面列出的Main.java。确保根据需要设置配置。定义了几个枚举来帮助做出好的选择。目前只实现了Microsoft Sqlserver数据库过程构建器。Java、C#和VB.NET都在类生成方面构建,但必须在Main.java中定义语言,如下所示。创建并准备好具有写入权限的文件夹,以接受创建的文件。在AdventureWorks2012数据库上测试了这个程序,它非常大,但没有遇到任何问题。目前没有办法跳过某些表,所以可能会有一些不需要ORM类的表的废弃类和过程。这个程序不会为构建任何复杂的SQL逻辑或类关系。它为它看到的每个表写一个类,并为它看到的每个表写五个存储过程。

package builder; import common.DatabaseServerType; import common.DomainObjectLanguage; import common.ProcedureBuildType; import domainclassbuilder.CSharpClassWriter; import domainclassbuilder.JavaClassWriter; import domainclassbuilder.VisualBasicClassWriter; import sqlprocedurebuilder.MSSQLProcBuilder; import sqlprocedurebuilder.MSSQLProcWriter; import sqlprocedurebuilder.ProcBuilder; public class Main { public static void main(String[] args) { DatabaseServerType lDatabaseServerType = DatabaseServerType.MICROSOFTSQLSERVER; ProcedureBuildType lProcedureBuildType = ProcedureBuildType.ONEFILEALLTABLES; DomainObjectLanguage lDomainObjLang = DomainObjectLanguage.VISUALBASIC; String lAbsoluteProcedureDirectoryLocation = "C:/Build/Procedures"; String lAbsoluteClassDirectoryLocation = "C:/Build/Classes"; String lDbName = "NOP360DEV"; String lDbConnection = "jdbc:sqlserver://RHODES-PC\\RHODES_HOME_PC;database=NOP360DEV"; String lDbUser = "sa"; String lDbPassword = "password"; String lAuthor = "Giancarlo Rhodes"; String lOneFileName = "AllProcedures.SQL"; ProcBuilder lProcBuilder = null; switch (lDatabaseServerType) { case MICROSOFTSQLSERVER: ProcBuilder._dbname = lDbName; ProcBuilder._dbconnection = lDbConnection; ProcBuilder._dbusername = lDbUser; ProcBuilder._dbuserpassword = lDbPassword; lProcBuilder = new MSSQLProcBuilder(ProcBuilder._dbname, ProcBuilder._dbconnection, ProcBuilder._dbusername, ProcBuilder._dbuserpassword); MSSQLProcWriter lMSSQLProcWriter = new MSSQLProcWriter(lAbsoluteProcedureDirectoryLocation, lProcBuilder); lMSSQLProcWriter.Write(lProcedureBuildType, lAuthor, lOneFileName); break; case ORACLE: // TODO - IMPLEMENT break; case MYSQL: // TODO - IMPLEMENT break; default: break; } switch (lDomainObjLang) { case VISUALBASIC: VisualBasicClassWriter lVBClassWriter = new VisualBasicClassWriter(lAbsoluteClassDirectoryLocation, lProcBuilder, lAuthor, lDatabaseServerType); lVBClassWriter.BuildAllClasses(); break; case CSHARP: if (lDatabaseServerType == DatabaseServerType.MICROSOFTSQLSERVER) { lProcBuilder = new MSSQLProcBuilder(ProcBuilder._dbname, ProcBuilder._dbconnection, ProcBuilder._dbusername, ProcBuilder._dbuserpassword); } CSharpClassWriter lCSharpClassWriter = new CSharpClassWriter(lAbsoluteClassDirectoryLocation, lProcBuilder, lAuthor, lDatabaseServerType); lCSharpClassWriter.BuildAllClasses(); break; case JAVA: if (lDatabaseServerType == DatabaseServerType.MICROSOFTSQLSERVER) { lProcBuilder = new MSSQLProcBuilder(ProcBuilder._dbname, ProcBuilder._dbconnection, ProcBuilder._dbusername, ProcBuilder._dbuserpassword); } JavaClassWriter lJavaClassWriter = new JavaClassWriter(lAbsoluteClassDirectoryLocation, lProcBuilder, lAuthor, lDatabaseServerType); lJavaClassWriter.BuildAllClasses(); break; default: break; } } }

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485