一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

数据库查询结果导出方法和导出装置与流程

2022-06-16 06:04:42 来源:中国专利 TAG:


1.本发明涉及数据库技术领域,具体地,涉及数据库查询结果导出方法和导出装置。


背景技术:

2.在数据库应用中,将数据库的数据记录导出成表格数据文件的应用场景非常普遍。在数据库的服务端,可以利用数据库管理工具将数据库中的数据表的全部内容导出为表格数据文件。然而,在数据库的客户端,将数据库查询结果实时导出为表格数据文件缺乏相应的实现框架。在客户端应用的开发过程中,仍然需要耗费大量的人工编程实现数据库查询结果导出方法。
3.根据数据库查询结果导出方法的数据流向,可以将该导出方法分成三个主要步骤:对数据库进行查询以获得结果集;将结果集中的数据转换成表格数据;以及将表格数据写入表格数据文件。表格数据文件例如包括excel文件、csv文件、xml文件、json文件、txt文件。表格数据文件不仅包括表格数据,而且包括表格属性,例如,列标题、列宽度。
4.在将数据库查询结果导出为数据表格数据文件的实现过程中,不仅存在着上述开发效率低的问题,而且还存在着大数据文件写入的内存溢出异常以及依赖于表格数据文件模板的问题。例如,如果希望在表格数据文件增加两列,则必须同时修改查询语句、数据转换方法、表格数据文件模板和写入方法。
5.因此,期望针对数据库查询结果导出方法提供自动配置表格属性的弹性框架技术,以提高软件开发效率。


技术实现要素:

