本发明涉及的是数据库领域,特别涉及一种通用数据库适配器实现的方法和系统。
背景技术:
1、在实际开发中,由于项目需要和数据源的切换,可能需要将一个应用原本使用的数据库切换到另一个数据库。但不同的数据库系统之间的sql语法存在差异,需要对应用程序的sql语句进行修改以保证正确性,这对开发者的工作量提出了较高的要求,也会增加项目的开发周期和成本。因此,亟需一种通用数据库适配器,可以有效地解决这一问题。
技术实现思路
1、鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的。
2、为了解决上述技术问题,本技术实施例公开了如下技术方案:
3、一种通用数据库适配器实现的方法,包括:
4、s100.根据源数据类型,定义数据库语法规则,按数据库语法规则生成特定格式的文件;
5、s200.通过语法分析工具运行特定格式的文件,生成对应的代码和文件;
6、s300.根据生成对应的代码和文件,构建convertervisitor类,重写所有的visit方法;
7、s400.获取源数据的内容,并根据s200生成对应的代码和文件,创建词法分析器和语法解析器,构建源库到目标库的convertervisitor类,实现源库到目标库的适配。
8、进一步地,s100中,源数据类型,至少包括:mysql、oracle、postgresql中的一个或多个。
9、进一步地,s100中,通过将sql的组成拆解成关键字和表达式,定义数据库语法规则;并按各自语法规则定义相应的g4格式文件。
10、进一步地,s200中,通过语法分析工具运行特定格式的文件,语法分析工具采用antlr工具运行g4格式文件,生成对应的代码和文件。
11、进一步地,s200中,当源数据类型为mysql时,通过antlr工具运行mysql.g4文件,生成mysql.tokens、mysqlbaselistener、mysqlbasevisitor、mysqllexer、mysqllexer.interp、mysqllexer.tokens、mysqllistener、mysqlparser、mysqlvisitor;通过上述文件解析mysql的sql,提取sql的组成。
12、进一步地,s300中,visit方法已经获取sql中所有组成,当语法需要改变时,将该语法对应的visit进行修改,在该visit方法中将原sql方法重写组装成新的方法。
13、进一步地,s400中,当源数据mysql,目标数据为oracle时,实现源库到目标库的适配的方法包括:
14、s401.编写mysqltooracleconvertervisitor并完成对应visit改造;
15、s402.建输入流charstreaminput=charstreams.fromstring("需要转换的sql");s403.创建mysql词法分析器mysqllexer mysqllexer=new mysqllexer(input);
16、s404.创建mysql词法记号流commontokenstream mysqltokens=newcommontokenstream(mysqllexer);
17、s405.创建mysql语法解析器mysqlparser mysqlparser=new mysqlparser(mysqltokens);
18、s406.解析mysql查询语句parsetree mysqltree=mysqlparser.query();
19、s407.创建转换器访问者convertervisitorvisitor=new convertervisitor();
20、s408.构建转换后的oracle查询语句string oraclequery=visitor.visit(mysqltree)。
21、本发明还公开了一种通用数据库适配器实现的系统,包括:特定格式的文件生成单元、特定格式的文件运行单元、convertervisitor类构建单元和源库到目标库适配单元;其中:
22、特定格式的文件生成单元,用于根据源数据类型,定义数据库语法规则,按数据库语法规则生成特定格式的文件;
23、特定格式的文件运行单元,用于通过语法分析工具运行特定格式的文件,生成对应的代码和文件;
24、convertervisitor类构建单元,用于根据生成对应的代码和文件,构建convertervisitor类,重写所有的visit方法;
25、源库到目标库适配单元,用于获取源数据的内容,并根据生成对应的代码和文件,创建词法分析器和语法解析器,构建源库到目标库的convertervisitor类,实现源库到目标库的适配。
26、进一步地,源库到目标库适配单元,实现源库到目标库的适配的方法包括:
27、s401.编写mysqltooracleconvertervisitor并完成对应visit改造;
28、s402.建输入流charstreaminput=charstreams.fromstring("需要转换的sql");s403.创建mysql词法分析器mysqllexer mysqllexer=new mysqllexer(input);
29、s404.创建mysql词法记号流commontokenstream mysqltokens=newcommontokenstream(mysqllexer);
30、s405.创建mysql语法解析器mysqlparser mysqlparser=new mysqlparser(mysqltokens);
31、s406.解析mysql查询语句parsetree mysqltree=mysqlparser.query();
32、s407.创建转换器访问者convertervisitorvisitor=new convertervisitor();
33、s408.构建转换后的oracle查询语句string oraclequery=visitor.visit(mysqltree)。
34、本发明还公开了一种电子设备,包括:
35、存储器,用于存储可由处理器执行的指令;
36、处理器,用于执行指令以实现一种通用数据库适配器实现的方法。
37、本发明实施例提供的上述技术方案的有益效果至少包括:
38、本发明公开的一种通用数据库适配器实现的方法,通过开发一个通用数据库适配器,可以将指定数据源(mysql、oracle、postgresql)的sql适配成指定数据库(mysql、oracle、postgresql)的sql,从而避免了大量的sql修改工作,提高了工作效该发明也具有广泛的适用性和实用性,可应用于各种需要切换不同数据源的场景中。解决在切换数据源时,不同数据库语法差异导致大量sql改造的问题。
39、下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。