CN117743360A - 数据查询方法及电子设备 - Google Patents
数据查询方法及电子设备 Download PDFInfo
- Publication number
- CN117743360A CN117743360A CN202311278038.0A CN202311278038A CN117743360A CN 117743360 A CN117743360 A CN 117743360A CN 202311278038 A CN202311278038 A CN 202311278038A CN 117743360 A CN117743360 A CN 117743360A
- Authority
- CN
- China
- Prior art keywords
- query
- filtering
- attribute
- name
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 145
- 238000001914 filtration Methods 0.000 claims abstract description 281
- 230000004044 response Effects 0.000 claims description 11
- 238000004590 computer program Methods 0.000 claims description 8
- 230000001174 ascending effect Effects 0.000 description 34
- 238000012545 processing Methods 0.000 description 22
- 230000008569 process Effects 0.000 description 19
- 230000006870 function Effects 0.000 description 18
- 238000006243 chemical reaction Methods 0.000 description 9
- 238000004891 communication Methods 0.000 description 8
- 238000013507 mapping Methods 0.000 description 8
- 230000005540 biological transmission Effects 0.000 description 6
- 238000011161 development Methods 0.000 description 6
- 238000010586 diagram Methods 0.000 description 6
- 230000008859 change Effects 0.000 description 5
- 238000005192 partition Methods 0.000 description 5
- 238000000926 separation method Methods 0.000 description 5
- 238000012163 sequencing technique Methods 0.000 description 5
- 230000003993 interaction Effects 0.000 description 4
- 238000003491 array Methods 0.000 description 3
- 238000013500 data storage Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000007726 management method Methods 0.000 description 2
- 238000012546 transfer Methods 0.000 description 2
- 238000013519 translation Methods 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000005538 encapsulation Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 238000012216 screening Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Abstract
本申请实施例公开一种数据查询方法及电子设备,该数据查询方法包括:接收来自第一设备的第一请求,第一请求包括目标查询参数;在目标查询参数包括多个过滤参数对象的情况下,基于该多个过滤参数对象和该多个过滤参数对象之间的嵌套关系得到过滤语句;基于该过滤语句和预设查询语句得到目标查询语句;基于该目标查询语句从数据库中获取第一查询结果;向第一设备发送第一目标数据,第一目标数据包括所述第一查询结果。本申请实施例,在进行数据查询时,可以灵活地设置多个过滤参数对象和该多个过滤参数对象之间的嵌套关系,从而可以表示各种过滤条件的组合,可以提高数据查询的灵活性。
Description
技术领域
本发明涉及数据库领域,尤其涉及一种数据查询方法及电子设备。
背景技术
随着网络、通信技术的快速发展,海量数据正以前所未有的增长趋势冲击着各个行业。为了有效地管理、维护这些数据,用户通常会使用数据库进行数据的存储。
此外,为了便于用户查看数据库中存储的数据,在实际场景下,通常会提供用户界面(user interface,UI),在用户界面中可以为用户呈现数据库中存储的数据。并且,在用户界面上还可以提供一些控件,以供用户进行数据的筛选等。但是,通常情况下,这些控件仅能够支持设置固定的过滤条件或者排序条件,灵活性较低。
发明内容
本申请实施例公开了一种数据查询方法及电子设备,可以提高数据查询的灵活性,满足用户的各种查询需求。
第一方面公开一种数据查询方法,该数据查询方法可以应用于第二设备,也可以应用于第二设备中的模块(例如,芯片、中央处理器等),还可以应用于能实现全部或部分第二设备功能的逻辑模块或软件。下面以应用于第二设备为例进行描述。该数据查询方法可以包括:接收来自第一设备的第一请求,该第一请求包括目标查询参数;在该目标查询参数包括多个过滤参数对象的情况下,基于该多个过滤参数对象和该多个过滤参数对象之间的嵌套关系得到过滤语句;该过滤参数对象与过滤条件对应,该嵌套关系用于指示该多个过滤参数对象对应的过滤条件之间的嵌套关系,该目标查询参数为基于配置文件生成的;基于该过滤语句和预设查询语句得到目标查询语句;基于该目标查询语句从数据库中获取第一查询结果;向该第一设备发送第一目标数据,该第一目标数据包括该第一查询结果。
本申请实施例中,查询请求中携带的目标查询参数可以包括多个过滤参数对象和该多个过滤参数对象之间的嵌套关系,这样,可以灵活地支持设置各种过滤条件的组合,可以极大地提高数据查询的灵活性,从而可以满足用户的各种查询需求。
示例性的,这里的第一查询结果可以参考下述图3和图4中的第二查询结果,第一目标数据可以参考下述图4中的第二目标数据。
作为一种可能的实现方式,该目标查询参数还包括一个或多个排序参数和该一个或多个排序参数的排序优先级,该方法还包括:基于该一个或多个排序参数和该一个或多个排序参数的排序优先级得到排序语句;该基于该过滤语句和预设查询语句得到目标查询语句包括:基于该过滤语句、该排序语句和预设查询语句得到目标查询语句。
本申请实施例中,目标查询参数还可以包括一个或多个排序参数,以及该一个或多个排序参数的排序优先级。基于排序优先级,可以确定多个排序参数对应的排序先后顺序,从而可以保证排序的准确性。可见,基于排序优先级可以灵活地支持设置各种排序条件的组合。
作为一种可能的实现方式,该第二设备包括一个或多个类,该一个或多个类的属性与数据表的列对应,该一个或多个类的属性包括表字段注解,该表字段注解的值为对应的列名;该过滤参数对象包括属性名称、查询值和过滤类型,该属性名称用于指示需要进行过滤的属性,该查询值为对应过滤方式需要的参数值,该过滤类型用于指示过滤方式和联接关系,该基于该多个过滤参数对象和该多个过滤参数对象之间的嵌套关系得到过滤语句包括:基于反射的方式获取该多个过滤参数对象中的属性名称对应的列名;基于该多个过滤参数对象对应的列名、该多个过滤参数对象中的查询值、该多个过滤参数对象中的过滤类型和该多个过滤参数对象之间的嵌套关系得到过滤语句。
本申请实施例中,可以定义一个或多个类,这一个或多个类的属性可以与数据表的列对应,并且,可以为对应属性设置表字段注解(@TableField)。基于此,过滤参数对象中可以直接包括对应的属性名称,之后,可以直接通过反射的方式获取属性名称对应的列名,这样,可以降低表中字段名称(列名)变更对程序的影响。当表字段名称变更时,对应修改表字段注解中的值即可,不需要对整体程序的处理逻辑进行修改。此外,由于不同场景下,目标查询参数的格式可以是统一的,因此,解析目标查询参数并生成对应的查询语句的处理流程可以是相同的,也就是说,解析目标参数并生成对应的过滤语句、排序语句的代码可以是相同的,这样,可以极大地缩短开发周期,快速地满足用户需求。
作为一种可能的实现方式,该一个或多个类包括目标类,该目标类的属性与该第一查询结果的各个列对应,该方法还包括:将该第一查询结果转换为目标类对象;将该目标类对象转换为对应的JSON对象;该向该第一设备发送第一目标数据包括:向该第一设备发送第一目标数据,该第一目标数据包括该JSON对象。
本申请实施例中,由于预先定义了与查询结果对应的类,因此,可以将查询结果直接转换为对应的类对象,然后将该类对象转换为对应的JSON对象,并向第一设备返回该JSON对象。而JSON格式的数据便于解析和传输,从而可以便于第一设备进行解析并为用户呈现对应的查询结果。
作为一种可能的实现方式,该一个或多个类的属性还包括查询标识注解,该查询标识注解用于标识对应的属性是否允许设置过滤条件,该查询标识注解的值包括true和false两种,当取值为true时,表明允许设置过滤条件,当取值为false时,表明不允许设置过滤条件;该基于反射的方式获取该多个过滤参数对象中的属性名称对应的列名包括:在该多个过滤参数对象中的属性名称对应的属性的查询标识注解的值为true的情况下,基于反射的方式获取该多个过滤参数对象中的属性名称对应的列名;该方法还包括:在该多个过滤参数对象中的属性名称对应的属性的查询标识注解的值为false的情况下,向该第一设备发送报错信息。
本申请实施例中,可以通过设置查询标识注解(如下述@IsQuery)对可过滤的属性进行限制,可以保障查询的安全性。并且,通过@IsQuery注解可以对需要消耗大量处理资源的属性进行过滤限制,可以避免对第二设备的性能造成影响。
作为一种可能的实现方式,该目标查询参数还包括分页参数,该分页参数包括查询页和/或分页值,该查询页用于指示需要查询的页,该分页值用于指示每页包括多少条数据;该基于该目标查询语句从数据库中获取第一查询结果包括:基于该查询页和/或该分页值,以及该目标查询语句从数据库中获取第一查询结果。
本申请实施例中,可以设置分页参数,这样可以每次仅查询一部分对应的数据,可以不用查询所有的数据,从而可以提高数据查询效率。并且,这种方式可以使得每次传输的数据量较少,可以节约传输资源。
作为一种可能的实现方式,该方法还包括:接收来自该第一设备的第二请求;响应于该第二请求,基于该预设查询语句从该数据库中获取第二查询结果;向该第一设备发送第二目标数据,该第二目标数据包括该第二查询结果和该第二查询结果中各个列对应的属性名称。
本申请实施例中,在第一设备首次发送查询请求时,可以基于预设的查询语句获取第二查询结果,并向第一设备发送该第二查询结果和该第二查询结果中各个列对应的属性名称,以便第一设备可以确定可以基于哪些属性设置查询条件。并且,由于这种方式下,目标数据的格式都可以是统一的,因此,第一设备解析目标数据的程序等可以通用,不必针对不同的场景开发不同的程序等。
示例性的,这里的第二查询结果可以参考下述图3和图4中的第一查询结果,第二目标数据可以参考下述图4中的第一目标数据。
作为一种可能的实现方式,该预设查询语句包括待查询的字段、待查询的表,该预设查询语句用于从数据库中获取第二查询结果。
作为一种可能的实现方式,该预设查询语句还包括联表语句。
第二方面公开一种数据查询方法,该数据查询方法可以应用于第一设备,也可以应用于第一设备中的模块(例如,芯片、中央处理器等),还可以应用于能实现全部或部分第一设备功能的逻辑模块或软件。下面以应用于第一设备为例进行描述。该数据查询方法可以包括:显示目标界面,该目标界面包括目标控件,该目标控件用于支持用户设置多个过滤条件以及该多个过滤条件之间的嵌套关系,该过滤条件用于对数据库中的数据进行过滤;接收用户针对该目标控件的第一操作,该第一操作包括设置多个过滤条件以及该多个过滤条件之间的嵌套关系;基于配置文件解析该多个过滤条件以及该多个过滤条件之间的嵌套关系,并生成目标查询参数;该目标查询参数包括该多个过滤条件对应的过滤参数对象和该多个过滤参数对象之间的嵌套关系;向第二设备发送第一请求,该第一请求包括该目标查询参数,该第一请求用于请求第一目标数据;接收来自该第二设备的第一目标数据,该第一目标数据包括第一查询结果;在用户界面中显示该第一查询结果。
本申请实施例中,基于目标控件,可以支持用户设置多个过滤参数对象和该多个过滤参数对象之间的嵌套关系,这样,可以便于用户灵活地设置各种过滤条件的组合,可以极大地提高数据查询的灵活性,满足用户的各种查询需求。
作为一种可能的实现方式,该方法还包括:接收用户的第二操作;响应于该第二操作,向第二设备发送第二请求,该第二请求用于请求第二目标数据;接收来自该第二设备的该第二目标数据,该第二目标数据包括第二查询结果和该第二查询结果中各个列对应的属性名称;该基于配置文件解析该多个过滤条件以及该多个过滤条件之间的嵌套关系,并生成目标查询参数包括:基于配置文件解析该多个过滤条件以及该多个过滤条件之间的嵌套关系,并使用该第二查询结果中各个列对应的属性名称生成目标查询参数,该过滤条件基于该第二查询结果中各个列对应的属性名称设置,该过滤条件包括属性名称、查询值和过滤方式,该过滤参数对象包括属性名称、查询值和过滤类型,该属性名称用于指示需要进行过滤的属性,该过滤类型用于指示过滤方式和联接关系,该查询值为对应过滤方式需要的参数值。
本申请实施例中,在第一设备不知道可以基于哪些属性进行数据过滤时,第一设备可以先向第二设备发送第二请求,基于第二请求,第一设备可以得到第二设备返回的第二目标数据,通过第二目标数据,第一设备可以知道可以基于哪些属性进行数据的过滤。之后,第一设备可以基于这些属性生成对应的目标查询参数,实现数据的查询。可见,这种方式下,针对于不同的场景,均可以通过第一次查询请求得到对应的属性名称,然后再基于这些属性名称生成对应的目标查询参数,可以提高程序的通用性。
作为一种可能的实现方式,所述目标数据还包括分页数据,所述分页数据包括查询页、分页值、总记录条数、分页总页数。
第三方面公开一种电子设备,该电子设备包括处理器、存储器,该处理器调用该存储器中存储的计算机程序实现如上述第一方面以及第一方面中任一可能的实现方式中所提供的数据查询方法,或者实现如上述第二方面以及第二方面中任一可能的实现方式中所提供的数据查询方法。
第四方面公开一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序或计算机指令,当该计算机程序或计算机指令运行时,实现如上述各方面公开的数据查询方法。
第五方面公开一种芯片,包括处理器,该处理器用于执行存储器中存储的计算机程序或计算机指令,当计算机程序或计算机指令被执行时,使得芯片执行上述各方面公开的数据查询方法。
作为一种可能的实施方式,存储器位于芯片之外。
第六方面公开一种计算机程序产品,该计算机程序产品包括计算机程序代码,当该计算机程序代码被运行时,使得上述各方面公开的数据查询方法被执行。
应理解,本申请上述多个方面或者任一种可能的实施方式的实现和有益效果可互相参考。
附图说明
附图为了更清楚地说明本申请实施例技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
图1A-图1G是本申请实施例公开的一组用户界面示意图;
图1H是本申请实施例公开的一种用户界面示意图;
图2是本申请实施例公开的一种第二设备的软件结构示意图;
图3是本申请实施例公开的一种查询数据的处理流程示意图;
图4是本申请实施例公开的一种数据查询方法的流程示意图;
图5是本申请实施例公开的一种解析升序属性数组和/或降序属性数组的流程示意图;
图6是本申请实施例公开的一种解析过滤对象数组的流程示意图;
图7是本申请实施例公开的另一种数据查询方法的流程示意图;
图8是本申请实施例公开的一种电子设备的结构示意图。
具体实施方式
本申请实施例公开了一种数据查询方法,可以灵活的支持用户的各种查询需求,可以提高数据查询的灵活性。下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。
为了更好地理解本申请实施例,下面先对本申请实施例的相关术语和相关技术进行描述。
应理解,对于一个数据库来说,其存储的可以是一张张表,每张表可以包括多列和多行。表中的每行(数据库中的每条记录)可以称为一个元组(tuple),每列可以为一个属性。也就是说,元组可以为行数据的最小存储单元,一个元组可以包括一行数据的各个属性(字段)的值。
可扩展标记语言(eXtensible Markup Language,XML)是一种文本标记语言,可以使用一系列简单的标签(如自定义标签)描述数据。并且,以XML格式表示的内容易于理解,便于应用程序进行解析。
MyBatis-Plus是一个持久层框架,在MyBatis的基础上进行了增强,提供了更加丰富的功能和接口,可以使得开发人员能够便捷地操作数据库,如便捷地进行数据查询、数据删除、数据插入等。MyBatis-Plus可以通过XML文本或者注解的方式配置结构化查询语言(structured query language,SQL)语句,并支持动态生成SQL语句的内容,如动态生成查询SQL语句的查询条件。此外,MyBatis-Plus还可以实现JAVA对象和数据库中的数据之间的映射,例如,MyBatis-Plus在完成数据查询之后,可以将数据库返回的查询结果映射成JAVA对象。应理解,MyBatis-Plus包括QueryWrapper类,QueryWrapper类可以用于动态的构造查询条件,包括过滤条件(如where过滤)、排序条件等。
QueryWrapper类是MyBatis-Plus提供的一个用于构建查询条件的工具类,它提供了一系列的函数和属性,可以简化查询条件的构建过程。示例性的,QueryWrapper类包括eq()、ne()、gt()、lt()、like()、likeRight()、in()、between()、orderBy()等方法,方法也可以称为函数。eq()可以用于设置等于过滤条件,ne()可以用于设置不等于过滤条件,gt()可以用于设置大于过滤条件,lt()可以用于设置小于过滤条件,like()可以用于设置模糊查询过滤条件,likeRight()可以用于设置右模糊查询过滤条件,in()可以用于设置包含在某个集合中的过滤条件,between()可以用于设置包含在某个区间的过滤条件,orderBy()可以用于设置排序条件。此外,QueryWrapper类可以支持链式调用的方式。总之,使用QueryWrapper类可以灵活地构建复杂的查询条件,满足各种查询场景。
随着网络、通信技术的快速发展,海量数据正以前所未有的增长趋势冲击着各个行业。为了有效地管理、维护这些数据,用户通常会使用数据库进行数据的存储。同时,为了便于用户查看数据库中存储的数据,在实际场景下,通常会提供用户界面(userinterface,UI),在用户界面中可以为用户呈现数据库中存储的数据。并且,在用户界面上还可以提供一些控件,以供用户进行数据的筛选等。
相关技术中,在具体实现时,通常包括前端和后端两部分,前端和后端之间可以进行通信。前端主要负责用户界面的显示、与用户进行交互、基于用户交互与后端进行通信(如进行数据请求)。后端主要负责接收前端的请求,基于前端的请求执行对应的操作,如基于前端的数据查询请求从数据库中读取数据,并向前端返回读取的数据。
在实际情况下,后端一般会为前端提供查询接口,以供前端进行数据查询。其中,每个查询接口可以对应一条固定的查询SQL语句,查询接口中可以包括对应查询SQL语句需要的参数,例如,针对于查询数据表1中A属性等于某一个值的查询SQL语句可以为:select*from数据表1where A={??},该查询SQL语句对应的查询接口中可以传入具体的A属性的值。可见,这种方式下,一个查询接口可以支持的查询条件是固定的,如仅能支持某一个属性值的过滤,而针对于不同的使用场景,可能查询条件(如过滤条件)不同,因此,一个查询接口往往不能满足用户的各种查询需求,故而,为了满足各种使用场景,通常需要预先设置大量的查询SQL语句以及对应的查询接口。
本申请实施例中,为了在满足各种不同的使用场景的同时,提高数据查询的灵活性,可以定义一个或多个类,这一个或多个类的属性可以与数据表的列对应。在需要进行数据过滤、排序等处理时,前端可以基于这一个或多个类的属性生成查询条件(如过滤条件、排序条件等),并可以按照预设的格式向后端发送查询条件。后端可以解析前端发送的查询条件,并基于反射的方式获取对应的数据表的列名,然后可以基于获取的数据表的列名得到完整的查询SQL语句,并可以基于查询SQL语句从数据库中获取对应的查询结果。后端从数据库中获取到查询结果之后,可以将查询结果映射为对应的类对象,然后可以向前端返回该类对象对应的数据,前端可以解析这些数据,并显示在用户界面中。
下面结合应用场景,以第一设备的显示界面为例,介绍本申请实施例涉及的一种数据查询方法。
请参见图1A,图1A是本申请实施例提供的一种用户界面示意图。如图1A所示,第一设备的显示器(如显示屏)可以显示有用户界面101,该用户界面101中显示了一个放置有应用图标的页面,该页面可以为第一设备的应用桌面,第一设备可以是任何带有显示屏幕的终端设备,例如,笔记本电脑,台式电脑,平板电脑,手机等终端设备,上述第一设备还可以与第二设备(如服务器)进行通信连接,以实现两者之间的数据交互。该页面可以包括显示有时间、日期等信息的任务栏和多个应用图标,例如,该页面中可以包括电子邮件应用图标、计算器应用图标、文件应用图标、音乐应用图标、文本编辑器应用图标、天气应用图标、浏览器应用图标1011等。
如果用户需要启动浏览器应用,可以通过鼠标点击(如双击)浏览器应用图标1011。响应于该操作,第一设备可以启动浏览器,显示浏览器页面,用户可以在浏览器页面的地址栏中输入需要访问的网络地址,如URL(uniform resource locator,统一资源定位符)地址。如图1B所示,假设部门管理功能对应的URL地址为“http://192.168.206.128/department-manage”,用户可以在地址栏1012中输入该URL地址,然后可以执行针对地址栏1012的输入操作(如回车)。响应于针对地址栏1012的输入操作,第一设备可以向第二设备发送针对该URL地址的http请求。第二设备接收到该http请求之后,响应于该http请求,可以按照预设的查询SQL语句和预设的分页参数从数据库中读取查询结果,然后可以基于查询结果得到第一数据。之后,第二设备可以向第一设备返回该http请求对应的超文本标记语言(hypertext markup language,HTML)文件、层叠样式表(cascading style sheets,CSS)文件、JavaScript(JS)文件等资源文件以及第一数据和分页数据(如总记录条数、总页数)等。相应地,第一设备可以接收到来自第二设备的HTML文件、CSS文件、JS文件等资源文件以及第一数据和分页数据,之后,第一设备可以基于第二设备返回的资源文件、第一数据、分页数据等显示用户界面102。例如,第一设备可以基于第二设备返回的JS文件解析第一数据,然后可以将解析得到的数据嵌入HTML文件中,或者在HTML文件中引用解析得到的数据,从而可以显示从数据库中查询出的查询结果。
需要说明的是,本申请实施例中,可以定义一个或多个类,这一个或多个类的属性可以与数据表的列对应。第二设备从数据库中读取到查询结果之后,可以将查询结果映射为对应的类对象,然后可以将该类对象转换为对应的JSON对象,之后,可以向第一设备发送该JSON对象。也就是说,上述基于查询结果得到的第一数据可以包括JSON对象。
应理解,上述这种方式下,由于是基于JS文件动态解析第一数据显示用户界面102,因此,不管数据库中对应的表的数据结构如何变化、查询条件如何变化或者需要查询的属性值如何变化,第一设备均能够进行解析并显示对应的用户界面。
在用户界面102中,可以显示有从数据库中查询到的查询结果和对应的总记录条数、每页条数、当前页码等分页数据。例如,在显示区域1014中,显示总记录条数为211条。在下拉框1015中,显示有10条/页,用户也可以根据实际情况,更改每页条数,如更改为5条/页或者20条/页。在下拉框1015右侧,显示有对应的页码控件,如第1页的页码控件1016,以及第2页、第3页等页面对应的页码控件。在用户界面102中,当前显示的页为第1页,第1页中包括10条数据,每一条数据可以包括6个属性值,分别为name(部门名称)、code(部门编码)、manager_name(部门经理姓名)、manager_code(部门经理所属部门的编码)、employee_name(员工姓名)和employee_code(员工所属部门的编码)。应理解,用户如果需要查看其它页对应的数据,可以通过鼠标点击(如单击)对应的页码控件,切换显示到对应的页面。本申请实施例中,为了减少第一设备内存的占用,第二设备每次向第一设备可以仅返回一页的数据。因此,当用户需要查看其它页对应的数据,通过鼠标点击新的页码控件时,第一设备可以向第二设备请求重新请求对应页面的数据,然后再通过JS文件进行解析并显示在用户界面中。
在用户界面102中,针对每一个属性,可以均包括对应的查询条件控件,如employee_name属性的查询条件控件1013。在用户需要为employee_name属性设置查询条件时,可以点击查询条件控件1013,响应于该操作,第一设备可以显示用户界面103。
如图1C所示,在用户界面103中,用户可以进行排序条件的选择,也可以设置过滤(筛选)条件。如在过滤条件2对应的选择列表1017中,可以包括LIKE_RIGHT_OR、LIKE_RIGHT_AND、IN_AND、IN_OR、EQ_AND等过滤类型,用户可以从这些过滤类型中进行选择,并且,用户还可以基于选择的过滤类型设置具体的过滤值。例如,可以选择过滤类型为LIKE_RIGHT_OR,并设置具体的过滤值为“张”。其中,每个过滤类型后面的AND或者OR用于指示一个过滤条件与上一个过滤条件之间的连接关系,AND或者OR前面部分用于指示具体的过滤方式,例如,LIKE_RIGHT可以用于在过滤值的右边添加通配符进行匹配,IN可以用于匹配属性值位于过滤值中的数据,EQ可以用于匹配属性值等于过滤值的数据。如图1D所示,在用户界面104中,未进行排序条件的设置,设置了两个过滤条件,这两个过滤条件用于查询employee_name属性值以“李”或者“张”开始的所有数据,也即是员工姓名姓“张”或者姓“李”的所有数据。之后,为了查看这两个过滤条件对应的查询结果,可以通过鼠标点击筛选控件1018,响应于该操作,第一设备可以向第二设备发送这两个过滤条件。第二设备接收到这两个过滤条件之后,可以基于这两个过滤条件返回对应的数据。之后,第一设备可以通过JS文件解析对应的数据,显示用户界面105。如图1E所示,在用户界面105中,可以过滤出员工姓名姓“张”或者姓“李”的所有数据。
在用户界面102的基础上,用户也可以为name属性设置查询条件。如图1F所示,在用户界面106中,可以设置按照name属性的值进行升序排序,以及设置过滤条件为name属性值等于“A部门”或者“C部门”。之后,为了查看对应的查询结果,可以通过鼠标点击筛选控件,响应于该操作,第一设备可以向第二设备发送用户选择的过滤条件和排序条件。第二设备接收到第一设备发送的过滤条件和排序条件之后,可以基于过滤条件和排序条件返回对应的数据。之后,第一设备可以通过JS文件解析对应的数据,显示用户界面107。如图1G所示,在用户界面107中,可以过滤出部门名称为“A部门”或者“C部门”的所有数据,并且按照部门名称进行升序排序,这里按照排序结果,可以将部门名称为“A部门”的数据显示在前,将部门名称为“C部门”的数据显示在后。应理解,上述仅呈现了单个属性的排序条件和过滤条件的设置,但用户也可以根据实际需要为多个属性均设置查询条件,对此不作限定。
为了更加清楚地体现本申请实施例中数据查询的灵活性,下面提供另一种用户界面,请参见图1H。在图1H所示的用户界面108中,可以包括一个用于设置查询条件的控件1019。在用户需要设置查询条件时,可以点击控件1019,响应于该操作,用户界面可以显示有可以用于设置查询条件显示区域。示例性的,针对于一个排序条件的设置,用户可以在属性下拉框中选择对应的属性,并且可以在排序下拉框中选择排序方式,以及可以设置对应的排序优先级。例如,当查询结果需要先基于name属性进行升序排序,当name属性的取值相同,需要再基于employee_name属性进行排序时,在用户界面108中,可以进行相应的设置。具体地,属性下拉框1020中选择的属性可以为name属性,对应的排序下拉框1021中选择的排序方式可以为升序,对应的优先级文本框1022中写入的优先级可以为1。第二个排序条件对应的属性下拉框中选择的属性可以为employee_name属性,对应的排序下拉框中选择的排序方式可以为降序,对应的优先级文本框中写入的优先级可以为2。
用户也可以进行过滤条件的设置,示例性的,针对于一个过滤条件的设置,用户可以在过滤类型下拉框中选择对应的过滤类型,并且可以在属性下拉框中选择对应的属性,以及可以设置对应的过滤值。例如,当需要查询employee_name属性值以“李”开始(A条件),并且name属性值等于“A部门”、“B部门”或者“C部门”(B条件)以及manager_name属性值以“张”开始(C条件)的所有数据。需要说明的是,这里包括一个嵌套关系,也即是A条件and(B条件and C条件)。在用户界面108中,可以进行相应的设置,具体地,筛选条件1的过滤类型下拉框1023中选择的过滤类型可以为LIKE_RIGHT_AND,属性下拉框1024中选择的属性可以为employee_name属性,对应的过滤值文本框1025中写入的过滤值可以为“李”。第二个筛选条件的过滤类型下拉框1026中选择的过滤类型可以为AND,这时,可以进行筛选条件的嵌套,例如,在子筛选条件设置部分1027可以嵌套两个子筛选条件,第一个子筛选条件的过滤类型下拉框中选择的过滤类型可以为IN_AND,属性下拉框中选择的属性可以为name属性,对应的过滤值文本框中写入的过滤值可以为“A部门;B部门;C部门”。第二个子筛选条件的过滤类型下拉框中选择的过滤类型可以为LIKE_RIGHT_AND,属性下拉框中选择的属性可以为manager_name属性,对应的过滤值文本框中写入的过滤值可以为“张”。当设置完排序条件和过滤条件之后,用户可以点击筛选控件,响应于该操作,第一设备可以向第二设备发送对应的排序条件和过滤条件。第二设备接收到排序条件和过滤条件之后,可以基于排序条件和过滤条件返回对应的数据。之后,第一设备可以通过JS文件解析对应的数据,显示在用户界面中。
可见,在上述用户界面中,可以支持用户灵活地设置排序条件和过滤条件,并且,过滤条件之间可以灵活地进行嵌套。例如,假设包括A、B、C、D、E等五个过滤条件,可以设置A条件or(B条件and C条件and D条件and E条件)、(A条件and B条件)or(C条件and D条件andE条件)、(A条件and B条件and C条件)or(D条件and E条件),等等。可见,本申请实施例可以支持用户的各种查询需求,可以优化用户体验。
本申请实施例中,为了提高前端部分的通用性,达到一次开发重复使用的效果,除了采用基于JS文件动态解析数据显示用户界面的方式之外,在用户设置查询条件时,第一设备可以基于第二设备首次返回的JSON对象中包括的类对象的各个属性名构造结构化的查询参数,然后可以向第二设备发送结构化的查询参数。也就是说,前端的JS文件还可以解析用户输入的过滤条件等,然后基于用户输入的过滤条件构建结构化的查询参数。当第二设备接收到第一设备发送的结构化的查询参数之后,可以结合类对象的各个属性与数据表的列之间的对应关系生成对应的SQL语句,以从数据库中查询对应的数据。
需要说明的是,图1A-图1H所示的用户界面只是示例性说明,并不对其构成限定。在本申请另一些实施例中,上述用户界面可以显示有更多或更少的控件、内容等,或者可以以不同的方式进行内容的排版布局等。例如,在用户界面中,可以针对所有属性提供一个统一的用于设置查询条件的显示区域,可以支持设置单个过滤条件、多个过滤条件的嵌套组合等。
为了更好地理解本申请实施例,下面先对本申请实施例的系统架构进行描述。
请参阅图2,图2是本申请实施例公开的一种第二设备的软件结构示意图。其中,第二设备200可以为机架式服务器、高密度服务器、整机柜服务器等各种类型的服务器,本申请实施例在此不作限定。
第二设备200可以包括查询转化模块201、配置模块202、数据库查询模块203,这三个模块也即是后端中的模块。
其中,查询转化模块201可以用于解析前端传递的查询参数,构建对应的QueryWrapper查询对象,并可以将构建的QueryWrapper查询对象传递给数据库查询模块203。
配置模块202可以用于配置查询SQL语句,以及可以用于配置类的属性与数据表的列之间的映射关系。
数据库查询模块203可以基于查询转化模块201构建的QueryWrapper查询对象以及配置模块202中配置的查询SQL语句生成完整的查询SQL语句,并可以基于该完整的查询SQL语句从数据库中查询到查询结果。之后,数据库查询模块203可以基于配置模块202中配置的类的属性与数据表的列之间的映射关系,将查询结果转换为对应的类对象。并且,为了便于进行数据传输,数据库查询模块203可以将类对象转换为JSON对象,然后可以将JSON对象返回给前端,以便于前端可以解析JSON对象进行数据的显示。在一种可能的实现方式中,数据库查询模块203可以基于Springboot框架的数据访问对象(data access object,DAO)层实现,最终可以由数据库连接器执行,如mysql-connector-java、ojdbc14、mssql-jdbc等数据库连接器。
应理解,为了便于描述,下面主要以MySQL数据库进行相关示例,但本申请实施例中对数据库的类型并不限定,也可以为Oracle数据库等。并且,数据库可以为集中式数据库,也可以为分布式数据库,在此不作限定。还应理解,数据库可以部署在第二设备中,也可以部署在其它设备中,在此不作限定。
需要说明的是,图2所示的软件结构只是示例性说明,并不对其构成限定。在本申请另一些实施例中,图2所示的软件结构可以包括比图示更多或更少的软件模块。
下面结合图3对本申请实施例的查询流程进行示例性说明。
请参阅图3,图3是本申请实施例公开的一种查询数据的处理流程示意图。如图3所示,本申请实施例中,主要涉及两种场景下的处理流程,一种是初始访问查询页面等场景下的处理流程,另一种是用户输入查询条件的场景下的处理流程,下面分别进行介绍。初始访问查询页面等场景下的处理流程可以包括但不限于如下步骤:
301.前端向后端的查询转化模块传递空查询条件。
通常情况下,用户初始访问查询页面时,如初始访问上述部门管理功能对应的URL地址时,此时,用户通常还无法输入查询条件,前端向后端可能仅发送了一个http请求,该http请求中并未携带查询参数,相当于传递的是空查询条件。
302.数据库查询模块基于配置模块中预先配置的查询SQL语句从数据库中查询数据,得到第一查询结果。
由于前端向后端传递的是空查询条件,因此,数据库查询模块可以直接基于预先配置的SQL语句从数据库中查询数据,可以得到第一查询结果。
303.数据库查询模块将第一查询结果转换为对应的类对象。
数据库查询模块可以基于类的属性与数据表的列之间的对应关系,将第一查询结果转换为对应的类对象。
304.数据库查询模块将类对象转换为对应的JSON对象。
数据库查询模块第一查询结果转换为对应的类对象之后,为了便于数据的传输,可以将类对象转换为对应的JSON对象。
305.数据库查询模块向前端返回JSON对象。
306.前端解析JSON对象,在用户界面中显示对应的第一查询结果。
当前端接收到后端返回的JSON对象之后,可以解析JSON对象,通过解析JSON对象可以确定类对象包括的属性,也可以得到第一查询结果。之后,前端可以在用户界面中显示第一查询结果。本申请实施例中,前端可以采用各类不同前端架构,如REACT、VUE、Django等架构。
应理解,在浏览器和服务器(browser/server,B/S)架构下,后端除了向前端返回JSON对象之外,还可以返回HTML文件、CSS文件、JS文件等资源文件,并且上述解析JSON对象的处理流程可以定义在JS文件中。还应理解,除了B/S架构之外,也可以采用客服端/服务端(client/server,C/S)架构,这种情况下,前端可以是Windows应用程序(application,APP)、安卓APP等,此时,上述解析JSON对象的处理流程可以定义在APP的处理流程中。
下面介绍用户输入查询条件的场景下的处理流程,该处理流程可以包括但不限于如下步骤:
307.前端基于用户输入的查询条件和类对象的属性生成查询参数,并向查询转化模块传递该查询参数。
当用户需要对数据进行过滤或者排序时,可以输入查询条件,如图1D、图1F所示。本申请实施例中,为了便于后端进行正确的处理,可以基于用户输入的查询条件和类对象的属性生成查询参数,并可以向后端传递该查询参数。
308.查询转化模块基于查询参数构建QueryWrapper查询对象。
查询转化模块接收到查询参数之后,可以解析查询参数,构建QueryWrapper查询对象。
309.数据库查询模块基于查询转化模块构建的QueryWrapper查询对象以及配置模块中预先配置的查询SQL语句从数据库中查询数据,得到第二查询结果。
QueryWrapper查询对象主要用于构建过滤查询条件、排序查询条件等,其可以与预先配置的查询SQL语句结合生成完整的查询SQL语句。基于该完整的查询SQL语句可以从数据库中查询到第二查询结果。
310.数据库查询模块将第二查询结果转换为对应的类对象。
311.数据库查询模块将类对象转换为对应的JSON对象。
数据库查询模块第二查询结果转换为对应的类对象之后,为了便于数据的传输,可以将该类对象转换为对应的JSON对象。
312.数据库查询模块向前端返回JSON对象。
313.前端解析JSON对象,在用户界面中刷新显示对应的第二查询结果。
当前端接收到后端返回的JSON对象之后,可以解析JSON对象,通过解析JSON对象可以得到第二查询结果。之后,前端可以在用户界面中显示第二查询结果。
需要说明的是,为了便于进行描述,上述前端可以设置于第一设备中,上述查询转化模块、配置模块、数据库查询模块等后端模块可以设置于第二设备中,但本申请实施例对此并不限定。例如,上述查询转化模块、配置模块、数据库查询模块也可以分别设置于不同的设备中,但彼此之间可以进行通信。还需要说明的是,上述处理流程仅是示例性说明,本申请实施例对其并不限定。
基于上述系统架构,请参阅图4,图4是本申请实施例公开的一种数据查询方法的流程示意图。如图4所示,该数据查询方法可以包括但不限于如下步骤:
401.第一设备显示地址栏界面,该地址栏界面包括地址栏。
具体地,当用户需要查看数据库中的数据时,如需要查看数据库中部门成员的相关数据时,可以打开第一设备的浏览器,然后,第一设备可以显示地址栏界面。其中,地址栏界面可以为浏览器的任意一个标签页,本申请实施例对此不作限定。例如,用户可以在浏览器中新建一个标签页,这个新建标签页可以为对应的地址栏界面。
402.第一设备接收用户针对地址栏的第一操作,向第二设备发送第一请求。
为了查看数据库中的某些数据,用户可以对地址栏界面中的地址栏执行第一操作。相应地,第一设备可以接收用户针对地址栏界面中的地址栏的第一操作,并且可以基于针对地址栏的第一操作向第二设备发送第一请求。相应地,第二设备可以接收到来自第一设备的第一请求。应理解,由于第一请求主要是用于访问初始查询页面(如图1B所示的用户界面102),因此,在第一设备发送第一请求时,第一设备通常不知道包括哪些属性,不知道可以基于哪些属性设置查询条件,这种情况下,第一请求中可以不包括查询参数,不包括过滤条件、排序条件等查询条件,并且,第一请求中也可以不包括分页参数等。在一种可能的实现方式中,第一请求可以为GET请求。其中,GET请求为超文本传输协议(hyper texttransfer protocol,HTTP)请求中的一种,一般可以用于向第二设备请求获取数据。
用户针对地址栏的第一操作可以为:用户在地址栏界面的地址栏中输入第一URL地址(如“http://192.168.206.128/department-manage”),并执行针对地址栏的输入操作(如回车)。第一URL地址可以为用户需要查看的数据库中的数据对应的URL地址,如上述用于查看部门成员相关数据的URL地址。
在一种可能的实现方式中,可以不包括步骤401,用户可以直接访问第一设备中的一个应用程序,此时,也可以触发第一设备向第二设备发送第一请求。并且,这种方式下,应用程序中可以定义有处理逻辑,如解析第二设备返回的数据的处理逻辑。
403.第二设备基于第一请求从数据库中获取第一查询结果。
第二设备接收到来自第一设备的第一请求之后,可以确定第一请求中不包括查询参数、分页参数等参数,这种情况下,第二设备可以基于预设的查询SQL语句和预设的分页参数从数据库中获取第一查询结果。
具体地,本申请实施例中,可以基于Mybatis-Plus的Mapper文件配置查询SQL语句。在Mapper文件中配置查询SQL语句时,可以根据实际需要配置需要查询的列,并且可以进行联表配置。示例性的,联表查询SQL语句的格式可以如下所示:
SELECT主对象名称.列名1as主对象表列名1,
主对象名称.列名2as主对象表列名2,
对象属性1名称.列名1as子对象1表列名1,
对象属性2名称.列名1as子对象2表列名1
FROM主对象表名主对象名称
LEFT JOIN子对象表名1对象属性1名称ON联表条件1
LEFT JOIN子对象表名2对象属性2名称ON联表条件2
其中,上述查询语句中由于进行了联表操作,不同的表中可能包括相同的列名,因此,为了进行区分,可以对列名进行重命名。并且,在进行连接时,为了清楚的表示查询SQL语句,可以为各个表设置别名,别名可以为对应的对象名称或者对象属性名称,例如,主对象表名的别名可以为对应的主对象名称,子对象表名的别名可以为主对象中定义的对象属性名称,也即是主对象中定义的属性名。示例性的,子对象表名1的别名可以为对应的对象属性1名称,子对象表名2的别名可以为对应的对象属性2名称。主表的列名1可以重命名为主对象表列名1,主表的列名2可以重命名为主对象表列名2。子表1的列名1可以重命名为子对象1表列名1,子表2的列名2可以重命名为子对象2表列名1。上述LEFT JOIN为左连接,但本申请实施例对联表方式不作限定,也可以为右连接等方式。联表条件可以是主表的一个或多个列与子表的一个或多个列之间的对应关系,主表和子表之间可以基于该对应关系进行连接。
本申请实施例中,假设需要在Mapper文件中配置查询部门成员相关数据的查询SQL,为了便于理解查询SQL的配置,下面先对数据库中涉及的表进行示例性说明。假设数据库中可以包括两张表,一张为部门(department)表,一张为员工(employee)表。数据库中department表的相关列的信息可以如下表1所示:
表1
列名 | 数据类型 | 注释 |
id | bigint | 表主键,用于标记唯一的一条记录 |
name | varchar | 部门名称 |
code | varchar | 部门编码 |
manager_id | bigint | 关联的employee表id,表示部门经理 |
从上述表1可见,department表可以包括id、name、code、manager_id等4列,也就是说,department表中的一条记录可以包括4个字段值,一条记录的id值可以用于唯一标识该记录,一条记录的name值可以为该记录对应的部门名称,一条记录的code值可以为该记录对应的部门编码,一条记录的manager_id值可以为该记录对应的部门经理的id,该部门经理的id可以用于唯一标识关联的employee表中的一条记录。
数据库中employee表的相关列的信息可以如下表2所示:
表2
列名 | 数据类型 | 注释 |
id | bigint | 表主键,用于标记唯一的一条记录 |
emp_name | varchar | 员工姓名 |
code | varchar | 员工所在部门编码 |
从上述表2可见,employee表可以包括id、emp_name、code等3列,也就是说,employee表中的一条记录可以包括3个字段值,一条记录的id值可以用于唯一标识该记录,一条记录的emp_name值可以为该记录对应的员工姓名,一条记录的code值可以为该记录对应的部门编码。
基于上述示例的department表和employee表,Mapper文件中配置的用于查询员工相关数据的查询SQL语句可以如下所示:
/>
其中,上述<select>为Mybatis-Plus提供的xml标签,可以用于标记查询SQL语句。select标签中的id属性可以用于唯一标识对应的查询SQL语句,并且,id属性可以被用来引用对应的查询SQL语句,例如,通过"selectListByQw"可以引用select标签中配置的查询SQL语句。resultMap属性可以用于指示对应的resultMap配置,如指示id为"DepartmentMap"的resultMap配置。同时,由于本申请实施例中需要基于QueryWrapper查询对象动态构造查询条件,因此,为了引用QueryWrapper查询对象对应的查询条件,可以在配置的查询SQL语句后面追加${ew.customSqlSegment}参数,该参数追加之后,Mybatis-Plus可以对配置的QueryWrapper查询对象进行翻译,将其翻译为对应的过滤语句(如where语句)、排序语句(如order by语句)等,并可以将翻译得到的过滤语句和排序语句追加到上述配置的查询SQL语句之后。上述查询SQL语句中,在Department表的基础上,以Department表和manager表中的id值相等为条件进行了左联表操作,在此基础上,进一步以Department表和employee中的code值相等为条件进行了左联表操作。并且,查询Department表中的name字段和code字段,查询manager表中的emp_name字段和code字段,以及查询employee表中的emp_name字段和code字段。
由于第一请求中不包括查询参数、分页参数等参数,第二设备可以直接基于Mapper文件中配置的查询SQL语句和预设的分页参数从数据库中获取第一查询结果。分页参数可以包括两部分,一部分为需要查询的页(如查询第1页),另一部分为分页值,也即是每页包括多少条数据。例如,默认可以每页包括10条数据,并且查询第一页,也即是查询默认查询前10条数据。第二设备可以基于Mapper文件中配置的查询SQL语句查询第一页的数据,可以得到第一查询结果。在一种可能的实现方式中,第二设备可以基于Mysql数据库中的limit机制实现分页操作,获取特定页(如第一页)的数据。
404.第二设备将第一查询结果转换为对应的类对象。
本申请实施例中,第二设备从数据库中读取到第一查询结果之后,可以将第一查询结果转换为对应的类对象。
示例性的,对实体对象的定义可以包括两种类型,也即是可以包括两种类型的类,分别为主对象和子对象。主对象可以对应需要查询的主表,子对象可以对应需要查询的子表。
示例性的,以JAVA编程语言定义主对象的代码可以如下所示:
其中,上述@TableName和@TableField可以为Mybatis-Plus提供的注解,@TableName可以用于标记对象(类)与表之间的对应关系,@TableField可以用于标记对象的属性与数据表中的列之间的对应关系。@IsQuery可以为自定义的注解,用于标记对应的属性是否可进行查询。本申请实施例中,如果某个属性不允许进行设置过滤条件,可以通过设置@IsQuery注解,并可以将@IsQuery注解对应的值设为false,这样,可以对可过滤的属性进行限制,可以保障查询的安全性。此外,由于部分属性的过滤需要消耗大量的处理资源,因此,通过@IsQuery注解对这些属性进行过滤限制可以降低对第二设备性能的影响。属性类型可以为相关编程语言支持的数据类型,针对于JAVA而言,属性类型可以为Integer、String、Datetime等。本申请实施例中,为表征对象之间的关系,主对象的属性的数据类型可以为子对象类型。如上述示例中,对象属性1可以为子对象1类型的数据,主对象与对象属性1之间可以为1:1的关系,对象属性2可以为子对象2的List(列表)类型,主对象与对象属性2之间可以为1:N的关系,N为大于或等于1的整数。并且,为了满足更复杂的查询,表征更复杂的对象关系,子对象的属性的数据类型也可以为下级子对象类型。也就是说,可以包括多级子对象的嵌套,示例性的,主对象的属性的数据类型可以为一级子对象类型(如上述子对象1类型),一级子对象的属性的数据类型可以为二级子对象类型,二级子对象的属性的数据类型可以为三级子对象类型,等等。通过这种对象定义方式,可以抽象定义出复杂的数据类型,可以满足各种不同的查询场景。
本申请实施例中,为了查询部门成员相关数据,可以定义两个对象,分别为部门(Department)对象和员工(Employee)对象,其中,部门对象可以为主对象,员工对象可以为子对象。部门对象和员工对象的定义可以基于数据库中的department表和employee表,下面分别对部门对象和员工对象进行示例性说明。应理解,一个部门可以包括对应的部门名称和部门编码,也可以包括对应的部门经理以及部门员工。Department对象(类)的定义可以如下所示:
上述定义中,部门对象名称可以为Department,并且可以与数据库中的department表对应。部门对象可以包括部门名称属性(name)和部门编码属性(code),数据类型可以均为String类型,部门名称属性可以对应department表中列名为“name”的列,部门编码属性可以对应department表中列名为“code”的列。部门对象还可以包括部门经理属性(manager),其数据类型可以为Employee子对象类型,可以标识部门与部门经理之间为1:1的关系。部门对象还可以包括部门员工属性(employee),其数据类型可以为Employee子对象的List类型,可以标识部门与部门员工之间为1:N的关系。
Employee对象的定义可以如下所示:
上述定义中,员工对象名称可以为Employee,并且可以与数据库中的employee表对应。员工对象可以包括员工姓名属性(name)和部门编码属性(code),数据类型可以均为String类型,员工姓名属性可以对应employee表中列名为“emp_name”的列,部门编码属性可以对应employee表中列名为“code”的列。
为了将第一查询结果转换为对应的类对象,如上述Department类对象,还需要在Mapper文件中配置Department类的属性与查询结果中各个列之间的映射关系。示例性的,resultMap配置可以如下所示:
其中,上述<resultMap>为Mybatis-Plus提供的xml标签,可以用于配置类的属性与查询结果中各个列之间的映射关系。上述resultMap配置中,还包括result、collection、association等标签。其中,result标签可以标记查询结果中的列与类的属性之间的关系,collection标签可以标记1对多的关系,association标签可以标记1对1的关系。此外,在一些情况下,resultMap配置中还可以包括id标签,id标签可以标记查询的主键与类的id属性之间的对应关系。具体地,上述resultMap标签中的id属性可以用于标记resultMap配置,该id属性的取值可以与上述查询SQL配置中的select标签中的resultMap的取值相同。resultMap标签中的type属性可以用于指示映射的类,取值可以为对应的类名称,如上述定义的Department类名称。Result标签中的column属性的取值可以为查询结果中的列名,property属性的取值可以为对应类中的属性名,这样可以将对应列和属性进行相应的匹配。例如,查询结果中的name列可以与Department类的name属性匹配,查询结果中的code列可以与Department类的code属性匹配。association标签中的property属性的取值可以为对应类中的属性名,ofType属性的取值可以为该属性对应的类名称。例如,property属性的取值可以为Department类中的manager属性名,manager属性对应的数据类型可以为Employee类,并且为1对1的映射关系。而由于manager属性是Employee类,因此,manager属性可以包括name属性和code属性,查询结果中的manager_name列可以与manager属性的name属性对应,查询结果中的manager_code列可以与manager属性的code属性对应。collection标签中的property属性的取值可以为对应类中的属性名,javaType属性的取值可以为该属性对应的类名称。例如,property属性的取值可以为Department类中的employee属性名,employee属性对应的数据类型可以为Employee类,并且为1对多的映射关系。而由于employee属性对应Employee类,一个employee属性可以包括多个Employee实例,因此,查询结果中的employee_name列可以与employee属性的name属性对应,查询结果中的employee_code列可以与employee属性的code属性对应。
基于上述resultMap配置,第二设备可以将第一查询结果转换为对应的类对象(类实例),如Department类对象。
405.第二设备将第一查询结果对应的类对象转换为对应的JSON对象。
第二设备将第一查询结果转换为对应的类对象之后,为了便于进行数据的传输和解析,可以将该类对象转换为对应的JSON对象。在一种可能的实现方式中,第二设备可以调用类对象转JSON对象的函数将第一查询结果对应的类对象转换为对应的JSON对象。
应理解,经第一查询结果对应的类对象转换得到的JSON对象可以包括该类对象中的属性名称与属性值组成的键值对。并且,如果该类对象的属性值为其它类实例,这种情况下,对应键值对中的值可以为其它类实例对应的JSON对象,这样,可以通过JSON对象的嵌套描述对应的属性关系。
应理解,第一查询结果对应的类对象可以包括多个,因此,经第一查询结果对应的类对象转换得到的第一查询结果对应的JSON对象可以包括与该多个类对象分别对应的JSON对象。
举例说明,假设第一查询结果为下表3所示:
表3
name | code | manager_name | manager_code | employee_name | employee_code |
A部门 | 90001 | 王五 | 90001 | 张三 | 90001 |
A部门 | 90001 | 王五 | 90001 | 马五 | 90001 |
A部门 | 90001 | 王五 | 90001 | 王五 | 90001 |
C部门 | 90003 | 赵七 | 90003 | 赵七 | 90003 |
上述表3所示查询结果可以转换为A部门和C部门两个Department类实例。这两个Department类实例可以分别转换为对应的JSON对象,A部门实例对应的JSON对象可以如下所示:
/>
应理解,上述流程中是将类对象转换为对应的JSON对象,但在本申请另一些实施例中,也可以将类对象转换为其它格式的数据,在此并不限定。
406.第二设备基于第一查询结果对应的JSON对象生成第一目标数据。
本申请实施例中,为了提高前端部分的通用性,第二设备向第一设备发送数据之前,可以按照预设的格式对数据进行封装,这样,第一设备之后可以基于预设的格式进行数据的解析,并可以基于解析结果为用户呈现对应的查询结果,以及可以基于解析结果为用户提供过滤条件、排序条件等设置。
在一种可能的实现方式中,第二设备向第一设备返回的目标数据可以包括执行结果码、执行结果码描述、查询结果、分页数据等四部分。执行结果码可以用于描述本次执行数据查询的相关信息,可以描述本次查询是否成功,或者可以呈现系统中的报错或者告警。例如,可以预先定义多个不同的执行结果码,不同的结果码代表不同的含义,如结果码200可以代表查询成功,结果码800可以代表查询失败,XX不在查询范围内,等等。执行结果码描述是对执行结果码的补充说明,可以包括关于本次数据查询更详细的信息,如可以包括查询失败的具体原因等。查询结果是本次查询的结果值,例如,可以为本次查询结果对应的JSON对象。分页数据可以包括四个字段,分别为查询页、分页值、分页总页数和总记录数。其中,查询页用于指示本次查询的页是第几页(如第1页),分页值是每页包括多少条数据,总记录数是本次查询涉及到的总的记录数量,是本次查询SQL语句涉及到的总记录数,分页总页数可以等于是总记录数按照分页值可以分为的页数,/>表示向上取整。
示例性的,目标数据的结构可以如下所示:
其中,上述目标数据是以JSON格式进行组织,键值对("code":"执行结果码")可以用于存储执行结果码,键值对("message":"执行结果码描述")可以用于存储执行结果码描述。"result"作为键,其值可以为对象数组,该对象数组可以用于存储查询结果,该对象数组中的每一个json对象可以与一个类实例对应。"pageModel"作为键,其值可以为一个json对象,该json对象可以用于存储分页数据,该json对象中可以包括4个键值对,键值对("pageNum":"查询页")可以用于存储查询页,键值对("pageSize":"分页值")可以用于存储分页值,键值对("totalPage":"分页总页数")可以用于存储分页总页数,键值对("totalCount":"总记录数")可以用于存储总记录数。
应理解,第一目标数据中的总记录数与本次查询对应的查询SQL语句有关,例如,总记录数为Mapper文件中配置的查询SQL语句涉及的总记录数。示例性的,第二设备可以通过统计函数(如MySQL的count函数)统计查询SQL语句涉及的总记录数。第一目标数据中的分页总页数可以通过总记录数和分页值计算得到。第一目标数据中的分页值可以为预设的分页值,如10条每页。第一目标数据中的查询页可以为预设的查询页,如第1页。第一目标数据中的执行结果码和执行结果码描述可以在执行查询的相关过程中被赋值。例如,当满足某种情况时,执行结果码和执行结果码描述可以被赋予对应的值。如查询成功的情况下,执行结果码可以赋值为200,执行结果码描述可以赋值为success(成功)。
第一目标数据中的查询结果可以为对象数组,该对象数组中可以包括上述第一查询结果对应的JSON对象。
407.第二设备向第一设备发送第一目标数据。
第二设备生成第一目标数据之后,可以向第一设备发送第一目标数据。并且,在采用B/S架构的情况下,为了便于第一设备解析第一查询结果并显示对应的用户界面,第二设备还可以向第一设备发送对应的HTML文件、CSS文件、JS文件等资源文件。
408.第一设备基于第一目标数据显示第一界面,第一界面包括第一查询结果和第一控件。
第一设备接收到来自第二设备的第一目标数据之后,可以解析第一目标数据,并可以基于解析结果显示第一界面。示例性的,第一设备可以基于第二设备返回的JS文件解析第一目标数据,可以得到第一查询结果。并且,第一设备可以基于第二设备返回的HTML文件、CSS文件等显示第一界面,第一界面可以包括第一查询结果。
此外,为了便于用户进行数据的过滤、排序、分页等操作,第一界面中还可以包括第一控件,第一控件可以用于用户设置排序条件、过滤条件、分页条件等。示例性的,第一界面可以参考图1B所示的用户界面102。可以理解的是,第一控件的呈现形式可以有多种,本申请实施例并不对其进行限定。例如,第一控件可以参考用户界面102中所示的控件,具体可以包括每个字段对应的过滤控件和排序控件,以及可以用于设置分页值的控件(如下拉框1015)和设置页码的控件(如第1页的页码控件1016)等。再例如,第一控件可以为用于设置排序条件、过滤条件、分页条件等查询条件的统一的控件。
409.第一设备接收用户基于第一控件输入的查询条件。
在第一界面中,用户可以查看到第一查询结果,可以确定查询结果中包括哪些字段,也可以查看到相关分页数据。之后,如果用户需要进行数据的过滤、排序或者需要调整分页值等,用户可以基于第一控件输入查询条件,查询条件可以包括1个或多个字段的过滤条件、排序条件等,也可以包括分页值、查询页等。相应地,第一设备可以接收到用户基于第一控件输入的查询条件。示例性的,用户基于第一控件输入查询条件的操作可以参考图1C所示的用户界面103的相关描述。
410.第一设备基于用户输入的查询条件构建目标查询参数。
本申请实施例中,为了便于第二设备动态地构造查询条件,第一设备可以基于预设的格式对用户输入的查询条件进行封装,可以得到目标查询参数。需要说明的是,第一设备可以包括配置文件(如JS文件),第一设备可以通过配置文件对用户输入的查询条件进行封装,可以得到目标查询参数。
在一种可能的实现方式中,目标查询参数可以包括查询页、分页值、升序属性数组、降序属性数组和过滤对象数组。其中,查询页可以用于指示本次查询的页是第几页(如第1页),分页值可以用于指示每页包括多少条数据。升序属性数组可以用于指示本次查询结果基于哪些属性进行升序排序,降序属性数组可以用于指示本次查询结果基于哪些属性进行降序排序。过滤对象数组可以用于指示本次查询的过滤条件。
示例性的,目标查询参数的结构可以如下所示:
其中,上述目标查询参数是以JSON格式进行组织,键值对("pageNum":"查询页")可以用于存储查询页,键值对("pageSize":"分页值")可以用于存储分页值。"orderByAsc"作为键,其值可以为升序属性数组,该升序属性数组中可以存储升序属性名称,该升序属性名称可以用于指示需要进行升序排序的属性。"orderByDesc"作为键,其值可以为降序属性数组,该降序属性数组中可以存储降序属性名称,该降序属性名称可以用于指示需要进行降序排序的属性。"pageFilter"作为键,其值可以为对象数组,该对象数组可以用于存储过滤条件,该对象数组中的每一个json对象可以与一个过滤条件对应。为了便于描述,下述将该对象数组中的一个json对象称为过滤参数对象。每个过滤参数对象可以包括3个键值对,键值对("column":"属性名称")可以用于存储对应属性的名称,键值对("value":"查询值")可以用于存储对应属性的查询值,键值对("filterType":"过滤类型")可以用于存储对应属性的过滤方式和联接关系。
需要说明的是,本申请实施例为了标识过滤参数对象之间的联接关系,每个过滤类型可以包括两部分,一部分用于指示具体的过滤方式,一部分为用于指示联接关系的后置参数,该后置参数可以为AND或者OR,AND可以用于标识一个过滤参数对象与前一个过滤参数对象之间为AND的联接关系,OR可以用于标识一个过滤参数对象与前一个过滤参数对象之间为OR的联接关系。示例性的,过滤类型可以包括EQ_AND、EQ_OR、IN_AND、IN_OR、LIKE_RIGHT_AND、LIKE_RIGHT_OR、BETWEEN_AND,等等。EQ_AND可以用于指示对应的过滤方式为EQ,联接关系为AND。EQ_OR可以用于指示对应的过滤方式为EQ,联接关系为OR。同理,其它过滤类型也可以同样理解。例如,LIKE_RIGHT_AND可以用于指示对应的过滤方式为LIKE_RIGHT,联接关系为AND。LIKE_RIGHT_OR可以用于指示对应的过滤方式为LIKE_RIGHT,联接关系为OR。此外,由于上述IN、BETWEEN等过滤方式可以包括多个查询值,因此,为了对多个查询值进行区分,当过滤参数对象中"value"键对应的值包括多个查询值时,这多个查询值之间可以通过分隔符(如分号";")进行区分。
还需要说明的是,为了支持更加复杂的查询,如多个查询条件之间的嵌套组合查询,过滤参数对象可以分为多个层级,可以包括一级过滤参数对象、二级过滤参数对象、三级过滤参数对象,等等。例如,在进行二级过滤参数对象的嵌套时,一级过滤参数对象可以包括"filterType"键和"value"键,"filterType"键对应的值可以为AND或者OR,用于指示该一级过滤参数对象与前一个一级过滤参数对象之间的联接关系。"value"键对应的值可以为对象数组,该对象数组中可以包括一个或多个二级过滤参数对象。同理,一个二级过滤参数对象的"value"键对应的值也可以为对象数组,该对象数组中可以包括一个或多个三级过滤参数对象。
基于上述目标查询参数的结构,第一设备接收到用户输入的查询条件之后,可以基于该查询条件构建目标查询参数。例如,如图1D所示的用户界面104所示,假设用户需要查询employee_name属性值以“李”或者“张”开始的所有数据,此时,用户输入的查询条件可以包括两个过滤条件,过滤条件1为(employee_name,LIKE_RIGHT_OR,"李"),过滤条件2为(employee_name,LIKE_RIGHT_OR,"张")。此外,查询条件还可以包括查询页和分页值等,查询页可以为"1",分页值可以为"10"。基于上述查询条件生成的目标查询参数可以如下所示:
需要说明的是,本申请实施例中,在解析第一目标数据时可以获取到第一查询结果中各个列对应的属性名称,也即是主对象的属性名称和子对象的属性名称。因此,在构建目标查询参数时,第一设备可以直接使用之前解析得到各个列对应的属性名称。具体地,在一种可能的实现方式中,可以通过预设的格式表示"column"键对应的值。示例性的,如果第一查询结果中一个列对应的为主对象的某个属性,那么该列对应的属性名称可以为该主对象属性对应的属性名称,具体可以为主对象标记(如".")+该主对象属性的属性名称,例如,上述name列对应的属性名称可以为".name",code列对应的属性名称可以为".code"。如果第一查询结果中一个列对应的为主对象的某个属性的子属性(子对象属性),那么该列对应的属性名称可以为该子对象属性对应的属性名称,具体可以为该主对象属性的属性名称+分隔标记(如".")+该主对象属性的子属性的属性名称,例如,上述manager_name列对应的属性名称可以为"manager.name",manager_code列对应的属性名称可以为"manager.code",employee_name列对应的属性名称可以为"employee.name",employee_code列对应的属性名称可以为"employee.name"。同理,针对于更复杂的嵌套情况,"column"键对应的值也可以为主对象属性的属性名称+分隔标记(如".")+一级子对象的属性的属性名称+…+分隔标记(如".")+N级子对象的属性的属性名称。
411.第一设备向第二设备发送第二请求,第二请求包括目标查询参数。
第一设备基于用户输入的查询条件构建目标查询参数之后,可以向第二设备发送第二请求,第二请求中可以包括目标查询参数。
412.第二设备基于目标查询参数生成目标查询SQL语句。
第二设备接收到来自第一设备的目标查询参数之后,可以基于目标查询参数动态地生成目标查询SQL语句。具体地,目标查询参数中可以包括查询页、分页值、升序属性数组、降序属性数组和过滤对象数组。第二设备可以基于升序属性数组生成对应的升序SQL语句,也可以基于降序属性数组生成对应的降序SQL语句。第二设备也可以基于过滤对象数组生成对应的过滤SQL语句(如where过滤语句)。第二设备也可以基于查询页和分页值生成分页SQL语句,如limit SQL语句。并且,第二设备可以基于对应的升序SQL语句、降序SQL语句、过滤SQL语句、分页SQL语句和预先配置的查询SQL语句得到完整的查询SQL语句,以从数据库中获取第二查询结果。
在一种可能的实现方式中,可以在Mapper文件中配置对应的查询SQL语句,并且可以在配置的查询SQL语句后面追加${ew.customSqlSegment}参数。之后,第二设备可以基于目标查询参数构建对应的QueryWrapper查询对象,Mybatis-Plus可以对QueryWrapper查询对象进行翻译,将其翻译为对应的过滤SQL语句(如where语句)、排序SQL语句(如order by语句)等,并可以将翻译得到的过滤语句和排序语句追加到上述配置的查询SQL语句之后。应理解,构建QueryWrapper查询对象主要可以包括两部分,一部分为:解析升序属性数组和降序属性数组,并调用QueryWrapper查询对象对应的排序方法设置排序条件,另一部分为:解析过滤对象数组,并调用QueryWrapper查询对象对应的过滤方法设置过滤条件。下面分别对这两部分进行介绍。
下面结合图5先对排序条件的设置进行介绍,请参见图5,图5是本申请实施例公开的一种解析升序属性数组和/或降序属性数组的流程示意图。如图5所示,该解析流程可以包括但不限于如下步骤:
501.第二设备遍历升序属性数组和/或降序属性数组。
在目标查询参数中包括升序属性数组的情况下,第二设备可以遍历升序属性数组,以便于设置升序排序条件。在目标查询参数中包括降序属性数组的情况下,第二设备可以遍历降序属性数组,以便于设置降序排序条件。在目标查询参数中包括升序属性数组和降序属性数组的情况下,第二设备可以分别遍历升序属性数组和降序属性数组,以便于设置升序排序条件和降序排序条件。
502.第二设备判断属性数组中的数组元素是否为主对象属性对应的属性名称,在为主对象属性对应的属性名称的情况下,可以执行步骤503,在不为主对象属性对应的属性名称的情况下,可以执行步骤505。
在遍历升序属性数组或降序属性数组时,第二设备可以依次判断升序属性数组或降序属性数组中每一个数组元素是否为某个主对象属性对应的属性名称,在为某个主对象属性对应的属性名称的情况下,可以执行步骤503,在不为某个主对象属性对应的属性名称的情况下,可以执行步骤505。
示例性的,主对象属性对应的属性名称可以以“主对象标记(如".")+对应主对象属性的属性名称”的形式进行表示,子对象属性对应的属性名称可以以“主对象属性名称+分隔标记(如".")+一级子对象的属性的属性名称+…+分隔标记(如".")+N级子对象的属性的属性名称”的形式进行表示,具体可以参考上述相关描述。基于此,第二设备可以判断升序属性数组或降序属性数组中每一个数组元素的第一个字符是否为".",如果某个数组元素的第一个字符为".",可以确定该数组元素为主对象属性对应的属性名称,反之,则可以确定该数组元素为子对象属性对应的属性名称。
503.第二设备通过反射的方式获取主对象属性对应的列名。
在确定一个数组元素为某个主对象属性对应的属性名称之后,第二设备可以基于对应的主对象属性名称通过反射的方式获取该主对象属性对应的列名。
具体地,在一种可能的实现方式中,第二设备可以基于主对象名称获取主对象的类(Class)对象,如通过主对象名称.class获取主对象的Class对象。之后,第二设备可以基于主对象的Class对象获取主对象的各个属性对应的属性对象(Field),如通过调用主对象的Class对象的getFields()方法获取各个属性对应的属性对象。其中,每个属性对象可以包括对应的注解获取方法、属性类型获取方法、属性名称获取方法等。每个属性对象对应的属性名称获取方法可以用于获取对应属性的属性名称,例如,通过调用上述Department类的name属性对象的属性名称获取方法,可以获取name属性的属性名称,通过该属性名称可以与升序属性数组或降序属性数组中的数组元素进行匹配。示例性的,属性名称获取方法可以为getName()。每个属性对象对应的注解获取方法可以用于获取对应属性的注解信息,例如,通过调用上述Department类的name属性对象的注解获取方法可以获取name属性的注解信息,如获取name属性的@TableField注解的注解信息,该注解信息可以包括name属性对应的数据表中的列名,也即是该注解信息可以包括"name"。示例性的,注解获取方法可以为getAnnotations(),该方法可以包括注解类型参数,用于获取指定类型的注解,如通过getAnnotation(TableField.class)可以获取@TableField类型的注解。每个属性对象对应的属性类型获取方法可以用于获取对应属性的数据类型,例如,通过调用上述Department类的manager属性对象的属性类型方法可以获取manager属性的数据类型,可以确定manager属性的数据类型为Employee类。示例性的,属性类型获取方法可以为getType()、getGenericType()等。
上述处理过程中,通过构造一个类的Class对象,然后基于该Class对象获取对应的属性对象,然后基于属性对象获取对应属性的相关信息(如注解信息、属性类型信息等)的方式为反射的方式。应理解,反射的方式除了可以获取对应属性的相关信息之外,也可以获取对应方法的相关信息(如方法名称、方法参数等)。
可以理解的是,本申请实施例中,通过反射的方式获取对象属性对应的列名,可以降低表中字段名称(列名)变更对程序的影响。当表字段名称变更时,对应修改@TableField注解中的值即可,不需要对整体程序的处理逻辑进行修改。并且,通过反射的方式可以快速地获取对象属性对应的列名,便于构建对应的QueryWrapper查询对象,从而可以提高整体的查询效率。
504.第二设备基于主对象名称和主对象属性对应的列名得到排序参数值。
具体地,由于在Mapper文件配置的查询SQL语句中,主表的别名可以为主对象名称,因此,在基于某一个主对象属性对应的列设置查询条件时,需要使用主对象名称+主对象属性对应的列名的方式指示对应的列。示例性的,主对象名称可以为"Department",某个主对象属性对应的列名可以为"name",基于该主对象名称和对应的列名得到的排序参数值可以为"Department.name"。
505.第二设备通过反射的方式获取子对象属性对应的列名。
在确定一个数组元素不为某个主对象属性对应的属性名称之后,表明该数组元素为某个子对象属性对应的属性名称,第二设备可以基于对应的子对象属性名称通过反射的方式获取该子对象属性对应的列名。
具体地,由于子对象属性对应的属性名称可以以“主对象属性名称+分隔标记(如".")+一级子对象的属性的属性名称+…+分隔标记(如".")+N级子对象的属性的属性名称”的形式进行表示,因此,如果一个数组元素为某个子对象属性对应的属性名称,第二设备可以先基于主对象名称.class获取主对象的Class对象,然后可以基于主对象的Class对象获取主对象的各个属性对应的属性对象。之后,第二设备可以基于该数组元素中的主对象属性名称进行匹配,可以得到对应的属性对象。之后,可以基于该属性对象的属性类型方法获取对应属性的数据类型,也即是获取一级子对象名称。之后,可以基于一级子对象名称再获取对应的Class对象,然后再基于该Class对象获取对应的属性对象,之后,第二设备可以基于该数组元素中的一级子对象的属性的属性名称进行匹配,可以得到对应的属性对象。同理,可以按照上述方式匹配到该数组元素中的N级子对象的属性的属性名称对应的属性对象,并可以基于该属性对象获取到子对象属性对应的列名。
示例性的,假设某个子对象属性对应的属性名称为"employee.name"。第二设备可以先获取Department类的Class对象,然后可以基于该Class对象获取Department类的各个属性对应的属性对象。之后,第二设备可以确定所有属性对象中属性名称为"employee"的属性对象,然后可以基于该属性对象获取employee属性的数据类型,可以确定为"Employee"类型。之后,第二设备可以获取Employee类的Class对象,然后可以基于该Class对象获取Employee类的各个属性对应的属性对象。之后,第二设备可以确定所有属性对象中属性名称为"name"的属性对象,然后可以基于该属性对象获取该子对象属性对应的列名,也即是"name"。
可以理解的是,上述在通过反射的方式获取列名时,可能会多次获取类对象、多次调用属性名称获取方法等。因此,为了提高列名的获取效率,可以预先获取或者动态获取主对象的所有属性对应的属性对象。之后,可以以属性名称作为键,对应的属性对象作为值,组合成键值对。再之后,第二设备可以直接基于数组元素中的主对象属性名称从键值对中获取对应的属性对象,然后可以调用属性对象的方法获取对应的列名、数据类型等。或者,也可以以属性名称作为键,对应的属性对象的JSON对象作为值,组合成键值对。其中,对应的属性对象的JSON对象中可以包括一个或多个键值对,该一个或多个键值对可以用于存储对应的列名、数据类型等。同理,针对于子对象,也可以预先获取子对象的所有属性对应的属性对象。之后,可以以属性名称作为键,对应的属性对象作为值,组合成键值对。或者,也可以以属性名称作为键,对应的属性对象的JSON对象作为值,组合成键值对。例如,一种实现方式中生成的键值对数据可以如下所示:
506.第二设备基于对应的属性名称和子对象属性对应的列名得到排序参数值。
具体地,由于在Mapper文件配置的查询SQL语句中,子表的别名可以为主对象中定义的对象属性名称,因此,在基于某一个子对象属性对应的列设置查询条件时,需要使用对应的属性名称+对应的列名的方式指示对应的列。示例性的,基于"employee.name"数组元素获取的对应的列名可以为"emp_name","employee.name"数组元素对应的属性名称可以为主对象属性名称"employee",基于该主对象属性名称和对应的列名得到的排序参数值可以为"employee.emp_name"。
507.第二设备调用QueryWrapper查询对象对应的排序方法,并传入排序参数值。
第二设备获取到排序参数值之后,可以调用QueryWrapper查询对象对应的排序方法,并传入排序参数值。示例性的,排序方法可以包括orderByAsc()方法和orderByDesc()方法,orderByAsc()方法为升序排序方法,orderByDesc()方法为降序排序方法。
可以理解的是,在包括多个排序参数值的情况下,需要基于多个排序参数值进行排序。因此,为了正确地进行排序,每个参数值可以包括对应的排序优先级,排序优先级可以用于指示多个排序参数值的排序顺序。示例性的,用户传入的属性数组(包括升序属性数组和降序属性数组)中可以包括每一个数组元素的排序优先级。在一种可能的实现方式中,排序优先级可以通过数字表示,如1~100表示,数字越小,排序优先级越大,可以优先进行排序。
举例说明,排序参数值可以包括"Department.name"、"employee.name","Department.name"对应的排序类型可以为升序排序,"employee.name"对应的排序类型为可以降序排序。并且,"Department.name"的排序优先级可以为1,"employee.name"的排序优先级可以为2。因此,第二设备可以确定需要先基于"Department.name"进行升序排序,如果"Department.name"对应的值相同,可以再基于"employee.name"进行降序排序。基于此,第二设备调用对应的排序方法具体可以为:queryWrapper.orderByAsc("Department.name").orderByDesc("employee.name")。
下面结合图6对过滤条件的设置进行介绍,请参见图6,图6是本申请实施例公开的一种解析过滤对象数组的流程示意图。如图6所示,该解析流程可以包括但不限于如下步骤:
601.第二设备遍历查询对象数组。
在目标查询参数中包括查询对象数组的情况下,第二设备可以遍历查询对象数组,以便于设置过滤条件。
602.第二设备判断数组元素的查询类型是否为AND或OR类型,在为AND或OR类型的情况下,可以执行步骤603,在不为AND或OR类型的情况下,可以执行步骤604。
具体地,第二设备可以判断对象数组中的数组元素的查询类型是否为AND或OR类型,也即是判断该数组元素中"filterType"键对应的值是否为"AND"或者"OR",在为AND或OR类型的情况下,表明该数组元素中"value"键对应的值为对象数组,可以执行步骤603,在不为AND或OR类型的情况下,表明该数组元素中"value"键对应的值为具体的查询值,可以执行步骤604。
603.第二设备遍历该数组元素"value"键对应的对象数组。
在一个数组元素的查询类型为AND或OR类型的情况下,表明存在过滤参数对象的嵌套,该数组元素的"value"键对应的值可以为对象数组。例如,一级过滤参数对象"value"键对应的值可以为对象数组,该对象数组中可以包括一个或多个二级过滤参数对象。因此,在一个数组元素的查询类型为AND或OR类型的情况下,第二设备可以遍历该数组元素"value"键对应的对象数组。
604.第二设备判断数组元素的"column"键对应的值是否为主对象属性对应的属性名称,在为主对象属性对应的属性名称的情况下,可以执行步骤605,在不为主对象属性对应的属性名称的情况下,可以执行步骤610。
在一个数组元素的查询类型不为AND或OR类型的情况下,表明该数组元素的"value"键对应的值可以为具体的查询值。因此,为了进行过滤条件的设置,第二设备可以先判断数组元素的"column"键对应的值是否为主对象属性对应的属性名称,在为主对象属性对应的属性名称的情况下,可以执行步骤605,在不为主对象属性对应的属性名称的情况下,可以执行步骤610。
605.第二设备通过反射的方式判断主对象属性是否包括IsQuery注解,在包括IsQuery注解的情况下,可以执行步骤606,在不包括IsQuery注解的情况下,可以执行步骤608。
具体地,在一种可能的实现方式中,第二设备可以基于主对象名称获取主对象的类(Class)对象。之后,第二设备可以基于主对象的Class对象获取主对象的各个属性对应的属性对象。再之后,第二设备可以调用对应属性对象的注解获取方法判断对应属性是否包括IsQuery注解。示例性的,通过调用属性对象的getAnnotation(IsQuery.class)方法或者isAnnotationPresent(IsQuery.class)可以确定对应属性是否包括IsQuery注解,在不包括IsQuery注解的情况下,getAnnotation(IsQuery.class)方法的返回值可以为null,isAnnotationPresent(IsQuery.class)方法的返回值可以为false,在包括IsQuery注解的情况下,getAnnotation(IsQuery.class)方法的返回值可以为对应的注解,isAnnotationPresent(IsQuery.class)方法的返回值可以为true。基于此,第二设备可以通过反射的方式判断一个数组元素对应的主对象属性是否包括IsQuery注解,在包括IsQuery注解的情况下,可以执行步骤606,在不包括IsQuery注解的情况下,表明对应的属性可以进行过滤条件的设置,可以执行步骤608。
606.第二设备判断IsQuery注解的值是否为false,在为false的情况下,可以执行步骤607,在不为false的情况下,可以执行步骤608。
在一个数组元素对应的主对象属性包括IsQuery注解的情况下,可以进一步判断IsQuery注解的值是否为false,在为false的情况下,表明对应的属性不可以进行过滤条件的设置,可以执行步骤607,在不为false的情况下,也即是为true的情况下,表明对应的属性可以进行过滤条件的设置,可以执行步骤608。
607.第二设备向第一设备发送报错信息。
在一个数组元素对应的主对象属性的IsQuery注解的值为false的情况下,表明对应的属性不可以进行过滤条件的设置,第二设备可以向第一设备发送报错信息,该报错信息用于指示对应的属性不可以进行过滤条件的设置。
608.第二设备通过反射的方式获取主对象属性对应的列名。
在确定一个数组元素的"column"键对应的值为某个主对象属性对应的属性名称之后,第二设备可以基于对应的主对象属性名称通过反射的方式获取该主对象属性对应的列名。步骤608与步骤503的原理类似,可以参考步骤503中的相关描述,在此不再详细赘述。
609.第二设备基于主对象名称和主对象属性对应的列名得到过滤参数值。
步骤609与步骤504的原理类似,可以参考步骤504中的相关描述,在此不再详细赘述。示例性的,主对象名称可以为"Department",某个主对象属性对应的列名可以为"name",基于该主对象名称和对应的列名得到的过滤参数值可以为"Department.name"。
610.第二设备通过反射的方式判断子对象属性是否包括IsQuery注解,在包括IsQuery注解的情况下,可以执行步骤611,在不包括IsQuery注解的情况下,可以执行步骤613。
步骤610与步骤605的原理类似,可以参考步骤605中的相关描述,在此不再详细赘述。
611.第二设备判断IsQuery注解的值是否为false,在为false的情况下,可以执行步骤612,在不为false的情况下,可以执行步骤613。
步骤611与步骤606的原理类似,可以参考步骤606中的相关描述,在此不再详细赘述。
612.第二设备向第一设备发送报错信息。
步骤612与步骤607的原理类似,可以参考步骤607中的相关描述。
613.第二设备通过反射的方式获取子对象属性对应的列名。
在确定一个数组元素不为某个主对象属性对应的属性名称之后,表明该数组元素为某个子对象属性对应的属性名称,第二设备可以基于对应的子对象属性名称通过反射的方式获取该子对象属性对应的列名。步骤613与步骤505的原理类似,可以参考步骤505中的相关描述,在此不再详细赘述。
614.第二设备基于对应的属性名称和子对象属性对应的列名得到过滤参数值。
步骤614与步骤506的原理类似,可以参考步骤506中的相关描述,在此不再详细赘述。
615.第二设备基于数组元素的"filterType"键对应的过滤类型调用QueryWrapper查询对象对应的过滤方法,并传入过滤参数值。
第二设备获取到过滤参数值之后,可以基于数组元素的"filterType"键对应的值调用QueryWrapper查询对象对应的过滤方法,并传入过滤参数值。示例性的,过滤方法可以包括eq()方法、ne()方法、in()方法、between()方法、like()方法、likeRight()方法等,eq()方法可以用于设置等于(“=”)过滤条件,ne()方法可以用于设置不等于(“<>”)过滤条件,between()方法可以用于设置范围过滤条件,可以过滤取值位于某个取值范围内的数据,in()方法可以用于设置特定取值过滤条件,可以过滤取值等于某个特定取值的数据,like()方法可以在过滤值的左边和右边添加通配符进行数据的过滤,likeRight()方法可以在过滤值的右边添加通配符进行数据的过滤。
可以理解的是,过滤参数对象之间可以包括对应的层级关系。因此,在调用QueryWrapper查询对象对应的过滤方法时,需要按照过滤参数对象之间的层级关系进行调用。本申请实施例中,为了体现过滤参数对象之间的层级关系,可以通过and()方法、or()方法进行嵌套,例如,可以通过and(...or...or...)的形式进行嵌套,也可以通过or(...and...and...)的形式进行嵌套。
本申请实施例中,一个过滤参数对象中"filterType"键对应的值可以指示具体的过滤方式和与前一个过滤参数对象之间的联接关系。基于此,第二设备可以通过"filterType"键对应的值确定需要调用的过滤方法,并且可以确定需要调用的联接方法,如and()方法、or()方法等。
举例说明,假设用户需要查询员工姓名姓“李”的数据。并且,在此基础上,还需要员工所属部门的部门名称为"A部门"、"B部门"或者"C部门",以及对应部门经理的姓名姓“张”。这种情况下,目标查询参数中的过滤对象数组可以如下所示:
其中,上述过滤对象数组中可以包括两个一级过滤参数对象,第一个一级过滤参数对象的"filterType"键对应的值不为"AND"或"OR",第二个一级过滤参数对象的"filterType"键对应的值为"AND",其中可以包括两个二级过滤参数对象。第二设备可以通过遍历该过滤对象数组得到第一个一级过滤参数对象对应的过滤参数值,即"employee.emp_name",以及两个二级过滤参数对象的过滤参数值,分别为"Department.name"和"manager.emp_name"。
第一个一级过滤参数对象的"filterType"键的值为"LIKE_RIGHT_AND",基于该值中的"LIKE_RIGHT",第二设备可以调用对应的likeRight()方法,并可以传入过滤参数值"employee.emp_name"。由于该过滤参数对象为第一个过滤参数对象,因此,该值中的"AND"可以忽略。基于此,第一个一级过滤参数对象对应的QueryWrapper查询对象调用可以为:queryWrapper.likeRight("employee.emp_name",李)。
第二个一级过滤参数对象的"filterType"键的值为"AND",基于该值,第二设备可以确定调用对应的and()方法,并将该两个二级过滤参数对象的调用嵌套在该and()方法内。第一个二级过滤参数对象的"filterType"键的值为"IN_AND",基于该值中的"IN",第二设备可以调用对应的in()方法,并可以传入过滤参数值"Department.name"。由于该过滤参数对象为该一级过滤参数对象中的第一个二级过滤参数对象,因此,该值中的"AND"可以忽略。基于此,第一个二级过滤参数对象对应的QueryWrapper查询对象调用可以为:queryWrapper.in("Department.name",["A部门","B部门","C部门"])。第二个二级过滤参数对象的"filterType"键的值为"LIKE_RIGHT_AND",基于该值中的"LIKE_RIGHT",第二设备可以调用对应的likeRight()方法,并可以传入过滤参数值"manager.emp_name"。由于该过滤参数对象为该一级过滤参数对象中的第二个二级过滤参数对象,因此,该值中的"AND"不可以忽略,需要与前面第一个二级过滤参数对象联接起来。基于此,第一个二级过滤参数对象与第二个二级过滤参数对象对应的总的QueryWrapper查询对象调用可以为:queryWrapper.in("Department.name",["A部门","B部门","C部门"]).likeRight("manager.emp_name",张)。最后,第二设备可以通过and方法将上述两个调用组合起来,具体可以为:queryWrapper.likeRight("employee.emp_name",李).and(qw->{qw.in("Department.name",["A部门","B部门","C部门"]).likeRight("manager.emp_name",张)})。
可见,当一个过滤参数对象的"filterType"键的值为"AND"或者"OR"时,可以将该过滤参数对象的"value"键对应的对象数组中各个下级过滤参数对象对应的QueryWrapper查询对象调用组合起来,并可以通过and()方法或者or()方法进行嵌套。这样,可以实现更加复杂的数据查询,可以支持各种查询条件的嵌套。
上述过程中,第二设备可以调用QueryWrapper查询对象对应的排序方法动态地设置排序条件,也可以调用QueryWrapper查询对象对应的过滤方法动态地设置过滤条件。之后,Mybatis-Plus可以将QueryWrapper查询对象翻译为对应的过滤语句(如where语句)和排序语句(如order by语句)。例如,上述示例的QueryWrapper查询对象可以翻译为:WHEREemployee.emp_name like'李%'AND(Department.name in("A部门","B部门","C部门")AND manager.emp_name like'张%')。此外,第二设备还可以基于目标查询参数中的查询页和分页值生成分页SQL语句(如limit SQL语句)。之后,第二设备可以将翻译得到的过滤语句和排序语句,以及分页SQL语句加在Mapper文件中配置的查询SQL语句之后,可以得到目标查询SQL语句。应理解,第二设备除了基于目标查询参数中的查询页和分页值生成数据库本身支持的分页SQL语句之外,也可以基于目标查询参数中的查询页和分页值使用Mybatis-Plus提供的分页功能进行分页。示例性的,假设目标查询参数包括步骤615中示例的过滤对象数组,对应的目标查询SQL语句可以如下所示:
SELECT Department.name as name,
Department.code as code,
manager.emp_name as manager_name,
manager.code as manager_code,
employee.emp_name as employee_name,
employee.code as employee_code
FROM department Department
LEFT JOIN employee manager ON manager.id=Department.manager_id
LEFT JOIN employee employee ON employee.code=Department.code
WHERE employee.emp_name like'李%'AND(Department.name in("A部门","B部门","C部门")AND manager.emp_name like'张%')
413.第二设备基于目标查询SQL语句从数据库中获取第二查询结果。
第二设备得到目标查询SQL语句之后,可以基于目标查询SQL语句从数据库中获取第二查询结果。
414.第二设备将第二查询结果转换为对应的类对象。
415.第二设备将第二查询结果对应的类对象转换为对应的JSON对象。
416.第二设备基于第二查询结果对应的JSON对象生成第二目标数据。
417.第二设备向第一设备发送第二目标数据。
418.第一设备基于第二目标数据显示第二界面,第二界面包括第二查询结果。
第一设备接收到来自第二设备的第二目标数据之后,可以解析第二目标数据,并可以基于解析结果显示第二界面,第二界面可以包括第二查询结果。示例性的,第二界面可以参考图1E所示的用户界面105或者图1G所示的用户界面107。
步骤413~步骤418与步骤403~步骤408类似,可以参考上述步骤403~步骤408中的相关描述。
需要说明的是,本申请实施例中,前端部分的脚本文件(如JS文件)中可以定义解析目标数据的处理流程。由于不同的场景下,目标数据的格式都可以是统一的,因此,前端部分的脚本文件等也可以通用,不必针对不同的场景开发不同的脚本文件等。例如,上述访问部门成员相关数据的url地址(http://192.168.206.128/department-manage)对应的脚本文件和访问其它数据的url地址对应的脚本文件可以是相同的。
此外,由于不同场景下,目标查询参数的格式可以是统一的,因此,解析目标查询参数并生成对应的过滤语句、排序语句的处理流程可以是相同的,也就是说,解析目标参数并生成对应的过滤语句、排序语句的代码可以是相同的。不同的是,针对于不同的场景,可能需要针对性的定义相关的类,以及需要配置对应的Mapper文件,在Mapper文件中配置查询SQL语句,以及类的属性与查询结果中各个列之间的映射关系。可见,本申请实施例中,前端和后端的通用性都较高,在出现新的查询场景的情况下,可以复用之前的大部分代码,进行部分类定义操作,以及Mapper文件的配置即可,这样,可以极大地缩短开发周期,快速地满足用户需求。
上述处理流程中,第一设备基于用户输入的查询条件构建的目标查询参数中可以包括查询页、分页值等分页参数,也可以包括升序属性数组、降序属性数组等,还可以包括过滤对象数组,过滤对象数组中可以包括一个或多个一级过滤参数对象,一个一级过滤参数对象中可以包括一个或多个二级过滤参数对象,一个二级过滤参数对象中可以包括一个或多个三级过滤参数对象,等等。基于这种结构的目标查询参数可以灵活地支持设置各种排序条件的组合、过滤条件的组合等,可以满足用户的各种查询需求。并且,这种方式是基于统一的查询接口,可以降低后端程序的维护工作量。
下面对使用本申请实施例提供的数据查询方法的实例进行介绍。
在下述描述中,不对对具体的Mapper文件配置、查询参数的封装、QueryWrapper查询对象的构建等进行介绍,可以参考上述相关描述。下面先对department表和employee表中存储的数据进行示例,department表中存储的数据可以如下表4所示:
表4
id | name | code | manager_id |
1 | A部门 | 90001 | 10 |
2 | B部门 | 90002 | 7 |
3 | C部门 | 90003 | 2 |
employee表中存储的数据可以如下表5所示:
表5
id | emp_name | code |
1 | 张三 | 90001 |
2 | 赵七 | 90003 |
3 | 马五 | 90001 |
4 | 李四 | 90002 |
5 | 马六 | 90002 |
6 | 张一 | 90002 |
7 | 李二 | 90002 |
8 | 王一 | 90002 |
9 | 孙一 | 90002 |
10 | 王五 | 90001 |
示例1,当用户需要查看部门编码为"90003"的数据时,第一设备基于用户输入的查询条件构建的目标查询参数可以如下所示:
第二设备解析上述目标查询参数时,可以确定".code"对应的属性为Departmen的code属性。之后,第二设备可以通过反射的方式确定Departmen的code属性包括IsQuery注解,并且注解值为false。因此,第二设备可以确定不能基于".code"进行数据的过滤,可以直接向第一设备返回目标数据,该目标数据中可以包括报错信息。示例性的,该目标数据可以如下所示:
示例2,当用户需要查询部门名称为"A部门"或者"B部门",员工姓名姓"李"的数据,并且需要按照员工姓名对查询结果进行升序排序时,第一设备基于用户输入的查询条件构建的目标查询参数可以如下所示:
第二设备解析上述目标查询参数,得到的目标查询SQL语句可以如下所示:
SELECT Department.name as name,
Department.code as code,
manager.emp_name as manager_name,
manager.code as manager_code,
employee.emp_name as employee_name,
employee.code as employee_code
FROM department Department
LEFT JOIN employee manager ON manager.id=Department.manager_id
LEFT JOIN employee employee ON employee.code=Department.code
WHERE Department.name IN("A部门","B部门")AND employee.emp_name like"李%"
ORDER BY employee.emp_name
基于上述目标查询SQL语句,得到的查询结果可以如下表6所示:
表6
name | code | manager_name | manager_code | employee_name | employee_code |
B部门 | 90002 | 李二 | 90002 | 李二 | 90002 |
B部门 | 90002 | 李二 | 90002 | 李四 | 90002 |
基于上述查询结果生成的目标数据可以如下所示:
第一设备可以基于上述目标数据为用户呈现表6所示的查询结果。应理解,目标数据中可以包括"pageFilter"键和对应的值,也可以不包括"pageFilter"键和对应的值,对此不作限定。
示例3,当用户需要查询部门名称为"A部门"或者"B部门",并且员工姓名姓"张"或"李"的数据时,第一设备基于用户输入的查询条件构建的目标查询参数可以如下所示:
第二设备解析上述目标查询参数,得到的目标查询SQL语句可以如下所示:
SELECT Department.name as name,
Department.code as code,
manager.emp_name as manager_name,
manager.code as manager_code,
employee.emp_name as employee_name,
employee.code as employee_code
FROM department Department
LEFT JOIN employee manager ON manager.id=Department.manager_id
LEFT JOIN employee employee ON employee.code=Department.code
WHERE Department.name IN("A产品部","B产品部")AND(employee.emp_nameLIKE"张%"OR employee.emp_name LIKE"李%")
基于上述目标查询SQL语句,得到的查询结果可以如下表7所示:
表7
name | code | manager_name | manager_code | employee_name | employee_code |
A部门 | 90001 | 王五 | 90001 | 张三 | 90001 |
B部门 | 90002 | 李二 | 90002 | 李四 | 90002 |
B部门 | 90002 | 李二 | 90002 | 张一 | 90002 |
B部门 | 90002 | 李二 | 90002 | 李二 | 90002 |
基于上述查询结果生成的目标数据可以如下所示:
/>
第一设备可以基于上述目标数据为用户呈现表7所示的查询结果。
可见,在上述3个示例中,均可以基于主对象属性名称、子对象属性名称等设置查询条件,如过滤条件、排序条件等,而主对象属性名称可以对应查询SQL语句中的主表,子对象属性名称可以对应查询SQL语句中的子表,因此,本申请实施例中可以支持基于查询SQL语句中各个表的任意字段设置过滤条件、排序条件等。基于此,用户可以根据实际需求灵活地输入不同的查询条件,第一设备可以基于用户输入的过滤条件构建目标查询参数,并且可以进行过滤参数对象的嵌套,以支持用户的各种查询需求。相应地,第二设备可以通过反射的方式获取目标查询参数中的主对象属性名称和子对象属性名称对应的列名,从而可以基于列名生成排序SQL语句、过滤SQL语句等。并且,这种反射的方式可以简化生成SQL语句的难度,可以简化处理逻辑。
可以理解的是,上述虽然主要使用Mybatis-Plus工具提供的相关功能,如动态构建SQL语句的功能,但本申请实施例对此并不限定。例如,在一种可能的实现方式中,为了提高查询效率,也可以针对性地开发对应的功能,使其更适配特定的应用场景。
基于上述系统架构,请参阅图7,图7是本申请实施例公开的另一种数据查询方法的流程示意图。如图7所示,该处理流程主要以第二设备为角度描述,具体可以包括但不限于如下步骤:
701.第二设备接收来自第一设备的第一请求,第一请求包括目标查询参数。
在一种可能的实现方式中,在第二设备接收到来自第一设备的请求之前,可以接收到来自第一设备的第二请求,第二请求可以不用携带目标查询参数,第二请求可以用于第一设备确定可以进行过滤的属性。第二设备接收到第二请求之后,响应于第二请求,可以基于预设查询语句从数据库中获取第二查询结果,然后可以向第一设备发送第二目标数据,第二目标数据可以包括第二查询结果和第二查询结果中各个列对应的属性名称。
702.在目标查询参数包括多个过滤参数对象的情况下,第二设备基于该多个过滤参数对象和该多个过滤参数对象之间的嵌套关系得到过滤语句。
其中,过滤参数对象可以与过滤条件对应,多个过滤参数对象之间的嵌套关系可以用于指示多个过滤参数对象对应的过滤条件之间的嵌套关系,目标查询参数为基于配置文件生成的。应理解,这里的嵌套关系可以包括过滤参数对象/过滤条件的层级以及联接方式。例如,假设包括过滤条件1、过滤条件2、过滤条件3和过滤条件4,过滤条件1-4的嵌套关系可以为过滤条件1and过滤条件2and(过滤条件3or过滤条件4)。
在一种可能的实现方式中,可以定义有一个或多个类,该一个或多个类的属性与数据表的列对应,该一个或多个类的属性包括表字段注解,该表字段注解的值为对应的列名;该过滤参数对象包括属性名称、查询值和过滤类型,该属性名称用于指示需要进行过滤的属性,该查询值为对应过滤方式需要的参数值,该过滤类型用于指示过滤方式和联接关系。这种方式下,第二设备可以先基于反射的方式获取该一个或多个过滤参数对象中的属性名称对应的列名,然后可以基于该一个或多个过滤参数对象对应的列名、该一个或多个过滤参数对象中的查询值、该一个或多个过滤参数对象中的过滤类型和该一个或多个过滤参数对象之间的嵌套关系得到过滤语句。
在一种可能的实现方式中,该一个或多个类的属性还包括查询标识注解,该查询标识注解可以用于标识对应的属性是否允许设置过滤条件,该查询标识注解的值包括true和false两种,当取值为true时,表明允许设置过滤条件,当取值为false时,表明不允许设置过滤条件。基于此,第二设备在基于反射的方式获取该一个或多个过滤参数对象中的属性名称对应的列名之前,可以先查看该一个或多个过滤参数对象中的属性名称对应的属性的查询标识注解的值,在该一个或多个过滤参数对象中的属性名称对应的属性的查询标识注解的值为true的情况下,表明对应的属性可以设置过滤条件,第二设备可以基于反射的方式获取该一个或多个过滤参数对象中的属性名称对应的列名。在该一个或多个过滤参数对象中的属性名称对应的属性的查询标识注解的值为false的情况下,表明对应的属性不可以设置过滤条件,可以向第一设备发送报错信息。
703.第二设备基于过滤语句和预设查询语句得到目标查询语句。
在一种可能的实现方式中,目标查询参数还可以包括一个或多个排序参数和该一个或多个排序参数的排序优先级。这种情况下,第二设备可以基于该一个或多个排序参数和该一个或多个排序参数的排序优先级得到排序语句,然后可以基于该过滤语句、该排序语句和预设查询语句得到目标查询语句。
704.第二设备基于目标查询语句从数据库中获取第一查询结果。
在一种可能的实现方式中,目标查询参数还可以包括分页参数,该分页参数可以包括查询页和/或分页值,该查询页用于指示需要查询的页,该分页值用于指示每页包括多少条数据。这种情况下,第二设备可以基于目标查询参数中携带的查询页和/或分页值,以及目标查询语句从数据库中获取第一查询结果。
705.第二设备向第一设备发送第一目标数据,第一目标数据包括第一查询结果。
应理解,预先定义的一个或多个类中可以包括目标类(如上述Department类),该目标类的属性与第一查询结果的各个列对应。第二设备可以将第一查询结果转换为对应的目标类对象,然后再将该目标类对象转换为对应的JSON对象。之后,第二设备可以向第一设备发送第一目标数据,第一目标数据可以包括该JSON对象。
需要说明的是,上述不同实施例中的相关信息(即相同信息或相似信息)和相关描述可以相互参考。
应理解,上述图4、图6和图7中以第一设备或第二设备作为交互示意的执行主体为例来示意上述处理流程,但本申请并不限制该交互示意的执行主体。例如,图4、图6和图7中的第一设备或第二设备也可以是支持该第一设备或第二设备实现该方法的芯片、芯片系统、处理器(如上述CPU)等,还可以是能实现全部或部分第一设备或第二设备功能的逻辑模块或软件(如上述查询转化模块、数据库查询模块等)。
基于上述系统架构,请参阅图8,图8是本申请实施例公开的一种电子设备的结构示意图。其中,该电子设备800可以包括:处理器801、通信接口802和存储器803。处理器801、通信接口802以及存储器803可以相互连接或者通过总线804相互连接。
示例性的,存储器803用于存储电子设备800的计算机程序和数据,存储器803可以包括但不限于是随机存储记忆体(random access memory,RAM)、只读存储器(read-onlymemory,ROM)、可擦除可编程只读存储器(erasable programmable read only memory,EPROM)或便携式只读存储器(compact disc read-only memory,CD-ROM)等。通信接口802用于支持电子设备800进行通信,例如接收或发送数据。
示例性的,处理器801可以是中央处理器(central processing unit,CPU)、复杂可编程逻辑器件、通用处理器、数字信号处理器、专用集成电路、现场可编程门阵列或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。处理器也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,数字信号处理器和微处理器的组合等等。
在一个实施例中,电子设备800可以为上述第一设备,处理器801可以用于读取上述存储器803中存储的程序,执行上述图4、图6或图7所示的方法实施例中第一设备或第一设备中的组件执行的操作,可以参考上述相关描述,在此不再详细赘述。
在一个实施例中,电子设备800可以为上述第二设备,处理器801可以用于读取上述存储器803中存储的程序,执行上述图4、图6或图7所示的方法实施例中第二设备或第二设备中的组件执行的操作,可以参考上述相关描述,在此不再详细赘述。
需要说明的是,图8所示的电子设备800仅仅是本申请实施例的一种实现方式,实际应用中,电子设备800还可以包括更多或更少的部件,这里不作限制。
本申请实施例还公开一种计算机可读存储介质,其上存储有指令,该指令被执行时执行上述方法实施例中的方法。
本申请实施例还公开一种包括指令的计算机程序产品,该指令被执行时执行上述方法实施例中的方法。
显然,上述所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或者特性可以包含在本实施例申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是相同的实施例,也不是与其它实施例互斥的独立的或是备选的实施例。本领域技术人员可以显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。本申请的说明书和权利要求书及所述附图中术语“第一”、“第二”、“第三”等是区别于不同的对象,而不是用于描述特定顺序。此外,术语“包括”和“具有”以及它们的任何变形,意图在于覆盖不排他的包含。例如,包含了一系列步骤或单元,或者可选地,还包括没有列出的步骤或单元,或者可选地还包括这些过程、方法、产品或设备固有的其它步骤或单元。可以理解的是,上述条件判断的等号可以取大于一端也可以取小于一端,例如,上述对于一个阈值大于、小于或等于的条件判断,也可以改为对该阈值大于或等于、小于的条件判断,在此不作限定。
可以理解的是,附图中仅示出了与本申请相关的部分而非全部内容。应当理解的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作(或步骤)描述成顺序的处理,但是其中的许多操作可以并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。
在本说明书中使用的术语“部件”、“模块”、“系统”、“单元”等用于表示计算机相关的实体、硬件、固件、硬件和软件的组合、软件或执行中的软件。例如,单元可以是但不限于在处理器上运行的进程、处理器、对象、可执行文件、执行线程、程序和/或分布在两个或多个计算机之间。此外,这些单元可从在上面存储有各种数据结构的各种计算机可读介质执行。例如,单元可根据具有一个或多个数据分组(例如来自与本地系统、分布式系统和/或网络间的另一单元交互的第二单元数据。例如,通过信号与其它系统交互的互联网)的信号通过本地和/或远程进程来通信。
以上所述的具体实施方式,对本申请的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本申请的具体实施方式而已,并不用于限定本申请的保护范围,凡在本申请的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本申请的保护范围之内。
Claims (10)
1.一种数据查询方法,其特征在于,应用于第二设备,所述方法包括:
接收来自第一设备的第一请求,所述第一请求包括目标查询参数;
在所述目标查询参数包括多个过滤参数对象的情况下,基于所述多个过滤参数对象和所述多个过滤参数对象之间的嵌套关系得到过滤语句;所述过滤参数对象与过滤条件对应,所述嵌套关系用于指示所述多个过滤参数对象对应的过滤条件之间的嵌套关系,所述目标查询参数为基于配置文件生成的;
基于所述过滤语句和预设查询语句得到目标查询语句;
基于所述目标查询语句从数据库中获取第一查询结果;
向所述第一设备发送第一目标数据,所述第一目标数据包括所述第一查询结果。
2.根据权利要求1所述的方法,其特征在于,所述目标查询参数还包括一个或多个排序参数和所述一个或多个排序参数的排序优先级,所述方法还包括:
基于所述一个或多个排序参数和所述一个或多个排序参数的排序优先级得到排序语句;
所述基于所述过滤语句和预设查询语句得到目标查询语句包括:
基于所述过滤语句、所述排序语句和预设查询语句得到目标查询语句。
3.根据权利要求1或2所述的方法,其特征在于,所述第二设备包括一个或多个类,所述一个或多个类的属性与数据表的列对应,所述一个或多个类的属性包括表字段注解,所述表字段注解的值为对应的列名;所述过滤参数对象包括属性名称、查询值和过滤类型,所述属性名称用于指示需要进行过滤的属性,所述查询值为对应过滤方式需要的参数值,所述过滤类型用于指示过滤方式和联接关系,所述基于所述多个过滤参数对象和所述多个过滤参数对象之间的嵌套关系得到过滤语句包括:
基于反射的方式获取所述多个过滤参数对象中的属性名称对应的列名;
基于所述多个过滤参数对象对应的列名、所述多个过滤参数对象中的查询值、所述多个过滤参数对象中的过滤类型和所述多个过滤参数对象之间的嵌套关系得到过滤语句。
4.根据权利要求3所述的方法,其特征在于,所述一个或多个类包括目标类,所述目标类的属性与所述第一查询结果的各个列对应,所述方法还包括:
将所述第一查询结果转换为目标类对象;
将所述目标类对象转换为对应的JSON对象;
所述向所述第一设备发送第一目标数据包括:
向所述第一设备发送第一目标数据,所述第一目标数据包括所述JSON对象。
5.根据权利要求3或4所述的方法,其特征在于,所述一个或多个类的属性还包括查询标识注解,所述查询标识注解用于标识对应的属性是否允许设置过滤条件,所述查询标识注解的值包括true和false两种,当取值为true时,表明允许设置过滤条件,当取值为false时,表明不允许设置过滤条件;所述基于反射的方式获取所述多个过滤参数对象中的属性名称对应的列名包括:
在所述多个过滤参数对象中的属性名称对应的属性的查询标识注解的值为true的情况下,基于反射的方式获取所述多个过滤参数对象中的属性名称对应的列名;
所述方法还包括:
在所述多个过滤参数对象中的属性名称对应的属性的查询标识注解的值为false的情况下,向所述第一设备发送报错信息。
6.根据权利要求1-5任一项所述的方法,其特征在于,所述目标查询参数还包括分页参数,所述分页参数包括查询页和/或分页值,所述查询页用于指示需要查询的页,所述分页值用于指示每页包括多少条数据;
所述基于所述目标查询语句从数据库中获取第一查询结果包括:
基于所述查询页和/或所述分页值,以及所述目标查询语句从数据库中获取第一查询结果。
7.根据权利要求3-6任一项所述的方法,其特征在于,所述方法还包括:
接收来自所述第一设备的第二请求;
响应于所述第二请求,基于所述预设查询语句从所述数据库中获取第二查询结果;
向所述第一设备发送第二目标数据,所述第二目标数据包括所述第二查询结果和所述第二查询结果中各个列对应的属性名称。
8.一种数据查询方法,其特征在于,应用于第一设备,所述方法包括:
显示目标界面,所述目标界面包括目标控件,所述目标控件用于支持用户设置多个过滤条件以及所述多个过滤条件之间的嵌套关系,所述过滤条件用于对数据库中的数据进行过滤;
接收用户针对所述目标控件的第一操作,所述第一操作包括设置多个过滤条件以及所述多个过滤条件之间的嵌套关系;
基于配置文件解析所述多个过滤条件以及所述多个过滤条件之间的嵌套关系,并生成目标查询参数;所述目标查询参数包括所述多个过滤条件对应的过滤参数对象和所述多个过滤参数对象之间的嵌套关系;
向第二设备发送第一请求,所述第一请求包括所述目标查询参数,所述第一请求用于请求第一目标数据;
接收来自所述第二设备的第一目标数据,所述第一目标数据包括第一查询结果;
在用户界面中显示所述第一查询结果。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
接收用户的第二操作;
响应于所述第二操作,向第二设备发送第二请求,所述第二请求用于请求第二目标数据;
接收来自所述第二设备的所述第二目标数据,所述第二目标数据包括第二查询结果和所述第二查询结果中各个列对应的属性名称;
所述基于配置文件解析所述多个过滤条件以及所述多个过滤条件之间的嵌套关系,并生成目标查询参数包括:
基于配置文件解析所述多个过滤条件以及所述多个过滤条件之间的嵌套关系,并使用所述第二查询结果中各个列对应的属性名称生成目标查询参数,所述过滤条件基于所述第二查询结果中各个列对应的属性名称设置,所述过滤条件包括属性名称、查询值和过滤方式,所述过滤参数对象包括属性名称、查询值和过滤类型,所述属性名称用于指示需要进行过滤的属性,所述过滤类型用于指示过滤方式和联接关系,所述查询值为对应过滤方式需要的参数值。
10.一种电子设备,其特征在于,所述电子设备包括处理器和存储器,所述处理器调用所述存储器中存储的计算机程序或计算机指令实现如权利要求1-9任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311278038.0A CN117743360A (zh) | 2023-09-28 | 2023-09-28 | 数据查询方法及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311278038.0A CN117743360A (zh) | 2023-09-28 | 2023-09-28 | 数据查询方法及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117743360A true CN117743360A (zh) | 2024-03-22 |
Family
ID=90278242
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311278038.0A Pending CN117743360A (zh) | 2023-09-28 | 2023-09-28 | 数据查询方法及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117743360A (zh) |
-
2023
- 2023-09-28 CN CN202311278038.0A patent/CN117743360A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7640496B1 (en) | Method and apparatus for generating report views | |
US8275775B2 (en) | Providing web services from business intelligence queries | |
US8438190B2 (en) | Generating web services from business intelligence queries | |
US6704723B1 (en) | Method and system for providing business intelligence information over a computer network via extensible markup language | |
US7702746B2 (en) | Web services response templates | |
US7693911B2 (en) | Uniform metadata retrieval | |
US20040103073A1 (en) | System for and method of using component-based development and web tools to support a distributed data management system | |
US20060047648A1 (en) | Comprehensive query processing and data access system and user interface | |
US9208255B2 (en) | Method of converting data of database and creating XML document | |
WO1997045800A1 (en) | Querying heterogeneous data sources distributed over a network using context interchange and data extraction | |
US9824128B1 (en) | System for performing single query searches of heterogeneous and dispersed databases | |
US8676860B2 (en) | Web service discovery via data abstraction model | |
CA3017523C (en) | Technologies for auto discover and connect to a rest interface | |
CN109656951A (zh) | 基于表达式查询数据的方法及查询系统 | |
US20170270184A1 (en) | Methods and devices for processing objects to be searched | |
CN112131289A (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN113254519B (zh) | 多源异构数据库的访问方法、装置、设备和存储介质 | |
US20220156245A1 (en) | System and method for managing custom fields | |
US8949280B2 (en) | Web service discovery via data abstraction model with input assistance | |
US20080059429A1 (en) | Integrated search processing method and device | |
US10133826B2 (en) | UDDI based classification system | |
CN102456070B (zh) | 检索装置和检索方法 | |
US20060167867A1 (en) | Enhancing node-based query languages to support common relational mapping patterns | |
CN115357286B (zh) | 一种程序文件对比方法、装置、电子设备及存储介质 | |
CN117743360A (zh) | 数据查询方法及电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |