数据库查询语句中where子句的生成方法和生成装置转让专利

申请号 : CN201810953871.3

文献号 : CN110858202A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 马恩方

申请人 : 北京京东尚科信息技术有限公司北京京东世纪贸易有限公司

摘要 :

本发明公开了一种数据库查询语句中where子句的生成方法和生成装置,涉及计算机技术领域。该方法的一具体实施方式包括:将调用者传入的参数转换为where子句对象,where子句对象包括该参数的参数名、操作符和参数值;根据预定义的操作符处理规则对操作符进行处理以得到数据库查询语句可识别的操作符;根据数据库查询语句可识别的操作符、参数名和参数值生成where子句。该实施方式能够只使用少量代码,即可实现所有单一字段查询条件的统一处理,从而避免出现大量的冗余无效代码,大大减少了代码开发量,增加了代码利用率,提高了开发效率以及代码执行效率。

权利要求 :

1.一种数据库查询语句中where子句的生成方法,其特征在于,包括:将调用者传入的参数转换为where子句对象,所述where子句对象包括所述参数的参数名、操作符和参数值;

根据预定义的操作符处理规则对所述操作符进行处理以得到数据库查询语句可识别的操作符;

根据所述数据库查询语句可识别的操作符、所述参数名和所述参数值生成where子句。

2.根据权利要求1所述的方法,其特征在于,将调用者传入的参数转换为where子句对象包括:获取调用者传入的参数的参数名、操作符和参数值;

若预设的参数映射表中包含所述参数的参数名,并且所述参数的参数值不为空,则将所述参数的参数名、操作符和参数值封装为where子句对象,其中,所述参数映射表保存调用者传入的参数的参数名与where子句的参数名字段名称的映射关系。

3.根据权利要求2所述的方法,其特征在于,所述调用者传入的参数为键-值对类型的参数,其中,键名为参数名称,键值为参数值,所述参数名称包括参数名和操作符,且操作符以后缀的形式通过分隔符与参数名连接。

4.根据权利要求3所述的方法,其特征在于,获取调用者传入的参数的参数名、操作符和参数值包括:判断调用者传入的参数的参数名称中是否包含参数名与操作符的分隔符;

若包含,则根据所述分隔符对所述参数名称进行分割以得到所述参数名和所述操作符。

5.根据权利要求1所述的方法,其特征在于,所述操作符对应的操作包括:等于、不等于、大于、不大于、小于、不小于、左侧模糊查询、右侧模糊查询、两侧模糊查询、枚举值范围查询、不在枚举值范围的查询。

6.根据权利要求5所述的方法,其特征在于,若所述参数名称中的操作符为空,则默认为“等于”操作。

7.一种数据库查询语句中where子句的生成装置,其特征在于,包括:参数转换模块,用于将调用者传入的参数转换为where子句对象,所述where子句对象包括所述参数的参数名、操作符和参数值;

操作符处理模块,用于根据预定义的操作符处理规则对所述操作符进行处理以得到数据库查询语句可识别的操作符;

where子句生成模块,用于根据所述数据库查询语句可识别的操作符、所述参数名和所述参数值生成where子句。

8.根据权利要求7所述的装置,其特征在于,所述参数转换模块还用于:获取调用者传入的参数的参数名、操作符和参数值;

若预设的参数映射表中包含所述参数的参数名,并且所述参数的参数值不为空,则将所述参数的参数名、操作符和参数值封装为where子句对象,其中,所述参数映射表保存调用者传入的参数的参数名与where子句的参数名字段名称的映射关系。

9.根据权利要求8所述的装置,其特征在于,所述调用者传入的参数为键-值对类型的参数,其中,键名为参数名称,键值为参数值,所述参数名称包括参数名和操作符,且操作符以后缀的形式通过分隔符与参数名连接。

10.根据权利要求9所述的装置,其特征在于,获取调用者传入的参数的参数名、操作符和参数值包括:判断调用者传入的参数的参数名称中是否包含参数名与操作符的分隔符;

若包含,则根据所述分隔符对所述参数名称进行分割以得到所述参数名和所述操作符。