6.鉴于上述问题,本发明的目的在于提供一种数据库查询结果导出方法和导出装置,其中,根据类属性中的映射注解实现数据库结构的数据列名与表格数据文件的列标题的映射,以及定义表格数据文件的附加表格属性,以实现自动配置表格属性的弹性框架技术。
7.根据本发明的第一方面,提供一种数据库查询结果导出方法,包括:定义sql模板;定义java对象类;对所述java对象类进行解析以获取类属性;对数据库进行查询以获得结果集;对所述结果集的元数据进行解析以获取数据列属性;根据所述类属性建立映射关系;根据所述映射关系,将所述结果集映射为所述java对象类的实例列表;以及根据所述映射关系,将所述java对象类的实例列表写入表格数据文件,其中,在java对象类中,采用映射注解描述变量与数据库结构的数据列和表格数据文件的导出列的映射关系。
8.优选地,在程序运行时利用java系统的反射机制获得所述类属性,所述类属性包括:变量名、数据类型、和映射注解。
9.优选地,所述映射注解包括保留字、注解名和多个注解成员,其中,所述多个注解成员至少包括数据库结构的数据列名和表格数据文件的导出列标题。
10.优选地,根据所述注解名执行相应的注解规范的映射方法。
11.优选地,所述多个注解成员还包括附加表格属性。
12.优选地,将所述java对象类的实例列表写入表格数据文件包括新建文件、采用所述附加表格属性设置所述文件的表格参数、在所述文件的单元格中填写数据、以及保存文件。
13.优选地,所述附加表格属性包括所述表格数据文件的导出列宽度。
14.优选地,所述附加表格属性包括所述表格数据文件的数值映射表,在填写数据时,根据所述数值映射表将所述java对象类的实例列表中实例的变量值转换成所述表格数据文件的写入值。
15.优选地,所述表格数据文件的数值映射表为一个映射字符串,所述映射字符串中的每个映射成员定义所述java对象类实例的一个变量值和所述表格数据文件中的相应写入值。
16.优选地,将所述结果集映射为所述java对象类的实例列表的步骤包括:建立列表;逐行读取所述结果集以获得行数据;将所述行数据转换成java对象类的实例;以及将所述java对象类的实例添加至列表。
17.优选地,将所述行数据转换成java对象类的实例的步骤包括:构建java对象类的实例;将所述java对象类中的变量设置为默认值;根据映射关系,获得与所述类属性相应的列名;采用列读取方法,从所述结果集的行数据读取列值;以及将所述变量设置为相应的列值。
18.优选地,在从所述结果集的行数据读取列值的步骤之前,还包括:获取所述java对象类中的变量数据类型、以及所述结果集相应数据列的数据类型;以及根据所述数据类型选择所述列读取方法。
19.优选地,在所述java对象类中的变量数据类型为字符型、数值型和时间型之一时,根据所述java对象类中的变量数据类型选择相对应的列读取方法,从所述结果集的行数据读取列值。
20.优选地,在所述java对象类中的变量数据类型为日期型时,根据所述相应数据列的数据类型选择相对应的列读取方法。
21.优选地,选择相对应的列读取方法的步骤包括:如果所述相应数据列的数据类型为日期时间型,则选择时间戳型的列读取方法,如果所述相应数据列的数据类型为日期型,则选择按日期型的列读取方法,如果所述相应数据列的数据类型为时间戳型,则选择时间戳型的列读取方法,以及如果所述相应数据列的数据类型为时间型,则选择时间型的列读取方法。
22.优选地,在所述java对象类中的变量数据类型为布尔型时,根据所述相应数据列的数据类型选择相对应的列读取方法和数据转换方法。
23.优选地,在所述java对象类中的变量数据类型为日期型时,如果在类属性中存在解析注解,则采用解析注解指定的解析工具进行数据转换。
24.根据本发明的第二方面,提供一种数据库查询结果导出装置,包括:调用模块,用于提供数据库查询接口和java对象类的实例列表接口,经由所述数据库查询接口执行数据库查询以获得结果集,以及提供生成的表格数据文件;java对象解析模块,用于对java对象类进行解析以获取类属性,以及根据所述java对象类的类属性建立映射关系;查询结果集
转换器,用于逐行读取所述结果集以获得行数据,对所述结果集的元数据进行解析以获取数据列属性,根据所述映射关系,将所述结果集映射为所述java对象类的实例列表;以及表格数据文件写入器,用于生成表格数据文件,以及,根据所述映射关系,将所述java对象类的实例列表写入所述表格数据文件,其中,在java对象类中,采用映射注解描述变量与数据库结构的数据列和表格数据文件的导出列的映射关系。
25.优选地,所述映射注解还包括用于描述附加表格属性的注解成员,所述表格数据文件写入器根据所述附加表格属性设置所述表格数据文件的表格参数。
26.优选地,所述调用模块采用上下文参数填充sql模板中的占位符生成完整的sql语句。
27.优选地,所述调用模块在sql语句中附加关键字,用于指定结果集中的数据页。
28.优选地,所述调用模块将大数据的查询结果分页导出,生成多个表格数据文件,以及将所述多个表格数据文件打包成压缩文件。
29.根据本发明实施例的数据库查询结果导出方法,根据类属性中的映射注解实现数据库结构的数据列名与表格数据文件的列标题的映射,以及定义表格数据文件的附加表格属性。因而,该数据库查询结果导出方法无需预先提供表格数据文件模板,在新建文件中,可以利用映射注解的附加表格属性设置表格参数,以及在相应导出列的单元格中填写数据,因此可以直接生成数据表格文件,从而实现自动配置表格属性的弹性框架技术。
30.优选地,采用列读取方法,从所述结果集的行数据读取列值。在读取列值之前,获取所述java对象类中的变量数据类型、以及所述结果集相应数据列的数据类型,以及根据所述数据类型选择所述列读取方法。该选择的列读取方法可以保证数据的完整性和正确性。
31.优选地,采用本发明提出的注解规范,在类属性中还可以包括解析注解,在将所述行数据转换成java对象类的实例的步骤中,采用解析注解指定的解析工具进行数据转换,进一步地,提高映射的灵活性和成功率、以及数据完整性和准确性。
附图说明
32.通过以下参照附图对本发明实施例的描述,本发明的上述以及其他目的、特征和优点将更为清楚,在附图中:
33.图1示出根据本发明第一实施例的数据库查询结果导出方法的流程图。
34.图2示出根据本发明第二实施例的数据库查询结果导出装置的示意性框图。
具体实施方式
35.以下将结合附图所示的具体实施方式对本发明进行详细描述。但这些实施方式并不限制本发明,本领域的普通技术人员根据这些实施方式所做出的结构、方法、或功能上的变换均包含在本发明的保护范围内。
36.图1示出根据本发明第一实施实施的数据库查询结果导出方法的流程图。
37.在步骤s01中,定义sql模板。sql模板是将sql语句中的某些查询条件参数采用占位符表示的模板语句。在sql语句中定义从数据表中查询返回的多个数据列名。
38.在本实施例中,占位符例如包括保留字?和数字序号,数字序号用于区分多个占位
符。以下是sql模板的一个例子:
39.select id,title,status,has_report,

