生成数据库操作代码的方法和装置的制造方法

文档序号:10724921阅读:259来源:国知局
生成数据库操作代码的方法和装置的制造方法【专利摘要】一种生成数据库操作代码的方法和装置。方法包括:第一步骤,采用抽象化描述,将数据库信息,表信息以及数据库操作信息在配置文件中配置,第二步骤,利用代码生成引擎解析所述配置文件,将数据库信息,表信息以及数据库操作信息,转换为具有层次结构及关联的基础对象,第三步骤,对SQL语句进行解析,获取其输入输出参数信息,并将该SQL语句转换为特定数据库及编程语言下的执行语句,第四步骤,根据基础对象的关联关系,生成源文件。【专利说明】生成数据库操作代码的方法和装置
技术领域
[0001]本发明的实施例涉及生成数据库操作代码的方法和装置。【
背景技术
】[0002]MVC框架作为现有信息系统的主流框架,很好的将页面显示与业务逻辑分离开。MVC框架中的Μ层,主要为数据库操作层。随着业务量的扩展,往往需要将现有的业务系统向不同的数据库迀移,并且使用不同的编程语言进行开发。随着云计算技术的发展,这一趋势也正在加剧,去Ι0Ε化概念孕育而生。因此原有MVC架构中较为稳定的数据操作层也面临着较大变化的可能。现有技术方案为不同编程语言和数据库开发相应的数据库操作代码,开发以及维护的工作量都相当大,并且容易引入错误。此外业务开发人员需要熟悉具体不同语言,不同数据库操作API的使用以及关注报错等细节,开发难度较大。[0003]以下是现有技术中的一些缺点。[0004]1.利用现有的业务系统在进行数据库操作时,需要针对不同编程语言,不同数据库,调用相应的API,当编程语言及数据库发生变化的时候,需要针对相同业务功能,重新开发一套数据库操作代码,工作量相当大,并且非常容易引入缺陷。[0005]2.对于一个SQL语句对应的操作函数,需要人工确定需要的输入,输出参数,参数的类型,以及排列顺序,工作量相当繁琐,并且非常容易引入错误。[0006]3.不同数据库的元数据描述形式差异较大,不同的程序数据类型也是各不相同,任何数据库操作首先要考虑的是数据库字段和程序数据类型之间的转换,而二者的映射关系之和为数据库种类与编程语言数量的笛卡尔乘积,因此无论是扩展到不同的编程语言实现还是移植到不同的数据库平台,都需要大量重复的工作。[0007]4.由于数据库表本身随着业务的变化,将引发字段的增删改,在很多情况下,将影响大多数的数据库操作语句,因此,需要有专门的机制,能够辅助发现需要变化的数据库操作代码,甚至能自动适应数据库表的变化。[0008]5.由人工编写的数据库操作语句,也很可能引入拼写或者语法方面的错误,这些错误可能需要在编译,甚至执行阶段才会被发现,严重影响业务系统的开发质量。[0009]6.在一般情况下,如果sql语句发生执行错误,需要在报错日志中打印相关的输入参数值,如insert语句主键需要打印对应的主键字段,而select语句查找不到记录需要打印对应的条件字段,人工方式编写报错语句非常容易引起字段顺序或者类型不匹配等错误,轻则无法正常显示信息,重则引发程序coredump。[0010]7.在很多业务系统中,需要将业务数据分表存放,针对不同表的数据库操作代码除了表名的差异,基本是一致的,如果人工开发并维护这些代码,带来的工作量也是巨大的。[0011]8.若采用Mysql集群替代Db2存储数据,需要将同一张表的数据进行切分,并分库存放,这也是对数据库操作代码的重大改造,这也要求将数据库操作的逻辑与集体实现分离。【
发明内容】[0012]本发明的主要思想是将数据库操作定义与具体实现代码分离,使业务系统的开发人员能够从繁琐的数据库操作底层实现中解放出来。基于这个思想提出了一套基于XML的数据库代码生成配置方式,以及对应的配置解析及代码生成框架。这个思想将原有MVC架构中的数据库操作层分离为和具体数据库以及编程语言无关的数据库操作抽象描述层以及具体实现层,由代码生成引擎自动完成抽象层向具体实现层的转化。[0013]通过解析数据库操作定义配置文件,结合自动获取的数据库表元数据信息,在代码生成框架下编写针对特定数据库及编程语言的个性化生成代码,可以任意生成基于不同数据库API,不同编程语言的数据库操作代码,甚至生成对应的编译文件,从而对于业务代码的开发人员实现了所见即所得,即只需指定对应的SQL语句,而无需考虑在不同数据库,不同编程语言下的实现。[0014]本发明的一个实施例引入了数据库全表字段替换标记以及黑名单机制,从而能很好的适应表字段的变化;能生成任意多套表及任意表套数规则的数据库操作代码;能够自动确定大多数数据库操作函数的传入,传出参数及数据类型,简化了数据库操作的配置;能够自动化的解析大多数SQL语句以检查该SQL语句是否具有语法错误,以避免编译,执行过程中的错误;能够自动在报错信息中打印相关字段的取值,以便业务人员准确的定位错误原因。[0015]本发明减轻业务代码开发人员的工作量及难度,降低数据库操作代码出错的可能性,减少代码后续维护的工作量,减少数据库系统整体迀移的难度及工作量。[0016]为此,根据本发明的一个或多个实施例,公开一种生成数据库操作代码的方法,包括:第一步骤,采用抽象化描述,将数据库信息,表信息以及数据库操作信息在配置文件中配置,第二步骤,利用代码生成引擎解析所述配置文件,将数据库信息,表信息以及数据库操作信息,转换为具有层次结构及关联的基础对象,第三步骤,对SQL语句进行解析,获取其输入输出参数信息,并将该SQL语句转换为特定数据库及编程语言下的执行语句,第四步骤,根据基础对象的关联关系,生成源文件。[0017]根据本发明的一个或多个实施例,公开一种生成数据库操作代码的装置,包括:第一单元,采用抽象化描述,将数据库信息,表信息以及数据库操作信息在配置文件中配置,第二单元,利用代码生成引擎解析所述配置文件,将数据库信息,表信息以及数据库操作信息,转换为具有层次结构及关联的基础对象,第三单元,对SQL语句进行解析,获取其输入输出参数信息,并将该SQL语句转换为特定数据库及编程语言下的执行语句,第四单元,根据基础对象的关联关系,生成源文件。[0018]当结合附图阅读以下描述时也将理解本发明的实施例的其它特征和优势,其中附图借助于实例示出了本发明的实施例的原理。【附图说明】[0019]图1是根据本发明实施例的生成数据库操作代码的方法的步骤示意图。[0020]图2是根据本发明实施例的代码生成引擎对XML配置文件进行解析生成对象的图不。【具体实施方式】[0021]在下文中,将结合实施例描述本发明的原理。应当理解的是,给出的实施例只是为了本领域技术人员更好地理解并且实践本发明,而不是限制本发明的范围。本说明书中包含的具体的实施细节不应被解释为对发明的范围或可能被要求保护的范围的限制,而是应该被视为特定于实施例的描述。有利地,在各实施例的上下文描述的特征可被组合在单一实施例中来实施。在单一实施例的上下文中描述的特可在多个实施例来实施。[0022]图1是根据本发明实施例的生成数据库操作代码的方法的步骤示意图。[0023]第一步骤,采用抽象化描述,将数据库信息,表信息以及数据库操作信息在配置文件中配置。[0024]第二步骤,利用代码生成引擎解析所述配置文件,将数据库信息,表信息以及数据库操作信息,转换为具有层次结构及关联的基础对象。[0025]第三步骤,对SQL语句进行解析,获取其输入输出参数信息,并将该SQL语句转换为特定数据库及编程语言下的执行语句。[0026]第四步骤,根据基础对象的关联关系,生成源文件。[0027]在前述实施例中,该XML配置文件可以包括生成数据库操作代码的元素。。一个较复杂,包含了所有特殊情况的XML配置文件内容如下所示。[0029]根据该XML配置文件,Db根节点对应数据库配置信息,包括数据库类型(type)、数据库操作基于的编程语言(language),api编程模式(mode,分别有static以及dynamic等取值,对应静态Sql及动态Sql)、数据分布模式(dataMode,分别有single及cluster取值,对应单机模式及集群模式)、数据库IP(ip)、数据库端口(port)、数据库名(name)、用户名(user)以及密码信息(pass)。数据库代码生成引擎将根据数据库类型,并带入数据库IP等数据库连接信息,调用相应的连接数据库函数,以获取对应数据库的元数据信息。[0030]Db根节点的一个子节点为Tbl,对应表信息,主要包括表名(name),数据库代码生成引擎将根据数据库类型调用相应的元数据获取API,获取该表的元数据信息,包括所包含的数据库字段、及字段长度和类型信息、代码生成引擎将默认生成包含表所有字段的结构体(或者类)。表信息还包括表套数(tableNum)以及表套数模式(tableMode),对于配置了表套数的表,对应的操作函数将自动包含当前表套数作为参数,同时检查输入的表套数参数的合法性。对于静态数据库编程代码,代码生成引擎将对数据库操作针对不同表套数进行扩展。表套数模式对应不同套号表的命名方式,主要有MMDD(月日表),NN(顺序表)等。[0031]Tbl节点下的主要的子节点为Opr,对应的是数据库操作信息。主要属性包括操作类型(tp,主要有declare,select,insert,update,delete)以及对应的操作名后缀(suffiX,将作为对应操作函数或者方法的后缀)。[0032]Stmt为Opr的可选子节点,当该节点未配置的时候,默认本操作为无where条件的全字段操作。该节点的sql属性为对应的sql语句,where条件的右值以$符号加参数序号表示。Sql语句中的字段列表可以用[field_list]、[value_list]、[set_list]替代,代码生成引擎将根据获取的元数据信息,自动对这些列表进行替换,考虑到某些字段需要单独进行设置(比如采用数据库时间〇111^6111:_1:;[11168七311^1),通过131301^^8七?1(18节点的配置,还可以指定黑名单字段,黑名单字段将自动被排除。字段列表替换加上黑名单机制,有效的减少了配置的冗余,将数据库字段变化的影响降低到了最小的程度。[0033]BindParam以及BindResult节点为Stmt的子节点,分别对应操作的传入传出参数及其类型信息。在大多数情况下,该节点无需配置。代码生成引擎将对SQL语句进行语法分析,自动获取需要传入以及传出字段名及类型,具体规则将在下文详细介绍。对于多表操作等特殊SQL或者需要自定义参数名和类型的情况下,需要对其进行配置。数据库操作函数(方法)的参数除了可以是数据库表对应的默认结构体,还可以是用户自定义的结构体,甚至可以是单独的原始类型参数。[0034]Struct节点用来对自定义的结构进行配置。Struct节点既可以作为Db节点的子节点(该结构定义在数据库全局的头文件中),也可以作为Tbl节点的子节点(该结构只在该表对应的头文件种定义)。其子节点Fid用来配置自定义结构的字段信息,属性(tp)为字段类型,其中字段类型为定义的通用程序类型,分别取值String,Int32,Int64,Double,Float,Bool,这些通用类型定义将被代码生成引擎转换为对应编程语言的相应类型。Length为可选属性,仅当为String类型的时候有效。此外,字段类型还可以直接来自于表的对应字段,以src属性表示,该属性的取值为表名和字段名以点号分割的字符串,当前表用$tb1表示(仅当该节点为Tb1节点子节点的时候有效)。[0035]根据本发明的该实施例,生成数据库操作代码的方法,包括以下步骤。[0036]第一步骤,采用通用的抽象化描述,将数据库信息,表信息以及数据库操作信息在配置文件中配置。例如,配置在XML文件中。[0037]第二步骤,利用代码生成引擎解析配置,将数据库信息,表信息以及数据库操作信息,转换为具有层次结构及关联的基础对象。图2是根据本发明实施例的代码生成引擎对XML配置文件进行解析生成对象的图示。在该实施例中,参考上述示例XML元素结构定义对代码生成引擎要分析的XML配置文件进行描述。如图2所示,在该示例中,根据面向对象的思想,将配置信息转换为具有层次关系类结构,主要的类包括:数据库(Database)、表(Table)、结构(Struct)、域(Field)、操作(Operation)、函数(Function),源文件(File)以及代码生成引擎(CodeEngine)。首先根据编程语言,api编程模式,数据分布模式,初始化对应的代码生成引擎,根据数据库类型实例化对应的数据库对象,然后,调用数据库对象的Connect方法连接数据库,对该数据库包含的所有表,调用GetMetadata方法,获取该表的元数据信息。记录每个字段的通用数据库类型,例如Char、Varchar、Bit、Decimal、Timestamp。其中Char及Bit类型需要记录长度信息,Decimal类型需要记录整数及小数的位数。最后根据其通用数据类型生成对应的Field对象,完善其通用程序类型信息,并将每个字段对应的Field对象加入该表包含的Field列表。[0038]第三步骤,对SQL语句的自动解析,获取其输入输出参数信息,并转换为特定数据库及编程语言下的执行语句。[0039]首先对字段列表结合黑名单列表进行替换,然后对整条SQL语句进行语法分析,获取该SQL语句对应的传入传出字段及其类型。可以借鉴PostgreSQL数据库的语法规则描述,采用Lexer和Yacc系的词法和语法解析工具生成语法树,对SQL语句进行完备的语法分析。考虑到一般业务系统中的SQL语句并不复杂,并且不需要很完整的获取对应SQL的语义信息,因此也可以采用简化的方法。[0040]在一些示例中,对Select操作的解析流程如下:[00411(1)判断该SQL语句是否有Where关键字,如果有,对其匹配正则表达式'\s*\(?select\s+(.+?)\s+from\s+(.+?)\s+where\s+(·+)\)?',从而获取字段列表子句以及Where子句。如果没有,贝lj匹配以下正则表达式'\s*\(?select\s+(.+?)\s+from\s+(.+)\)?',获取字段列表子句。[0042](2)对字段列表子句调用split函数,分隔符为逗号,对每个分割后的元素应用正则表达式'(.+)\s+as\s+(.+)',如果无法匹配,说明对应字段没有别名,当前元素即为传出参数名,类型为对应字段类型。否则,则取别名为传出参数名,而参数类型取决于对应的聚集函数,若为SUM,则结合对应字段类型,分别取INT64或者DOUBLE;若为MIN或者MAX,则直接取对应字段类型;若为COUNT,则固定为INT64。[0043](3)对Where子句的解析规则为,在where子句中依次遍历$n(n为参数序号)关键字,若找到,则向前回溯,找到的第一个非关键字及非运算符则为对应的字段名,当前传入参数类型取对应的字段类型,参数名前缀为对应字段名,后缀为字段当前的复用次数。[0044]在一些示例中,对Insert操作的解析流程如下:[0045](1)对SQL语句匹配正则表达式'insert\s+into\s+(.+)\s*\((.+)\)\s+values\((.+)\)',获取字段列表语句以及值列表语句。[0046](2)对字段列表以及值列表语句分别调用split函数,分隔符为逗号,获取字段列表以及值列表。[0047](3)搜索值列表,匹配$n(n为参数序号)关键字,若匹配到,则该传入参数名和类型均同对应的字段列表中的字段。[0048]在一些示例中,对delete操作的解析流程如下:[0049](1)判断该SQL语句是否有Where关键字,如果有,对其匹配正则表达式'delete\s+from\s+(.+?)\s+where\s+(·+)',获取对应的where子句。[0050](2)对where子句的解析规则同select操作中描述。[0051]在一些示例中,对update操作的解析流程如下:[0052](1)判断该SQL语句是否有Where关键字,如果有,对其匹配正则表达式'update\s+(.+)\s+set\s+(.+?)\s+where\s+(·+)',获取对应的赋值子句及where子句,否则应用正则表达式,update\s+(.+)\s+set\s+(·+)',获取赋值子句。[0053](2)在赋值子句中依次遍历$n(n为参数序号)关键字,若找到,则向前回溯,排除等号的第一个非关键字则为对应的字段名。[0054](3)对where子句的解析规则同select操作中描述。[0055]在解析出默认操作参数信息之后,在应用自定义的参数名及类型配置信息,对其进行更新,从而获得最终的参数信息。根据编程语言,api编程模式,数据分布模式等配置信息,生成操作对应的函数。对于sql语句中拼写错误(或者命名变化)的字段,将很容易由工具分析出,并提供相应的报错,以提示开发人员进行修改。[0056]第四步骤,根据基础对象的关联关系及基本信息,生成包含结构定义,结构声明,全局变量定义,函数定义,函数声明,注释信息以及编译信息的源文件。[0057]相关领域的技术人员当结合附图阅读前述说明书时,对本发明的前述示例性实施例的各种修改和变形对于相关领域的技术人员会变得明显。因此,本发明的实施例不限于所公开的特定实施例,并且变形例和其它实施例意在涵盖在所附权利要求的范围内。【主权项】1.一种生成数据库操作代码的方法,其特征在于,包括:第一步骤,采用抽象化描述,将数据库信息,表信息以及数据库操作信息在配置文件中配置,第二步骤,利用代码生成引擎解析所述配置文件,将数据库信息,表信息以及数据库操作信息,转换为具有层次结构及关联的基础对象,第三步骤,对SQL语句进行解析,获取其输入输出参数信息,并将该SQL语句转换为特定数据库及编程语言下的执行语句,第四步骤,根据基础对象的关联关系,生成源文件。2.如权利要求1所述的方法,其特征在于,所述配置文件是XML配置文件,该XML配置文件包括用于生成数据库操作代码的元素。3.如权利要求1所述的方法,其特征在于,所述源文件包含结构定义,结构声明,全局变量定义,函数定义,函数声明,注释信息以及编译信息。4.如权利要求2所述的方法,其特征在于,该XML配置文件包括作为根元素的数据库元素,该数据库元素的属性定义用于调用数据库的连接API的参数和编程语言。5.如权利要求4所述的方法,其特征在于,该XML配置文件包括作为数据库元素的子元素的表元素,该表元素的属性定义用于调用表元数据获取API的参数。6.-种生成数据库操作代码的装置,其特征在于,包括:第一单元,采用抽象化描述,将数据库信息,表信息以及数据库操作信息在配置文件中配置,第二单元,利用代码生成引擎解析所述配置文件,将数据库信息,表信息以及数据库操作信息,转换为具有层次结构及关联的基础对象,第三单元,对SQL语句进行解析,获取其输入输出参数信息,并将该SQL语句转换为特定数据库及编程语言下的执行语句,第四单元,根据基础对象的关联关系,生成源文件。7.如权利要求6所述的装置,其特征在于,所述配置文件是XML配置文件,该XML配置文件包括用于生成数据库操作代码的元素。8.如权利要求6所述的装置,其特征在于,所述源文件包含结构定义,结构声明,全局变量定义,函数定义,函数声明,注释信息以及编译信息。9.如权利要求7所述的装置,其特征在于,该XML配置文件包括作为根元素的数据库元素,该数据库元素的属性定义用于调用数据库的连接API的参数和编程语言。10.如权利要求8所述的装置,其特征在于,该XML配置文件包括作为数据库元素的子元素的表元素,该表元素的属性定义用于调用表元数据获取API的参数。【文档编号】G06F17/30GK106095792SQ201610370032【公开日】2016年11月9日【申请日】2016年5月27日【发明人】倪剑龙【申请人】中国银联股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1