在软件开发的过程中,重复性工作是不可避免的。随着时间的推移,这种重复性工作会让人感到厌烦,因此寻找更高效的方法变得尤为重要。每当发现自己在不同的项目中重复做相同的事情时,就会开始寻找简化这个过程的方法。这就是尝试构建一个代码生成工具的动机,这个工具可以根据实体关系图(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;
}
}
}