from t_foo where(check_date≥

?1’and check_date≤

?2’)
40.上述sql模板表示从数据表t_foo中查询数据列id、title、status、has_report
……
,查询条件是字段check_date大于等于第一条件参数?1,且小于等于第二条件参数?2。
41.在步骤s02中,定义java对象类。
42.该java对象类包括多个类属性,每个类属性包括:变量定义和映射注解。java对象类中的变量定义包括变量名、数据类型、初始值。java对象类中的映射注解描述变量与数据库结构的数据列和表格数据文件的导出列的映射关系,映射注解利用了java对象类的注解语法。注解语法包括保留字@、注解名以及至少一个注解成员,每个注解成员表示成键值对。
43.在本实施例中,映射注解用于定义元数据,该元数据包括保留字@、注解名vocolumn、以及多个注解成员。所述多个注解成员例如包括数据库结构的数据列名、表格数据文件的导出列标题。优选地,所述多个注解成员还包括附加表格属性,例如,表格数据文件的导出列宽度和数值映射表。
44.每个注解成员采用键值对表示,例如,数据库结构的数据列名的键名是col,表格数据文件的导出列标题的键名为comment,表格数据文件的导出列宽度的键名为dispwidth,表格数据文件的数值映射表的键名为valsmapping。
45.在本实施例中,表格数据文件的数值映射表为一个映射字符串。映射字符串中的每个映射成员定义java对象类实例的一个变量值和表格数据文件中的相应写入值。例如,变量值是布尔值true,写入值是字符串“是”。优选地,该数据映射字符串具有json对象字符类似的数据格式。
46.在表格数据文件中填写数据时,根据数值映射表将所述java对象类的实例列表中实例的变量值转换成写入值。由于采用数值映射表进行数值映射,因此,表格数据文件中的数值可以容易直接阅读和理解。
47.以下为整型变量status的映射注解和变量定义。
48.@vocolumn(col="status",comment="状态",valsmapping="{0:草稿,1:待审核,2:上架,3:下架}",dispwidth=6)
49.private int status=fsspec.status_draft;
50.在下文的java对象类foovo中,类属性包括:记录标识、标题、状态、是否有报告、业务日期、开始时间等,变量名分别为id、title、status、hasreport、checkdate、starttime、
……
,数据库结构的相应数据列名分别为id、title、status、has_report、check_date、start_time、
……
,表格数据文件的相应导出列标题分别为“记录id”、“标题”、“状态”、“是否\n有报告”、“业务日期”、“开始时间”、
……

51.public class foovo{
52.@vocolumn(col="id",comment="记录id",dispwidth=10)
53.private string id=null;
54.@vocolumn(col="title",comment="标题",dispwidth=10)
55.private string title=null;
56.@vocolumn(col="status",comment="状态",valsmapping="{0:草稿,1:待审核,2:上架,3:下架}",dispwidth=6)
57.private int status=fsspec.status_draft;
58.@vocolumn(col="has_report",comment="是否\n有报告",valsmapping="{true:是,false:否}",dispwidth=10)
59.private boolean hasreport=false;
60.@jsonfield(format=fsspec.pattern_date)
61.@vocolumn(col="check_date",comment="业务日期",dispwidth=12)
62.private date checkdate=new date();
63.@jsonfield(format=fsspec.pattern_time)
64.@vocolumn(col="start_time",comment="开始时间",dispwidth=12)
65.private date starttime=new date();
66.……
67.}
68.在上述的java对象类foovo中,还使用了json解析库fastjson支持的解析注解,该解析注解的注解名jsonfield,其中,注解成员的键名format表示格式参数,键值表示格式常量类的成员。该解析注解用于调用json解析库fastjson进行数据转换。
69.在步骤s03中,对java对象类进行解析以获取类属性。
70.java系统的特点是在程序行前对java对象类进行编译,在程序运行时动态加载经过编译java对象类。因此,在程序运行时,不能直接从java对象类的静态定义中获得类属性。java系统还提供了反射机制,可以在程序运行时利用反射机制获得类属性,包括:变量名、数据类型、映射注解等。
71.例如,利用java系统的反射机制可以获得java对象类foovo中的系统账号的类属性,包括:变量名status,数据类型int,以及映射注解的四个成员:col="status",comment="状态",valsmapping="{0:草稿,1:待审核,2:上架,3:下架}",dispwidth=6。
72.在步骤s04中,对数据库进行查询以获得结果集。
73.对数据库进行查询包括生成sql语句和执行sql语句的步骤。采用上下文参数(即,查询条件参数)填充sql模板中的占位符生成完整的sql语句。
74.以下是在上述的sql模板中,采用查询条件参数2021-01-01和2021-06-30分别替换占位?1和?2获得的完整sql语句。
75.select id,title,status,has_report,