11.根据权利要求7所述的装置,其特征在于,所述操作符对应的操作包括:等于、不等于、大于、不大于、小于、不小于、左侧模糊查询、右侧模糊查询、两侧模糊查询、枚举值范围查询、不在枚举值范围的查询。

12.根据权利要求11所述的装置,其特征在于,若所述参数名称中的操作符为空,则默认为“等于”操作。

13.一种数据库查询语句中where子句的生成的电子设备,其特征在于,包括:一个或多个处理器;

存储装置,用于存储一个或多个程序,

当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-6中任一所述的方法。

14.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-6中任一所述的方法。

说明书 :

数据库查询语句中where子句的生成方法和生成装置

技术领域

[0001] 本发明涉及计算机技术领域,尤其涉及一种数据库查询语句中where子句的生成方法和生成装置。

背景技术

[0002] 当前在Mybatis框架中,对mapper.xml映射文件进行分析处理以得到数据库查询语句SQL(Structured Query Language,结构化查询语言)语句的where条件子句的普遍方法为:枚举该数据库查询语句提供的所有查询条件,并逐一对通过mapper.xml映射文件传入的参数进行校验,当传入的参数非空时,才将参数对应的字段动态添加到SQL语句中的where子句(指的是子语句)中,作为最终查询语句的一部分。
[0003] 例如:某系统的某功能模块中,提供某个表的数据查询功能。提供名称(name)、状态(state_id)、创建时间(created_time)三个查询条件,查询条件可单独提供,也可组合提供。则现有实现方案为:将这三个查询条件字段全部列在where子句中,通过判断传入的参数值是否为空来确定是否追加到最终的SQL语句的where子句中。在mapper文件中的一种可能的实现代码如下:
[0004]
[0005]
[0006] 当查询条件改变时,例如:若需要对name字段的查询方式增加支持模糊查询,则需再新增一个查询语句,需要添加以下代码:
[0007]
[0008] 同样地,当需要对状态添加不特定多种状态支持,或者对创建时间添加支持范围查询支持等,都需要添加相应的查询语句。
[0009] 在实现本发明过程中,发明人发现现有技术中至少存在如下问题:
[0010] 1、代码功能单一,不能通用。例如:对name字段的判断,则只适用于本SQL中的name字段,当其他SQL语句中需要对name字段进行处理时,需要重复编写该段代码;
[0011] 2、当查询条件改变时,需要修改大量代码来新增一个查询语句,否则若在原有语句上添加新的查询条件,将会造成查询条件错误。每增加一种查询条件,就需要重新增加一个查询语句。最终将会导致代码量成倍增加,但是一次查询有用的条件只占少数,大多数代码都无法得到执行,故而导致代码利用率很低,执行效率也不高。

发明内容

