本申请涉及数据处理
技术领域:
:,尤其涉及一种根据模型描述同步数据库表结构的方法及设备。
背景技术:
::为了对数据库表结构进行有效的管理,常将数据库表结构进行统一描述,方便同步数据库表结构。常见的描述方法有以下三种:1.采用实体映射框架(如hibernate、mybatis),将表结构描述成代码中的实体,通过标注或者配置的方式与数据库建立映射关系。但是这种方法不能使用户直接了解到整个产品数据库中有多少张表,也不知道每张表具体的表结构,不具备直观性。2.单独使用一份结构去描述表结构,并对其进行管理。这种方式虽然能够清楚了解到数据库表的结构,但是因为它是独立的一种结构,无法对其进行检查,很难保证描述的正确性和一致性。3.使用sql语句描述表结构。该方法在表结构变更时都要使用单独的sql语句描述,且不同类型的数据库的sql描述都是不同的,管理复杂且不够直观。技术实现要素:本申请实施例提供了一种根据模型描述同步数据库表结构的方法及设备,用以解决现有的描述数据库表结构的方式无法有效管理数据库表结构的技术问题。一方面,本申请实施例提供了一种根据模型描述同步数据库表结构的方法,包括:将数据库表结构抽象为第一数据库对象模型描述;获取数据库连接信息及设置信息,构造hibernate服务注册构造器;获取并解析第二数据库对象模型描述,映射成抽象语法树,根据抽象语法树生成实体类;其中,第二数据库对象模型描述是基于第一数据库对象模型描述修改得到的;基于hibernate服务注册构造器,创建实例,以根据实体类与数据库表结构的差别生成结构化查询语言,同步数据库表结构。在本申请的一种实现方式中,将数据库表结构抽象为数据库对象模型描述,具体包括:将不同类型数据库的表结构抽象为一种第一数据库对象模型描述。在本申请的一种实现方式中,将不同类型数据库的表结构抽象为一种第一数据库对象模型描述,具体包括:基于不同类型数据库的表结构的共性,对不同类型数据库的表结构的特性进行扩展描述,以得到一种第一数据库对象模型描述;第一数据库对象模型描述包括不同类型数据库的表结构的共性和特性。在本申请的一种实现方式中,映射成抽象语法树之前,所述方法还包括:判断第二数据库对象模型描述的修改是否与相应的数据库兼容。在本申请的一种实现方式中,获取并解析第二数据库对象模型描述,映射成抽象语法树,根据抽象语法树生成实体类,具体包括:获取数据库对象模型描述列表;将数据库对象模型描述列表中的每一个第二数据库对象模型描述都映射成相应的抽象语法树;其中,每个抽象语法树对应一个实体类;针对各抽象语法树,遍历该抽象语法树,根据该抽象语法树的各个节点生成实体类;其中,抽象语法树的各个节点分别对应相应第二数据库对象模型描述的各个属性。在本申请的一种实现方式中,根据抽象语法树生成实体类,具体包括:根据抽象语法树生成hibernate映射表结构的实体类;其中,实体类包括hibernate映射表的标注。在本申请的一种实现方式中,根据实体类与数据库表结构的差别生成结构化查询语言,同步数据库表结构,具体包括:根据hibernate映射表的映射关系,对比实体类中列的结构和数据库表结构的差别,以生成创建或增量结构化语言,同步数据库表结构。在本申请的一种实现方式中,根据抽象语法树生成实体类之后,方法还包括:调用javac命令对实体类进行编译,以得到字节码文件,将字节码文件存入脚本目录中;扫描脚本目录,使用指定的类加载器加载字节码文件。在本申请的一种实现方式中,创建实例之前,方法还包括:使用hibernate服务注册构造器构造服务注册中心;通过服务注册中心创建元数据源;将编译后的实体类添加至元数据源的被标注类列表中;其中,被标注类列表用于存放扫描到的编译后的实体类;通过编译后的实体类中的标注,初始化实体类及其与数据库的映射关系。另一方面,本申请实施例还提供了一种根据模型描述同步数据库表结构的设备,设备包括:处理器;及存储器,其上存储有可执行代码,当可执行代码被执行时,使得处理器执行如上述的一种根据模型描述同步数据库表结构的方法。本申请实施例提供的一种根据模型描述同步数据库表结构的方法及设备,至少包括以下有益效果:将数据库表结构抽象为数据库对象模型描述,表结构的同步全部使用模型去同步,可以直观且有效的管理数据库表结构。基于hibernate,根据实体类与数据库表结构的差别生成sql来同步数据库表结构,解决了表数据库表结构可能和实体类中的描述不一致的问题。此外,hibernate是一种java框架,本申请将数据库表结构的同步与hibernate进行集成,使得数据库对象模型描述能够应用于java语言中。附图说明此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:图1为本申请实施例提供的一种根据模型描述同步数据库表结构的方法流程图;图2为本申请实施例提供的一种根据模型描述同步数据库表结构的设备结构示意图。具体实施方式为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。为实现同步数据库表结构,并对其进行维护和管理,常对数据库的表结构进行统一描述。常见的描述方法有以下三种:采用java相关实体映射框架、单独使用一份结构去描述表结构、使用sql语句描述表结构。其中,java相关实体映射框架(如hibernate、mybatis)是基于实体类和数据库表结构之间的映射关系对表结构进行同步,这种方法不能使用户直接了解到整个产品数据库中有多少张表,也不能知道每张表具体的表结构,不具备直观性。单独使用一份结构去描述表结构虽然能够清楚数据库表的结构,但是因为它是独立的一种结构,与数据库及代码之间不具备连接关系,无法对其进行检查,因此很难保证描述的正确性以及和数据库表结构的一致性。使用sql语句描述表结构,该方法在表结构变更时都要使用单独的sql语句描述,了解完整的表结构也需要单独的sql语句来执行,用户无法直观了解表结构。且不同类型的数据库的sql语句都是不同的,管理复杂。本申请实施例提供了一种根据模型描述同步数据库表结构的方法及设备,用以解决现有的描述数据库表结构的方式无法有效管理数据库表结构的技术问题。下面通过附图对本申请实施例提出的技术方案进行详细的说明。图1为本申请实施例提供的一种根据模型描述同步数据库表结构的方法流程图。如图1所示,本申请实施例提供的根据模型描述同步数据库表结构方法主要包括以下步骤:s101、将数据库表结构抽象为第一数据库对象模型描述。服务器对数据库表结构进行模型化描述,将其抽象为第一数据库对象模型描述。其中,数据库对象模型描述是json格式的。例如,{“字段编号”:”1”,”字段名”:”姓名”,......}、{“字段编号”:”2”,”字段名”:”年龄”,......}。在本申请的一个实施例中,服务器可根据预先定义的数据库对象模型描述,将不同类型数据库的表结构抽象为一种第一数据库对象模型描述。在多种数据库表结构的抽象基础上形成数据库对象的模型化描述,实现了对不同数据库类型的表结构的统一描述。其中,不同类型的关系型数据库可包括mysql、oracle、sqlserver、db2等。此处的一种并不代表具体的个数,而是表示一种统一的描述方式。本申请提供的实施例支持多种类型数据库表结构的同步,使得一种描述能够映射多种数据库表结构,通过修改这种描述就可自动创建和更新多种不同类型数据库的表结构,更易于管理。在本申请的一个实施例中,服务器可基于不同类型数据库的表结构的共性,对不同类型数据库的表结构的特性进行扩展描述,得到一种第一数据库对象模型描述。第一数据库对象模型描述包括不同类型数据库的表结构的共性和特性。其中,共性是指各种关系型数据库对象表结构的描述中大致相同的内容、特性是指数据库表结构中对具体字段的描述。各种关系型数据库对象表结构的描述基本一致,主要包括表名、字段列表描述、索引列表描述、约束描述。其中字段列表是由数据库表中的多个字段组成的列表,索引列表是由数据库索引组成的列表,约束包括检查约束、字段约束等。对于数据库表中的各字段,常进行进一步的扩展描述,例如字段名、字段长度、字段精度等。各种关系型数据库一般都具有以上类型的字段描述,但是各数据库对于同一字段类型的描述是不一样的。本申请抽象了一种第一数据库对象模型描述,包括结构描述和字段类型描述。结构描述是基于各种关系型数据库表结构的共性进行抽象的,包括表名、字段列表描述、索引列表描述、约束描述;字段类型描述是针对各种关系型数据库表结构的特性即字段类型进行了扩展描述,包括字段编号、字段名、长度、精度、小数位数、是否主键、是否非空、是否唯一等属性。通过模型化描述能够对数据库表结构直观的进行维护和管理,用户可以了解到产品数据库中有多少张表和每张表的具体结构,更具有直观性。s102、获取数据库连接信息及设置信息,构造hibernate服务注册构造器。服务器可基于用户的输入,获取数据库连接信息和设置信息,用于配置hibernate服务注册构造器。其中,数据库连接信息包括数据库连接url、用户名、密码、驱动、方言以及是否自动提交等与数据库的连接相关的信息,设置信息包括是否打印sql语句、打印出的sql是否要格式化显示以及表结构更新策略等信息。在本申请的一个实施例中,服务器在确定用户输入的数据库的相关信息时,可根据各信息预设的默认值,向用户发送显示提示信息,供用户选择使用。这样能够简化用户操作,易于使用。例如,各数据库端口号显示为默认端口号。在一种可能的实现方式中,服务器可通过具有用户操作界面的可视化工具,确定用户输入的信息,支持不同类型数据库连接信息的设置,实现不同类型数据库表结构的同步,并用于后续生成实体类、编译加载实体类、同步数据库表结构等操作。如表1所示为一种可能的hibernate服务注册构造器配置信息的表现形式:表1其中,表1的第一列是构造hibernate服务注册构造器时所需的配置信息,第二列是配置对应的说明。服务器会根据输入的数据库连接信息自动构造url、用户名等hibernate可识别的信息,同时根据输入的数据库类型确定数据库连接驱动和方言,最终完成上表中的配置,构造hibernate服务注册构造器。s103、获取并解析第二数据库对象模型描述,映射成抽象语法树,根据抽象语法树生成实体类。在本申请的一个实施例中,当数据库对象模型描述发生变化后,为了保证数据库表结构和模型描述的一致性,服务器需要获取并解析第二数据库对象模型描述,将其映射成抽象语法树,并遍历抽象语法树生成实体类。具体地,第一数据库对象模型描述是在多种数据库表结构的抽象基础上得到的,当描述修改后,得到第二数据库对象模型描述。服务器可通过第二数据库对象模型描述文件的所在目录,获取该模型描述并将其转换为代码。在本申请的一个实施例中,数据库对象模型描述的修改可能与数据库不匹配、不能够同步至数据库中,甚至还会造成运行异常的情况,因此在将第二数据库对象模型描述映射成抽象语法树之前,应判断第二数据库对象模型描述的修改是否与相应的数据库兼容。具体地,hibernate服务注册构造器会创建一个sessionfactory实例,用于检查第二数据库对象模型描述的修改是否与相应的数据库兼容。若兼容,则允许这种修改,服务器可将第二数据库对象模型描述映射成抽象语法树;若不兼容,则不允许这种修改,程序会抛出异常而终止。例如,若在模型描述中将“年龄”字段的数据类型由int类型改为varchar类型,数据库本身不能兼容这种修改,则不允许这种修改;若在模型描述中将“学号”字段的字段长度由20改为5,字段长度缩短,但由于学号一般较长,这种修改容易造成数据被截断而丧失完整性,则这种修改也不被允许。判断第二数据库对象模型描述的修改是否与对应的数据库表兼容,可以保持数据库对象模型描述和数据库表结构一致,也能够保证工具逻辑的正常运行。在本申请的一个实施例中,在根据第二数据库对象模型描述生成实体类时,服务器首先获取数据库对象模型描述列表,将数据库对象模型描述列表中的每一个第二数据库对象模型描述都映射成相应的抽象语法树。然后遍历各抽象语法树,根据抽象语法树的各个节点生成实体类。需要说明的是,数据库对象模型描述的各个属性相同,而各属性对应的值不同,因此构成了数据库对象模型描述列表,列表中的每个数据库对象模型描述都对应数据库中的一张表。具体的,服务器在确定模型描述存在修改时,首先获取数据库对象模型描述列表,筛选出列表中已经修改的描述即第二数据库对象模型描述,将其映射成抽象语法树(abstractsyntaxtree,ast);然后针对各抽象语法树进行遍历,根据该抽象语法树的各个节点生成实体类。抽象语法树是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,不依赖于具体的文法,不依赖于语言的细节。本申请实施例提供的抽象语法树的各个节点分别对应相应第二数据库对象模型描述的各个属性。在本申请的一个实施例中,服务器在生成实体类时,可根据抽象语法树生成hibernate映射表结构的实体类;其中,实体类包括hibernate映射表的标注。具体地,本申请实施例提供了一套生成hibernte映射表结构的实体的语法树生成框架,能够将模型描述的各个属性转换成抽象语法树的节点,然后根据抽象语法树生成java实体类。其中,生成的实体类除用于逻辑处理的代码外,还包括hibernate映射表的标注。hibernate能够基于标注方式完成实体类和数据库对象之间的映射,具体映射方式如@entity映射一个实体类、@table指定关联的表、@column指定数据库对应的字段的信息等。在本申请的一个实施例中,服务器根据抽象语法树生成实体类之后,动态编译实体类。动态编译实体类的过程,具体如下:首先,指定实体类的位置、编译生成位置及引用的jar包路径,建立diagnosticcollector对象。其次,根据diagnosticcollector对象获取java编译器的文件管理实例。然后将实体类路径下的.java文件转换为compilationtask所需编译单元。最后,调用javac命令对编译单元进行编译,以得到.class文件并存入脚本目录中。在本申请的一个实施例中,服务器动态编译实体类后,加载实体类。具体地,hibernate服务注册构造器扫描脚本目录,使用指定的类加载器launchedurlclassloader加载.class文件。只有使用特定的加载器加载编译后的实体类时,才能解析其中的标注,进而同步数据库表结构。s104、创建实例,根据实体类与数据库表结构的差别生成结构化查询语言,同步数据库表结构。hibernate服务注册构造器重新创建sessionfactory实例,初始化实体类与数据库对象之间的映射关系,基于hibernate创建和更新表结构的机制生成sql语句,同步数据库表结构。在本申请的一个实施例中,创建实施例之前,首先使用hibernate服务注册构造器构造服务注册中心,通过服务注册中心创建元数据源。将扫描到的.class文件添加至元数据源的被标注类列表中,通过.class文件中的标注,初始化实体类及其与数据库的映射关系。在本申请的一个实施例中,初始化实体类及其与数据库的映射关系后,对比实体类中列的结构和数据库表结构的差别,以生成创建或增量sql,同步数据库表结构。需要说明的是,本申请实施例提供的一种根据模型描述同步数据库表结构的方法是将模型描述与hibernate集成而实现的。hibernate此时会重新创建一个sessionfactory实例,读取代码中实体列的结构和数据库中表的结构进行对比,生成创建或者增量sql,进行更新。其中,增量sql指的是根据实体类和数据库表结构之间的不同之处而生成的sql语句。具体地,映射关系如表2所示:表2其中,表2的第一列为数据库对象模型描述中的各个属性,第二列是与数据库对象模型描述对应的实体类中的描述,第三列为与数据库对象模型描述具有映射关系的数据库对象的描述。本申请实施例提供的根据模型描述同步数据库表结构的方法,通过对不同数据库类型的表结构进行模型化描述,然后将模型化描述转化为实体类,调用hibernate创建和更新表的机制实现了对数据库表结构的同步。既能够直观的管理数据库表结构,也能够保证数据库表结构描述和实体类中的描述保持一致,同时由于数据库表结构的同步与hibernate进行了集成,也使得这种模型化描述方法能够在java中应用。以上为本申请提出的方法实施例。基于同样的发明构思,本申请实施例还提供了一种根据模型描述同步数据库表结构的设备,如图2所示。图2为本申请实施例提供的一种根据模型描述同步数据库表结构的设备结构示意图。如图2所示,设备包括处理器201、及存储器202,其上存储有可执行代码,当可执行代码被执行时,使得处理器201执行如上的一种根据模型描述同步数据库表结构的方法。在本申请的一个实施例中,处理器201用于将数据库表结构抽象为第一数据库对象模型描述;获取数据库连接信息及设置信息,构造hibernate服务注册构造器;获取并解析第二数据库对象模型描述,映射成抽象语法树,根据抽象语法树生成实体类;其中,第二数据库对象模型描述是基于第一数据库对象模型描述修改得到的;基于hibernate服务注册构造器,创建实例,以根据实体类与数据库表结构的差别生成结构化查询语言,同步数据库表结构。本申请中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。当前第1页1 2 3 当前第1页1 2 3 
技术特征:1.一种根据模型描述同步数据库表结构的方法,其特征在于,所述方法包括:
将数据库表结构抽象为第一数据库对象模型描述;
获取数据库连接信息及设置信息,构造hibernate服务注册构造器;
获取并解析第二数据库对象模型描述,映射成抽象语法树,根据所述抽象语法树生成实体类;其中,所述第二数据库对象模型描述是基于所述第一数据库对象模型描述修改得到的;
基于所述hibernate服务注册构造器,创建实例,以根据所述实体类与数据库表结构的差别生成结构化查询语言,同步所述数据库表结构。
2.根据权利要求1所述的一种根据模型描述同步数据库表结构的方法,其特征在于,将数据库表结构抽象为第一数据库对象模型描述,具体包括:
将不同类型数据库的表结构抽象为一种所述第一数据库对象模型描述。
3.根据权利要求2所述的一种根据模型描述同步数据库表结构的方法,其特征在于,将不同类型数据库的表结构抽象为一种所述第一数据库对象模型描述,具体包括:
基于所述不同类型数据库的表结构的共性,对所述不同类型数据库的表结构的特性进行扩展描述,以得到一种所述第一数据库对象模型描述;所述第一数据库对象模型描述包括所述不同类型数据库的表结构的共性和特性。
4.根据权利要求1所述的一种根据模型描述同步数据库表结构的方法,其特征在于,映射成抽象语法树之前,所述方法还包括:
判断所述第二数据库对象模型描述的修改是否与相应的数据库兼容。
5.根据权利要求1所述的一种根据模型描述同步数据库表结构的方法,其特征在于,获取并解析第二数据库对象模型描述,映射成抽象语法树,根据所述抽象语法树生成实体类,具体包括:
获取数据库对象模型描述列表;
将所述数据库对象模型描述列表中的每一个第二数据库对象模型描述都映射成相应的抽象语法树;其中,每个所述抽象语法树对应一个所述实体类;
针对各抽象语法树,遍历该抽象语法树,根据该抽象语法树的各个节点生成所述实体类;其中,所述抽象语法树的各个节点分别对应相应第二数据库对象模型描述的各个属性。
6.根据权利要求5所述的一种根据模型描述同步数据库表结构的方法,其特征在于,根据所述抽象语法树生成实体类,具体包括:
根据所述抽象语法树生成hibernate映射表结构的实体类;
其中,所述实体类包括所述hibernate映射表的标注。
7.根据权利要求6所述的一种根据模型描述同步数据库表结构的方法,其特征在于,根据所述实体类与数据库表结构的差别生成结构化查询语言,同步所述数据库表结构,具体包括:
根据所述hibernate映射表的映射关系,对比所述实体类中列的结构和所述数据库表结构的差别,以生成创建或增量结构化语言,同步所述数据库表结构。
8.根据权利要求1所述的一种根据模型描述同步数据库表结构的方法,其特征在于,根据所述抽象语法树生成实体类之后,所述方法还包括:
调用javac命令对所述实体类进行编译,以得到字节码文件,将所述字节码文件存入脚本目录中;
扫描所述脚本目录,使用指定的类加载器加载所述字节码文件。
9.根据权利要求8所述的一种根据模型描述同步数据库表结构的方法,其特征在于,创建实例之前,所述方法还包括:
使用所述hibernate服务注册构造器构造服务注册中心;
通过所述服务注册中心创建元数据源;
将编译后的所述实体类添加至所述元数据源的被标注类列表中;其中,所述被标注类列表用于存放扫描到的编译后的所述实体类;
通过编译后的所述实体类中的标注,初始化所述实体类及其与数据库的映射关系。
10.一种根据模型描述同步数据库表结构的设备,其特征在于,所述设备包括:
处理器;
及存储器,其上存储有可执行代码,当所述可执行代码被执行时,使得所述处理器执行如权利要求1-9任一项所述的一种根据模型描述动态同步数据库表结构的方法。
技术总结本申请公开了一种根据模型描述同步数据库表结构的方法及设备,用以解决现有的描述数据库表结构的方式无法有效管理数据库表结构的技术问题。方法包括:将数据库表结构抽象为第一数据库对象模型描述;获取数据库连接信息及设置信息,构造Hibernate服务注册构造器;获取并解析第二数据库对象模型描述,映射成抽象语法树,根据抽象语法树生成实体类;其中,第二数据库对象模型描述是基于第一数据库对象模型描述修改得到的;基于Hibernate服务注册构造器,创建实例,以根据实体类与数据库表结构的差别生成结构化查询语言,同步数据库表结构。本申请通过上述方法对数据库表结构进行了直观、有效的管理和维护,保证了数据库表结构描述和实体类中的描述保持一致。
技术研发人员:赵磊
受保护的技术使用者:山东浪潮通软信息科技有限公司
技术研发日:2020.11.27
技术公布日:2021.03.12