from t_foo where(check_date≥

2021-01-01’and check_date≤

2021-06-30’)limit 0,5000
76.上述sql语句表示从数据表t_foo中查询数据列id、title、status、has_report
……
,查询条件是字段check_date位于日期2021-01-01至2021-06-30之间。
77.作为优选的实施例,上述sql语句还附加了关键字limit,用于指定结果集中的数据页,例如,limit 0,5000表示第一个数据页包括5000个数据行。
78.在本实施例中,采用标准的jdbc api(即,java数据库连接接口)对数据库进行访问。在执行sql语句之前,建立数据库连接。然后数据库执行sql语句,从数据库返回结果集。在执行sql语句之后,关闭数据库连接。结果集至少包括一个数据行的行数据。每个行数据
包括多个列值。
79.在步骤s05中,对结果集的元数据进行解析以获取数据列属性。
80.在jdbc api中提供了元数据解析方法以获得结果集的元数据,该元数据表示成resultsetmetadata类,包括多个数据列属性,例如:列名、列备注、是否可为空、数据类型、显示大小、数值长度(类型为数值时)、小数位数(类型为数值时)等。
81.在步骤s06中,根据类属性建立映射关系。
82.在类属性中,根据注解名为vocolumn判断为映射注解。进一步地,根据映射注解的多个成员的键值,获得变量与数据库结构的数据列和表格数据文件的导出列的映射关系。例如,上述java对象类foovo中的变量名status,对应于数据库结构的数据列名status,以及表格数据文件的导出列标题“状态”。
83.进一步地,根据映射注解的多个成员的键值,还可以获得附加表格属性,例如,表格数据文件的导出列宽度和数值映射表。
84.在步骤s07中,根据所述映射关系,将结果集映射为java对象类的实例列表。
85.该映射过程包括建立列表、逐行读取结果集以获得行数据、将行数据转换成java对象类实例、以及将java对象类实例添加至列表。
86.在本实施例中,采用标准的jdbc api(即,java数据库连接接口)访问结果集。jdbc api提供了行游标和列读取方法。在读取结果集中与行游标对应的一行数据后,移动行游标至下一行。每个行数据包括多个列值。逐行读取结果集的行数据,可以遍历结果集读取全部行数据。
87.在本实施例中,在读取查询结果的行数据之后,构建java对象类实例,以及将变量设置为默认值。进一步地,对于java对象类中的每个类属性,根据变量名与数据列名的对应关系,从查询结果的行数据中获取与相对应的列值,将变量设置为相对应的列值。
88.在本实施例中,在获取据变量名与数据列名的对应关系之后,根据变量名与数据列名的对应关系,从查询结果的行数据中获取与相对应的列值。
89.jdbc api提供了与数据类型相关的列读取方法。在从查询结果的行数据中获取java对象类相应的列值之前,还需要获取java对象类中的变量和数据库结构中的数据列的数据类型,以及,根据数据类型选择相对应的列读取方法。该选择的列读取方法可以保证数据的完整性和正确性。
90.如果变量的数据类型为第一组数据类型:字符型(char或varchar)、数值型(int或integer、long或long、double或double、float或float、bigdecimal)、时间型(time),直接按类属性中的数据类型对应的列读取方法获得列值即可。例如:数值型中的整型就采用jdbc api中的getint方法读取,字符串就采用jdbc api中的getstring读取。
91.如果变量的数据类型为第二组数据类型:日期型(date),结合数据列的数据类型选择列读取方法,否则会产生精度丢失的问题。
92.如果数据列的数据类型为日期时间型(datetime),则按时间戳型的列读取方法gettimestamp获得列值。
93.如果数据列的数据类型为日期型(date),则按日期型的列读取方法getdate获得列值。
94.如果数据列的数据类型为时间戳型(timestamp),则按时间戳型的列读取方法
gettimestamp获得列值。
95.如果数据列的数据类型为时间型(time),则按时间型的列读取方法gettime获得列值。
96.如果变量的数据类型为第三组数据类型:布尔(boolean或boolean),结合数据列的数据类型选择列读取方法和数据转换方法,否则会产生数据错误的问题。
97.如果数据列的数据类型为布尔型(boolean),则按布尔型的列读取方法getboolean获得列值,以及将所述变量设置为列值。
98.如果数据列的数据类型为整型(int),则按整型的列读取方法getint获得列值,然后将列值的数值转换成布尔量。在列值的数值等于1时表示布尔量true,在列值的数值不等于1时表示布尔量false。然后,将java对象类的变量设置为写入值。
99.如果数据列的数据类型为字符型(char或varchar),则按字符型的列读取方法getstring获得列值,然后将列值的字符串转换成布尔量。在列值的字符串等于“1”时表示布尔量true,在列值的字符串不等于“1”时表示布尔量false。然后,将java对象类的变量设置为写入值。
100.进一步地,在java对象类中的变量数据类型为日期型时,如果在类属性中存在解析注解,则采用解析注解指定的解析工具进行数据转换。例如,如果解析注解的注解名jsonfield,则按照注解成员指定的格式参数,调用json解析库fastjson进行数据转换,将列值转换成写入值。然后,将java对象类的变量设置为写入值。
101.在本实施例中,java对象类的实例列表是数据库结构和表格数据文件之间的中间格式。该实例列表实质是一个二维字符串数组,与表格数据文件的单元格一一对应。
102.在步骤s08中,根据所述映射关系,将java对象类的实例列表写入表格数据文件。
103.表格数据文件例如包括excel文件、csv文件、xml文件、json文件、txt文件。
104.在表格数据文件为excel文件的情形下,可以采用java的excel接口库(例如,apache poi、jxl等)进行文件操作。其中apache poi以能够支持excel的高版本(2007及以上版本)而独占鳌头,成为大多数excel文档导出组件的首选。
105.apache poi提供了excel文件的创建、写入和保存方法。在excel文件中写入内容时,根据映射注解中的附加表格属性,可以设置excel文件中的列标题和列宽度,以及在相应列的单元格中填写数据。如果映射注解包括数值映射表,则在填写数据之前按照数值映射表进行数据转换,将写入值写入单元格中。
106.根据上述实施例的数据库查询结果导出方法,根据类属性中的映射注解实现数据库结构的数据列名与表格数据文件的列标题的映射,以及定义表格数据文件的附加表格属性。因而,该数据库查询结果导出方法无需预先提供表格数据文件模板,在新建文件中,可以利用映射注解的附加表格属性设置表格参数,以及在相应导出列的单元格中填写数据,因此可以直接生成数据表格文件,从而实现自动配置表格属性的弹性框架技术。
107.图2示出根据本发明第二实施例的数据库查询结果导出装置的示意性框图。
108.数据库查询结果导出装置100包括调用模块101、java对象类解析模块102、查询结果集转换器103和表格数据文件写入器104。
109.在本实施例的java对象类中,采用映射注解描述变量与数据库结构的数据列和表格数据文件的导出列的映射关系。
110.调用模块101提供数据库查询接口和java对象类的实例列表接口,经由数据库查询接口执行数据库查询以获得结果集,以及提供生成的表格数据文件。java对象解析模块102对java对象类进行解析以获取类属性,以及根据java对象类的类属性建立映射关系。查询结果集转换器103逐行读取结果集以获得行数据,对结果集的元数据进行解析以获取数据列属性,根据所述映射关系,将所述结果集映射为所述java对象类的实例列表。表格数据文件写入器104生成表格数据文件,根据所述映射关系,设置表格数据文件的表格参数,以及将所述java对象类的实例列表写入表格数据文件。
111.优选地,调用模块101根据sql模板生成sql语句。采用上下文参数(即,查询条件参数)填充sql模板中的占位符生成完整的sql语句。
112.优选地,调用模块101还可以在sql语句中附加关键字limit,用于指定结果集中的数据页,例如,limit 0,5000表示第一个数据页包括5000个数据行。相应地,调用模块101可以将大数据的查询结果分页导出,生成多个表格数据文件,以及将多个表格数据文件打包成压缩文件,例如,zip文件。
113.以上所描述的装置实施方式仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施方式方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
114.应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施方式中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。
115.上文所列出的一系列的详细说明仅仅是针对本发明的可行性实施方式的具体说明,它们并非用以限制本发明的保护范围,凡未脱离本发明技艺精神所作的等效实施方式或变更均应包含在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献