[0012] 有鉴于此,本发明实施例提供一种数据库查询语句中where子句的生成方法和生成装置,能够只使用少量代码,即可实现所有单一字段查询条件的统一处理,从而避免出现大量的冗余无效代码,大大减少了代码开发量,增加了代码利用率,提高了开发效率以及代码执行效率。
[0013] 为实现上述目的,根据本发明实施例的一个方面,提供了一种数据库查询语句中where子句的生成方法。
[0014] 一种数据库查询语句中where子句的生成方法,包括:将调用者传入的参数转换为where子句对象,所述where子句对象包括所述参数的参数名、操作符和参数值;根据预定义的操作符处理规则对所述操作符进行处理以得到数据库查询语句可识别的操作符;根据所述数据库查询语句可识别的操作符、所述参数名和所述参数值生成where子句。可选地,将调用者传入的参数转换为where子句对象包括:获取调用者传入的参数的参数名、操作符和参数值;若预设的参数映射表中包含所述参数的参数名,并且所述参数的参数值不为空,则将所述参数的参数名、操作符和参数值封装为where子句对象,其中,所述参数映射表保存调用者传入的参数的参数名与where子句的参数名字段名称的映射关系。
[0015] 可选地,所述调用者传入的参数为键-值对类型的参数,其中,键名为参数名称,键值为参数值,所述参数名称包括参数名和操作符,且操作符以后缀的形式通过分隔符与参数名连接。
[0016] 可选地,获取调用者传入的参数的参数名、操作符和参数值包括:判断调用者传入的参数的参数名称中是否包含参数名与操作符的分隔符;若包含,则根据所述分隔符对所述参数名称进行分割以得到所述参数名和所述操作符。
[0017] 可选地,所述操作符对应的操作包括:等于、不等于、大于、不大于、小于、不小于、左侧模糊查询、右侧模糊查询、两侧模糊查询、枚举值范围查询、不在枚举值范围的查询。
[0018] 可选地,若所述参数名称中的操作符为空,则默认为“等于”操作。
[0019] 根据本发明实施例的另一方面,提供了一种数据库查询语句中where子句的生成装置。
[0020] 一种数据库查询语句中where子句的生成装置,包括:参数转换模块,用于将调用者传入的参数转换为where子句对象,所述where子句对象包括所述参数的参数名、操作符和参数值;操作符处理模块,用于根据预定义的操作符处理规则对所述操作符进行处理以得到数据库查询语句可识别的操作符;where子句生成模块,用于根据所述数据库查询语句可识别的操作符、所述参数名和所述参数值生成where子句。可选地,所述参数转换模块还用于:获取调用者传入的参数的参数名、操作符和参数值;若预设的参数映射表中包含所述参数的参数名,并且所述参数的参数值不为空,则将所述参数的参数名、操作符和参数值封装为where子句对象,其中,所述参数映射表保存调用者传入的参数的参数名与where子句的参数名字段名称的映射关系。
[0021] 可选地,所述调用者传入的参数为键-值对类型的参数,其中,键名为参数名称,键值为参数值,所述参数名称包括参数名和操作符,且操作符以后缀的形式通过分隔符与参数名连接。
[0022] 可选地,获取调用者传入的参数的参数名、操作符和参数值包括:判断调用者传入的参数的参数名称中是否包含参数名与操作符的分隔符;若包含,则根据所述分隔符对所述参数名称进行分割以得到所述参数名和所述操作符。
[0023] 可选地,所述操作符对应的操作包括:等于、不等于、大于、不大于、小于、不小于、左侧模糊查询、右侧模糊查询、两侧模糊查询、枚举值范围查询、不在枚举值范围的查询。
[0024] 可选地,若所述参数名称中的操作符为空,则默认为“等于”操作。
[0025] 根据本发明实施例的又一方面,提供了一种数据库查询语句中where子句的生成的电子设备。
[0026] 一种数据库查询语句中where子句的生成的电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例所提供的数据库查询语句中where子句的生成方法。
[0027] 根据本发明实施例的再一方面,提供了一种计算机可读介质。
[0028] 一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明实施例所提供的数据库查询语句中where子句的生成方法。
[0029] 上述发明中的一个实施例具有如下优点或有益效果:通过将调用者传入的参数转换为where子句对象,并根据预定义的操作符处理规则对where子句对象中包括的操作符进行处理以得到数据库查询语句可识别的操作符,然后结合参数名和参数值生成where子句,实现了通过将SQL语句中where条件进行抽象,提取出通用模板,又将其具体实现为mapper文件中的操作符处理规则来开发通用代码,只使用少量代码,即可实现所有单一字段查询条件的统一处理,从而避免出现大量的冗余无效代码,大大减少了代码开发量,增加了代码利用率,提高了开发效率以及代码执行效率。同时,本发明通过将mapper文件中的where语句关联至实体类WhereClauseItem,使得调用者只需向mapper接口传入WhereClauseItem链表,而无需关心具体参数的传递数量与顺序,从而实现了对调用者的解耦。另外,本发明还提供了常用的SQL查询条件支持,将对SQL查询where语句中的操作符类型的确定,前置到了调用者,调用者只需修改参数名称后缀,即可最终确定where语句中的操作符,从而增加了代码的灵活性,可以适应更多查询场景。最后,本发明还提供了参数映射操作,防止调用者恶意传递有害参数,提高了代码安全性。
[0030] 上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。

附图说明

[0031] 附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
[0032] 图1是根据本发明实施例的数据库查询语句中where子句的生成方法的主要步骤示意图;
[0033] 图2是本发明实施例的实现流程示意图;
[0034] 图3是根据本发明实施例的数据库查询语句中where子句的生成装置的主要模块示意图;
[0035] 图4是本发明实施例可以应用于其中的示例性系统架构图;
[0036] 图5是适于用来实现本发明实施例的终端设备或服务器的计算机系统的结构示意图。

具体实施方式

[0037] 以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
[0038] 通过对SQL语法定义和大量的代码进行分析,可以总结得出:所有的数据库查询语句中的where子句都符合(或者可以转换为)以下结构:参数名操作符参数值。例如:name=‘张三’,age>18,hobbies in(‘电影’,‘打篮球’)等。
[0039] 根据此结构,提取出了一个通用模板:
[0040] columnName operator value。
[0041] 在以上例子中,columnName(参数名)分别为:name、age、hobbies;operator(操作符或运算符)分别为:=、>、in;value(参数值)分别为张三,18,电影、打篮球。
[0042] 于是,可以将各种各样的where子句使用以上模板包括的三个字段进行描述。然后,将以上结构抽象为WhereClauseItem类(类定义请参见下文)。通过改变该类对象的属性的值,即可以表示不同的where子句。
[0043] 例如:当WhereClauseItem类的某个对象的columnName属性的值为“name”,operator属性的值为“=”,value属性的值为“张三”时,表示的即为“name=‘张三’”这个where条件查询子句。
[0044] 又因为=、>、<等操作符属于特殊字符,在代码中不便于直接使用,于是可将各种操作符使用字符串表示,例如“eq”表示“=”,“gt”表示“>”,“lt”表示“<”等。在最终转换为SQL查询语句时,才使用=、>、<等字符。
[0045] 于是,若要表示“name=‘张三’”这个where条件查询子句,需要将WhereClauseItem类的对象的operator属性的值设为“eq”。
[0046] 又因为一个where子句可以包含多个查询条件,所以通过将传入的参数定义为WhereClauseItem的链表,以表示可以传入多个WhereClauseItem对象。
[0047] 下面详细介绍本发明的技术方案的实现过程。
[0048] 图1是根据本发明实施例的数据库查询语句中where子句的生成方法的主要步骤示意图。如图1所示,本发明实施例的数据库查询语句中where子句的生成方法主要包括如下的步骤S101至步骤S103。
[0049] 步骤S101:将调用者传入的参数转换为where子句对象,where子句对象包括该参数的参数名、操作符和参数值;
[0050] 步骤S102:根据预定义的操作符处理规则对操作符进行处理以得到数据库查询语句可识别的操作符;
[0051] 步骤S103:根据数据库查询语句可识别的操作符、参数名和参数值生成where子句。
[0052] 如前面所述,当接收到调用者传入的参数时,需要将参数封装为提取的通用模板所对应的where子句对象。
[0053] 在本发明的一个实施例中,预先定义了一个where子句对象类WhereClauseItem类,其定义如下:
[0054]
[0055] 通过对WhereClauseItem类中的参数“columnName(参数名)”、“operator(操作符)”、“value(参数值)”进行赋值,即可生成WhereClauseItem对象(即:where子句对象)。根据调用者传入的参数,即可对WhereClauseItem类中的参数进行赋值,以将参数的参数名、操作符和参数值封装为对应的where子句对象。其中,当调用者传入的参数为多个时,生成的where子句对象也对应有多个,且以WhereClauseItem链表的形式存在,其中,该WhereClauseItem链表里即存储了一个个的WhereClauseItem对象(即:where子句对象)。
[0056] 具体地,在执行步骤S101将调用者传入的参数转换为where子句对象时,可以包括如下步骤:
[0057] 步骤S1011:获取调用者传入的参数的参数名、操作符和参数值;
[0058] 步骤S1012:若预设的参数映射表中包含所述参数的参数名,并且所述参数的参数值不为空,则将所述参数的参数名、操作符和参数值封装为where子句对象,其中,所述参数映射表保存调用者传入的参数的参数名与where子句的参数名字段名称的映射关系。
[0059] 根据本发明的一个实施例,调用者传入的参数为键-值对类型的参数,其中,键名为参数名称,键值为参数值,参数名称包括参数名和操作符,且操作符以后缀的形式通过分隔符与参数名连接。具体地,调用者传入的参数例如是Map类型的参数,Map参数的键名key存放的是参数名称,键值value存放的是参数值(亦即where条件的字段值)。调用者在传入参数时,参数名称需要包括参数名和操作符,且操作符以后缀的形式通过分隔符(例如是WhereClauseItem.OPERATOR_SEPARATOR)与参数名连接,并且参数名中只允许出现一个分隔符。因在数据库查询中,精准匹配(即:“等于”操作)使用最广泛,故若参数名称中的参数名无操作符后缀,则默认为“等于(eq)”操作。
[0060] 在调用者传入参数后,将获取参数的参数名、操作符和参数值这3个字段信息。由于调用者传入的参数中的参数名和操作符均包含在参数名称中,且以分隔符相连,因此,在获取参数名和操作符时,可以按照以下步骤来执行:
[0061] 判断调用者传入的参数的参数名称中是否包含参数名与操作符的分隔符;
[0062] 若包含,则根据分隔符对参数名称进行分割以得到参数名和操作符。
[0063] 其中,若参数名称中不包含参数名与操作符的分隔符,则说明操作符已缺省或为空,此时即默认为“等于(eq)”操作。
[0064] 另外,为了保证调用者传入的参数的正确性与安全性,本发明添加了参数映射表paramsMap,将调用者传入的参数的参数名与SQL中where子句的参数名字段名称进行映射。只有当调用者传入的参数的参数名在该参数映射表中存在,且参数值不为空时才可以将参数最终传入到mapper文件中进行处理。在本发明的一个实施例中,该映射表的定义如下:
[0065] MapparamsMap=new HashMap<>();
[0066] paramsMap.put("name","name");
[0067] paramsMap.put("stateId","state_id");
[0068] paramsMap.put("createdTime","created_time")。
[0069] 以上代码的功能是:将java代码中的参数名与数据库表中的参数名建立映射关系。在执行SQL前,将java代码传入的参数名转换为SQL中的参数名。例如,对于stateId参数,在java代码中,其参数名为“stateId”,在数据库中,对应的参数名为“state_id”。在进行数据库的SQL查询时,如果不进行参数名的转换,直接将代码中的参数名stateId传入,必然会导致SQL查询错误,因为数据库中并没有stateId这个字段。
[0070] 根据本发明的一个实施例,步骤S101的一种具体实现例如是通过定义一个方法:public  int count(Mapparams),通过执行该方法即可生成
WhereClauseItem对象链表。该方法的一种具体实现如下:
[0071]
[0072]
[0073] 通过执行以上代码,即可将调用者传入的Map参数转换为where子句对象WhereClauseItem对象,并以WhereClauseItem链表的形式存在。
[0074] 在得到WhereClauseItem链表之后,即可执行步骤S102:根据预定义的操作符处理规则对操作符进行处理以得到数据库查询语句可识别的操作符。
[0075] 其中,预定义的操作符处理规则是通过对mapper文件where语句中的条件查询逻辑的抽象提取来实现的。在本发明的实施例中,是通过将mapper文件where语句中的由“if”条件语句所表示的条件查询逻辑进行分析、汇总等,针对不同的操作,定义了不同的操作符,且将每种操作对应的操作符的实现以“when”条件语句来表示,从而实现了将多种条件查询逻辑对应的操作抽象提取为一个通用模板。本发明实施例的一种具体实现例如:
[0076]
[0077]
[0078] 通过以上代码实现的通用模板,可以针对每一个查询操作,实现以下多种类型的操作:等于(eq)、不等于(neq)、大于(gt)、不大于(neq)、小于(lt)、不小于(nlt)、左侧模糊查询(llk)、右侧模糊查询(rlk)、两侧模糊查询(flk)、枚举值范围查询(in)等等。其中,操作的类型并不局限于以上所列出的类型,例如还包括:是否为NULL的查询以及不在枚举值范围的查询等。在具体实施过程中,根据应用需要可灵活设定。
[0079] 根据该通用模板实现的操作符处理规则,即可对where子句对象WhereClauseItem对象中包括的操作符(例如:eq、lt、gt等)进行处理,以得到数据库查询语句可识别的操作符(例如:=、<、>等)。
[0080] 最后,即可执行步骤S103:根据数据库查询语句可识别的操作符、参数名和参数值生成where子句。具体地,在生成where子句时,是按照参数名、数据库查询语句可识别的操作符、参数值的顺序进行组合得到的。
[0081] 根据本发明的实施例,为每个WhereClauseItem对象生成一个where子句。对于每个WhereClauseItem对象来说,将WhereClauseItem对象对应的参数名columnName作为where子句的参数名,然后,根据WhereClauseItem对象对应的操作符operator在参数名之后添加操作符,具体可以包括以下情况:若operator为“eq或空”,则表示“等于”操作,则在columnName后追加等号“=”;
[0082] 若operator为“neq”,则表示“不等于”操作,则在columnName后追加不等号“!=”;
[0083] 若operator为“gt”,则表示“大于”操作,则在columnName后追加大于号“>”;
[0084] 若operator为“ngt”,则表示“不大于”操作,则在columnName后追加小于等于号“<=”;
[0085] 若operator为“lt”,则表示“小于”操作,则在columnName后追加小于号“<”;
[0086] 若operator为“nlt”,则表示“不小于”操作,则在columnName后追加大于等于号“>=”;
[0087] 若operator为“llk”,则表示“左侧模糊查询”操作,则在columnName后追加左侧模糊查询条件“LIKE CONCAT('%',value)”;
[0088] 若operator为“rlk”,则表示“右侧模糊查询”操作,则在columnName后追加右侧模糊查询条件“LIKE CONCAT(value,'%')”;
[0089] 若operator为“flk”,则表示“两侧模糊查询”操作,则在columnName后追加两侧模糊查询条件“LIKE CONCAT('%',value,'%')”;
[0090] 若operator为“in”,则表示“枚举值范围查询”操作,则在columnName后追加枚举值范围查询条件“IN(value)”。
[0091] 在添加了操作符之后,将WhereClauseItem对象对应的参数值value作为where子句的参数值追加到操作符之后或是填充到操作符中value所在的位置。如此,即可生成一条where子句。通过同样的过程,即可将调用者传入的所有参数都生成对应的where子句。
[0092] 在以上所介绍的步骤中,步骤S101的执行过程一般是在业务处理层Service层进行。Service层在得到WhereClauseItem链表之后,将调用数据访问层Dao层来实现数据查询。数据访问层通过mapper接口(用于实现Java接口与SQL语句之间关联的接口)与数据库进行数据交互。
[0093] 在本发明的一个实施例中,若某个统计数据条数的SQL定义如下:
[0094]
[0095] 其中,通过“”引用了预定义的操作符处理规则对应的where子句。在执行含有该where子句的数据库查询语句时,需传入WhereClauseItem对象链表。
[0096] Service层根据调用者传入的参数生成WhereClauseItem对象链表,例如定义一个方法:public int count(Mapparams),通过执行该方法即可生成WhereClauseItem对象链表。然后,Service层通过调用Dao层的mapper方法以将WhereClauseItem对象链表传递给Dao层,调用过程的一种具体实现如:dao.count(whereClauseItem(params))。之后,通过Dao层的mapper接口进行查询,一种查询方法的定义例如:int  count(@Param("whereClauseList")List
whereClauseList)。
[0097] mapper接口通过对传入的WhereClauseItem对象链表的参数进行遍历,对每个WhereClauseItem对象,判断其操作符类型并生成数据库查询语句可识别的操作符,再结合其参数名columnName及参数值value属性,生成最终的针对该whereClauseItem对象的where条件查询子句。
[0098] 下面结合图2介绍本发明实施例的实现流程。图2是本发明实施例的实现流程示意图,如图2所示,在接收到调用者发送的调用请求并获取传递的参数后,将遍历参数,并判断参数的参数名是否在参数映射表中。若不在,则获取下一个参数并重新判断;若在,则判断参数值是否为空,若为空,则获取下一个参数并判断参数的参数名是否在参数映射表中;否则,分离参数名和操作符。然后,根据参数名、操作符和参数值生成WhereClauseItem对象,并添加到WhereClauseItem对象链表中。之后,通过调用Dao层方法,将WhereClauseItem对象链表传递至mapper文件的where子句的处理逻辑。最后,where子句的处理逻辑遍历WhereClauseItem对象链表,对每个WhereClauseItem对象,判断其操作符类型并生成数据库查询语句可识别的操作符,再结合其参数名及参数值,生成where子句。
[0099] 图3是根据本发明实施例的数据库查询语句中where子句的生成装置的主要模块示意图。如图3所示,根据本发明实施例的数据库查询语句中where子句的生成装置300主要包括参数转换模块301、操作符处理模块302和where子句生成模块303。
[0100] 参数转换模块301用于将调用者传入的参数转换为where子句对象,where子句对象包括该参数的参数名、操作符和参数值;
[0101] 操作符处理模块302用于根据预定义的操作符处理规则对操作符进行处理以得到数据库查询语句可识别的操作符;
[0102] where子句生成模块303用于根据数据库查询语句可识别的操作符、参数名和参数值生成where子句。
[0103] 根据本发明的一个实施例,参数转换模块301还可以用于:
[0104] 获取调用者传入的参数的参数名、操作符和参数值;
[0105] 若预设的参数映射表中包含该参数的参数名,并且该参数的参数值不为空,则将该参数的参数名、操作符和参数值封装为where子句对象,其中,参数映射表保存调用者传入的参数的参数名与where子句的参数名字段名称的映射关系。
[0106] 根据本发明的另一个实施例,调用者传入的参数为键-值对类型的参数,其中,键名为参数名称,键值为参数值,参数名称包括参数名和操作符,且操作符以后缀的形式通过分隔符与参数名连接。
[0107] 根据本发明的另一个实施例,获取调用者传入的参数的参数名、操作符和参数值具体可以包括:
[0108] 判断调用者传入的参数的参数名称中是否包含参数名与操作符的分隔符;
[0109] 若包含,则根据分隔符对参数名称进行分割以得到参数名和操作符。
[0110] 根据本发明的实施例,操作符对应的操作包括但不限于:等于、不等于、大于、不大于、小于、不小于、左侧模糊查询、右侧模糊查询、两侧模糊查询、枚举值范围查询、不在枚举值范围的查询。
[0111] 根据本发明的实施例,若参数名称中的操作符为空,则默认为“等于”操作。
[0112] 根据本发明实施例的技术方案,通过将调用者传入的参数转换为where子句对象,并根据预定义的操作符处理规则对where子句对象中包括的操作符进行处理以得到数据库查询语句可识别的操作符,然后结合参数名和参数值生成where子句,实现了通过将SQL语句中where条件进行抽象,提取出通用模板,又将其具体实现为mapper文件中的操作符处理规则来开发通用代码,只使用少量代码,即可实现所有单一字段查询条件的统一处理,从而避免出现大量的冗余代码,大大减少了代码开发量,增加了代码利用率,提高了开发效率以及代码执行效率。同时,本发明通过将mapper文件中的where语句关联至实体类WhereClauseItem,使得调用者只需向mapper接口传入WhereClauseItem链表,而无需关心具体参数的传递数量与顺序,从而实现了对调用者的解耦。另外,本发明还提供了常用的SQL查询条件支持,将对SQL查询where语句中的操作符类型的确定,前置到了调用者,调用者只需修改参数名称后缀,即可最终确定where语句中的操作符,从而增加了代码的灵活性,可以适应更多查询场景。最后,本发明还提供了参数映射操作,防止调用者恶意传递有害参数,提高了代码安全性。
[0113] 图4示出了可以应用本发明实施例的数据库查询语句中where子句的生成方法或数据库查询语句中where子句的生成装置的示例性系统架构400。
[0114] 如图4所示,系统架构400可以包括终端设备401、402、403,网络404和服务器405。网络404用以在终端设备401、402、403和服务器405之间提供通信链路的介质。网络404可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
[0115] 用户可以使用终端设备401、402、403通过网络404与服务器405交互,以接收或发送消息等。终端设备401、402、403上可以安装有各种通讯客户端应用,例如购物类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等(仅为示例)。
[0116] 终端设备401、402、403可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
[0117] 服务器405可以是提供各种服务的服务器,例如对用户利用终端设备401、402、403所浏览的购物类网站提供支持的后台管理服务器(仅为示例)。后台管理服务器可以对接收到的产品信息查询请求等数据进行分析等处理,并将处理结果(例如目标推送信息、产品信息--仅为示例)反馈给终端设备。
[0118] 需要说明的是,本发明实施例所提供的数据库查询语句中where子句的生成方法一般由服务器405执行,相应地,数据库查询语句中where子句的生成装置一般设置于服务器405中。
[0119] 应该理解,图4中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
[0120] 下面参考图5,其示出了适于用来实现本发明实施例的终端设备或服务器的计算机系统500的结构示意图。图5示出的终端设备或服务器仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
[0121] 如图5所示,计算机系统500包括中央处理单元(CPU)501,其可以根据存储在只读存储器(ROM)502中的程序或者从存储部分508加载到随机访问存储器(RAM)503中的程序而执行各种适当的动作和处理。在RAM 503中,还存储有系统500操作所需的各种程序和数据。CPU 501、ROM 502以及RAM 503通过总线504彼此相连。输入/输出(I/O)接口505也连接至总线504。
[0122] 以下部件连接至I/O接口505:包括键盘、鼠标等的输入部分506;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分507;包括硬盘等的存储部分508;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分509。通信部分509经由诸如因特网的网络执行通信处理。驱动器510也根据需要连接至I/O接口505。可拆卸介质511,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器510上,以便于从其上读出的计算机程序根据需要被安装入存储部分508。
[0123] 特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分509从网络上被下载和安装,和/或从可拆卸介质511被安装。在该计算机程序被中央处理单元(CPU)501执行时,执行本发明的系统中限定的上述功能。
[0124] 需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0125] 附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0126] 描述于本发明实施例中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,例如,可以描述为:一种处理器包括参数转换模块、操作符处理模块和where子句生成模块。其中,这些单元或模块的名称在某种情况下并不构成对该单元或模块本身的限定,例如,参数转换模块还可以被描述为“用于将调用者传入的参数转换为where子句对象的模块”。
[0127] 作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:将调用者传入的参数转换为where子句对象,所述where子句对象包括所述参数的参数名、操作符和参数值;根据预定义的操作符处理规则对所述操作符进行处理以得到数据库查询语句可识别的操作符;根据所述数据库查询语句可识别的操作符、所述参数名和所述参数值生成where子句。
[0128] 根据本发明实施例的技术方案,通过将调用者传入的参数转换为where子句对象,并根据预定义的操作符处理规则对where子句对象中包括的操作符进行处理以得到数据库查询语句可识别的操作符,然后结合参数名和参数值生成where子句,实现了通过将SQL语句中where条件进行抽象,提取出通用模板,又将其具体实现为mapper文件中的操作符处理规则来开发通用代码,只使用少量代码,即可实现所有单一字段查询条件的统一处理,从而避免出现大量的冗余代码,大大减少了代码开发量,增加了代码利用率,提高了开发效率以及代码执行效率。同时,本发明通过将mapper文件中的where语句关联至实体类WhereClauseItem,使得调用者只需向mapper接口传入WhereClauseItem链表,而无需关心具体参数的传递数量与顺序,从而实现了对调用者的解耦。另外,本发明还提供了常用的SQL查询条件支持,将对SQL查询where语句中的操作符类型的确定,前置到了调用者,调用者只需修改参数名称后缀,即可最终确定where语句中的操作符,从而增加了代码的灵活性,可以适应更多查询场景。最后,本发明还提供了参数映射操作,防止调用者恶意传递有害参数,提高了代码安全性。
[0129] 上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。