CN117909389A - 一种sql模糊查询方法、设备及存储介质 - Google Patents

一种sql模糊查询方法、设备及存储介质 Download PDF

Info

Publication number
CN117909389A
CN117909389A CN202410310195.3A CN202410310195A CN117909389A CN 117909389 A CN117909389 A CN 117909389A CN 202410310195 A CN202410310195 A CN 202410310195A CN 117909389 A CN117909389 A CN 117909389A
Authority
CN
China
Prior art keywords
query statement
sql
escape
sql query
name
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.)
Granted
Application number
CN202410310195.3A
Other languages
English (en)
Other versions
CN117909389B (zh
Inventor
苏德财
李炯
曹茜
王汉瑛
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Chengdu Xugu Weiye Technology Co ltd
Original Assignee
Chengdu Xugu Weiye Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Chengdu Xugu Weiye Technology Co ltd filed Critical Chengdu Xugu Weiye Technology Co ltd
Priority to CN202410310195.3A priority Critical patent/CN117909389B/zh
Priority claimed from CN202410310195.3A external-priority patent/CN117909389B/zh
Publication of CN117909389A publication Critical patent/CN117909389A/zh
Application granted granted Critical
Publication of CN117909389B publication Critical patent/CN117909389B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请公开了一种SQL模糊查询方法、设备及存储介质,该方法通过接收用户输入的第一SQL查询语句,判断其中是否包含预设置的第一关键字。如果包含第一关键字,则获取与第一关键字对应的匹配条件字段,并判断是否需要进行特殊字符转义处理。如果有需要进行转义处理的特殊字符,则通过转义处理得到相应的转义字符,并使用这些转义字符替换原始查询语句中的特殊字符,从而生成第二SQL查询语句。最后,执行第二SQL查询语句对数据库进行查询。至少解决了现有MyBatis‑Plus在处理包含特殊字符的模糊查询时精确度较差的问题。

Description

一种SQL模糊查询方法、设备及存储介质
技术领域
本申请涉及互联网技术领域,尤其涉及一种SQL模糊查询方法、设备及存储介质。
背景技术
MyBatis 是一款持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain OrdinaryJava Object,普通的 Java对象)映射成数据库中的记录。MyBatis-Plus是一个致力于简化开发过程和提高效率的Mybatis增强工具。它并没有改变Mybatis的原生特性,而是在其基础上进行了增强。这种增强主要包括对一些常用数据库操作的封装。通过使用MyBatis-Plus,开发人员可以减少重复的配置和代码编写工作,极大地提升了工作效率。
现有技术中的限制主要体现在 MyBatis-Plus 框架在模糊查询方面的局限性。具体而言,该框架对包含百分号、下划线等特殊字符的模糊查询表现出相对较差的精确性。
发明内容
本发明提供了一种SQL模糊查询方法、设备及存储介质,提供了一种自动优化SQL语句的方案,至少解决了现有MyBatis-Plus在处理包含特殊字符的模糊查询时精确度较差的问题。
一方面,提供一种SQL模糊查询方法,用于MyBatis框架,包括:
接收用户输入的第一SQL查询语句;
根据预设置的至少一个第一关键字,判断所述第一SQL查询语句中是否包含所述第一关键字;
当所述第一SQL查询语句中包含所述第一关键字时,根据所述第一SQL查询语句的结构,获取与所述第一关键字对应的至少一个第一匹配条件字段;
根据所述第一匹配条件字段,判断所述第一匹配条件字段中是否存在特殊字符需要进行转义处理;
当所述第一匹配条件字段中存在特殊字符需要进行转义处理时,将需要进行转义处理的特殊字符通过转义处理得到转义字符;
使用所述转义字符替换所述第一SQL查询语句中的特殊字符后得到第二SQL查询语句,并执行所述第二SQL查询语句,对数据库进行查询。
所述接收用户输入的第一SQL查询语句之前,还包括:
创建第一拦截器;
在所述第一拦截器中设置的 InnerInterceptor 接口;
所述接收用户输入的第一SQL查询语句的方法,包括:
通过所述InnerInterceptor 接口接收用户输入的第一SQL查询语句。
所述根据预设置的至少一个第一关键字,判断所述第一SQL查询语句中是否包含所述第一关键字之后,还包括:
当所述第一SQL查询语句中不包含所述第一关键字时,执行所述第一SQL查询语句,对数据库进行查询;
所述SQL模糊查询方法,还包括:
通过所述第一拦截器通过在所述第一SQL查询语句执行前调用Executor接口的方法,对所述第一SQL查询语句进行拦截。
还包括:
通过@Intercepts注解标识所述第一拦截器;
通过@Signature注解指明所述第一拦截器拦截的类型和方法。
所述当所述第一SQL查询语句中包含所述第一关键字时,还包括获取与所述第一关键字对应的至少一个第一参数名;
所述根据所述第一匹配条件字段,判断所述第一匹配条件字段中是否存在特殊字符需要进行转义处理,还包括:
根据所述第一参数名,获得与所述第一参数名对应的第一转义列表;
判断所述第一匹配条件字段中是否存在所述第一转义列表上的第一字段;
若存在,则所述第一字段中的特殊字符需要进行转义处理。
所述根据所述第一匹配条件字段,判断所述第一匹配条件字段中是否存在特殊字符需要进行转义处理,还包括:
根据所述第一参数名,获得与所述第一参数名对应的第一约束条件;
判断所述第一匹配条件字段中是否存在满足所述第一约束条件的第二字段;
若存在,则所述第二字段中的特殊字符需要进行转义处理。
所述将需要进行转义处理的特殊字符通过转义处理得到转义字符,包括:
判断所述第一SQL查询语句的种类;
根据所述第一SQL查询语句的种类,将需要进行转义处理的特殊字符通过转义处理得到转义字符;所述第一SQL查询语句的种类包括:条件构造器产生的模糊查询语句、手动拼接的模糊查询语句和Mapper注解SQL中的模糊查询语句中的至少一种。
所述使用所述转义字符替换所述第一SQL查询语句中的特殊字符后得到第二SQL查询语句,包括:
通过beforeQuery方法,将所述第一SQL查询语句中的特殊字符替换为所述转义字符,得到第二SQL查询语句。
再一方面,一种计算机设备,该计算机设备包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序,实现上述方法。
再一方面,一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,处理器执行所述计算机程序,实现上述方法。
本发明与现有技术相比,具有如下的优点和有益效果:
本发明一种SQL模糊查询方法、设备及存储介质,该方法通过接收用户输入的第一SQL查询语句,判断其中是否包含预设置的第一关键字。如果包含第一关键字,则获取与第一关键字对应的匹配条件字段,并判断是否需要进行特殊字符转义处理。如果有需要进行转义处理的特殊字符,则通过转义处理得到相应的转义字符,并使用这些转义字符替换原始查询语句中的特殊字符,从而生成第二SQL查询语句。最后,执行第二SQL查询语句对数据库进行查询。至少解决了现有MyBatis-Plus在处理包含特殊字符的模糊查询时精确度较差的问题。
附图说明
为了更清楚地说明本申请具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图做简单的介绍。在所有附图中,类似的元件或部分一般由类似的附图标记标识。附图中,各元件或部分并不一定按照实际的比例绘制。
图1为本申请中一种SQL模糊查询方法的流程示意图;
图2为本申请中一种SQL模糊查询系统的示意图。
本申请目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
为了使本技术领域的人员更好地理解本公开方案,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本公开一部分的实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本公开保护的范围。
需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
实施例1
如图1所示,一种SQL模糊查询方法,用于MyBatis框架,包括:
S1、接收用户输入的第一SQL查询语句;
可选的,用户输入的第一SQL查询语句可以是完整的SQL语句,也可以是由终端设备或服务器根据用户在前端输入的查询条件生成的SQL语句,我们可以通过Python实现上述功能,如:
python
# 定义查询条件
name = "赵%"
age = 25
city = "成都"
# 生成SQL语句
sql = "SELECT * FROM users WHERE name='{}' AND age={} AND city='{}';".format(name,age, city)
print(sql)
在上述代码中,“赵%”为用户在前端输入的查询条件为姓氏为赵,“25”为用户在前端输入的查询条件为25岁,“成都”为用户在前端输入的查询条件为区域为成都。
可选的,所述接收用户输入的第一SQL查询语句之前,还包括:
创建第一拦截器;
在所述第一拦截器中设置的 InnerInterceptor 接口;
所述接收用户输入的第一SQL查询语句的方法,包括:
通过所述InnerInterceptor 接口接收用户输入的第一SQL查询语句。
InnerInterceptor接口是MyBatis-Plus框架中的一个拦截器接口。InnerInterceptor接口定义了在执行查询和更新操作之前的预处理方法,如在查询之前、更新之前以及SQL准备之前进行一些操作。通过实现这个接口,开发人员可以创建自己的插件并添加到Mybatis中,从而使得拦截器功能得以实现。具体来说,当这些预处理方法被调用时,实际上是在调用对应的Mybatis插件。因此,InnerInterceptor接口的主要作用就是提供一个自定义插件的方式,以便在特定的时间点执行用户的自定义逻辑。
S2、根据预设置的至少一个第一关键字,判断第一SQL查询语句中是否包含第一关键字;
具体的,第一关键字可以是“like”、“?”、“_”、“%”和其他通配符等。
具体的,在SQL模糊查询中,最常用到的关键字就是“like”,以“like”关键字作为第一关键字,判断第一SQL查询语句中是否包含第一关键字的代码如下:
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import java.sql.Connection;
import java.util.Properties;
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class LikeInterceptor implements InnerInterceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
String sql = statementHandler.getBoundSql().getSql();
if (sql.contains("like") ) {
System.out.println("SQL 语句包含 'like' 关键字");
} else {
System.out.println("SQL 语句不包含 'like' 关键字");
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
在上述方法中,首先创建了一个名为LikeInterceptor的类,并实现InnerInterceptor接口。然后,使用@Intercepts注解指定要拦截的方法,在本例中为prepare方法。接下来,重写intercept方法,在其中获取SQL语句,并检查是否包含"like"关键字和"?"占位符。最后,使用Plugin.wrap方法将拦截器应用到目标对象上。
可选的,所述根据预设置的至少一个第一关键字,判断所述第一SQL查询语句中是否包含所述第一关键字之后,还包括:
当所述第一SQL查询语句中不包含所述第一关键字时,执行所述第一SQL查询语句,对数据库进行查询;
所述SQL模糊查询方法,还包括:
通过所述第一拦截器在所述第一SQL查询语句执行前调用Executor接口的方法,对所述第一SQL查询语句进行拦截。
Executor是MyBatis的SQL顶层执行器接口,负责处理数据库的所有增删改查操作。具体来说,Executor定义了四个主要的方法:query()和queryCursor()用于执行查询操作,update()方法用于执行插入、删除、修改操作。Executor的主要作用是对SQL语句进行预处理和封装,生成最终可以执行的SQL语句。
MyBatis提供了三种基本的Executor执行器:SimpleExecutor、ReuseExecutor和BatchExecutor。每种执行器都有其特定的行为和用途。例如,SimpleExecutor为每一条SQL语句创建一个新的Statement对象,并在使用完毕后立即关闭Statement对象;而ReuseExecutor则会根据SQL语句的key来查找并重用已有的Statement对象,从而提高执行效率。
可选的,还包括:
通过@Intercepts注解标识所述第一拦截器;
通过@Signature注解指明所述第一拦截器拦截的类型和方法。
@Intercepts用于标识一个类是一个拦截器,而@Signature则是用来指明自定义拦截器需要拦截哪一种类型和方法。例如,根据@Signature的type属性值,拦截器可以拦截四种类型之一:Executor(SQL的内部执行器)、ParameterHandler(拦截参数的处理)、StatementHandler(拦截SQL的构建)或ResultSetHandler(拦截结果的处理)。同时,通过method属性,我们可以指定拦截器类型中的具体方法
S3、根据第一SQL查询语句的结构,获取与第一关键字对应的至少一个第一匹配条件字段;
具体的,当第一关键字为“like”时,第一匹配条件字段为与“like”对应的约束条件,如在“SELECT * FROM user WHERE name LIKE '赵%'”这个语句中,第一匹配条件字段为'赵%';当第一关键字为“?”占位符时,第一匹配条件字段为“?”占位符对应的内容,如在以下代码中:
String id = “_1%”
String sql = “select * from t_address where id = ?”
第一匹配条件字段为_1%;当第一关键字为“_”等通配符时,第一匹配条件字段为第一关键字所在的字段。
可选的,当第一SQL查询语句中不包含第一关键字时:
执行第一SQL查询语句对数据库进行查询;
当第一SQL查询语句中不包含第一关键字时,意味着SQL查询语句不需要进行处理,可以直接执行。
当第一SQL查询语句中包含第一关键字时:
S4、根据第一匹配条件字段,判断第一匹配条件字段中是否存在特殊字符需要进行转义处理;
可选的,当第一SQL查询语句中包含第一关键字时,还包括获取与第一关键字对应的至少一个第一参数名;
根据第一匹配条件字段,判断第一匹配条件字段中是否存在特殊字符需要进行转义处理,还包括:
根据第一参数名,获得与第一参数名对应的第一转义列表;
判断第一匹配条件字段中是否存在第一转义列表上的第一字段;
若存在,则第一字段中的特殊字符需要进行转义处理。
具体的,参数名一般为第一匹配条件字段对应的数据的列名,如“SELECT * FROMuser WHERE name LIKE '赵%'”这个语句中,第一参数名为“name”,“String sql =“select * from t_address where id = ?”这个语句中,第一参数名为“id”。
可选的,第一字段中的特殊字符可以部分需要进行转义处理。
通过第一参数名,可以确定与第一参数名对应的第一转义列表或第一转义清单,该清单上记录了与第一参数名对应的全部需要进行转义处理的第一字段,还包括第一字段进行转义处理后的第一转义字段;具体的第一参数名为“name”的第一转义列表中包括字段“赵%_”,还包括与“赵%_”对应的第一转义字段“赵/%_”,其中“%”和“_”为特殊字符,“%”为需要进行转义处理的特殊字符。
可选的,根据第一匹配条件字段,判断第一匹配条件字段中是否存在特殊字符需要进行转义处理,还包括:
根据第一参数名,获得与第一参数名对应的第一约束条件;
判断第一匹配条件字段中是否存在满足第一约束条件的第二字段;
若存在,则第二字段中的特殊字符需要进行转义处理。
通过第一参数名,可以确定与第一参数名对应的第一约束条件,该约束条件中记录了与第一参数名对应的全部需要进行转义处理的情况,还包括第二字段进行转义处理后的第二转义字段;具体的第一参数名为“name”的第一约束条件中包括字段“%_”和字段“%%”,还包括与“%_”和字段“%%”对应的第二转义字段“/%_”和“/%”,其中“%”和“_”均为特殊字符,“%”为需要进行转义处理的特殊字符。
当第一匹配条件字段中存在特殊字符需要进行转义处理时:
S5、将需要进行转义处理的特殊字符通过转义处理得到转义字符;
可选的,将需要进行转义处理的特殊字符通过转义处理得到转义字符,还包括:
判断第一SQL查询语句的种类;
根据第一SQL查询语句的种类,将需要进行转义处理的特殊字符通过转义处理得到转义字符;第一SQL查询语句的种类包括:条件构造器产生的模糊查询语句、手动拼接的模糊查询语句和Mapper注解SQL中的模糊查询语句中的至少一种。
具体的,条件构造器产生的模糊查询:
当我们使用MyBatis框架的条件构造器时,它们允许我们构建SQL查询。对于模糊查询,我们可以使用条件构造器的LIKE方法。
例如,在MyBatis-Plus中使用:
QueryWrapper<User>queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "张");
这会产生类似以下的SQL:
SELECT * FROM user WHERE name LIKE '%张%';
手动拼接的模糊查询:
这种方式意味着可以直接在SQL语句中拼接LIKE子句。
例如:
String name = "张";
String querySQL = "SELECT * FROM user WHERE name LIKE '%" + name +"%'";
Mapper 注解 SQL 中的模糊查询:
在MyBatis中,可以使用注解来定义SQL语句。对于模糊查询,可以使用@Select注解并手动编写LIKE子句。
例如:
@Select("SELECT * FROM user WHERE name LIKE CONCAT('%', #{name},'%')")
List<User>selectUsersByName(String name);
这里,#{name}是参数占位符,MyBatis会将其替换为实际值。使用CONCAT函数是为了避免直接的字符串拼接,从而减少SQL注入的风险。
S6、使用转义字符替换第一SQL查询语句中的特殊字符后得到第二SQL查询语句,并执行第二SQL查询语句,对数据库进行查询。
可选的,使用转义字符替换第一SQL查询语句中的特殊字符后得到第二SQL查询语句,包括:
通过beforeQuery方法,将第一SQL查询语句中的特殊字符替换为转义字符,得到第二SQL查询语句。
在MyBatis中,beforeQuery可以在查询开始前根据某些条件动态地改变SQL语句的结构。例如,如果用户输入了某些特定的条件,那么beforeQuery方法可以根据这些条件来修改SQL语句,以实现更复杂的查询功能。此外,beforeQuery方法也可以用于对查询参数进行检查和过滤,以防止SQL注入攻击等安全问题。
实施例2
一种SQL模糊查询系统,包括用户输入终端、拦截器和数据库,用户输入终端被配置为:
接收用户输入的第一SQL查询语句,将第一SQL查询语句发送到拦截器;
拦截器被配置为
根据预设置的至少一个第一关键字,判断第一SQL查询语句中是否包含第一关键字;
当第一SQL查询语句中不包含第一关键字时,执行第一SQL查询语句对数据库进行查询;
当第一SQL查询语句中包含第一关键字时,根据第一SQL查询语句的结构,获取与第一关键字对应的至少一个第一匹配条件字段;
根据第一匹配条件字段,判断第一匹配条件字段中是否存在特殊字符需要进行转义处理;
当第一匹配条件字段中有特殊字符需要进行转义处理时,将需要进行转义处理的特殊字符通过转义处理得到转义字符;
使用转义字符替换第一SQL查询语句中的特殊字符后得到第二SQL查询语句,执行第二SQL查询语句对数据库进行查询;
数据库被配置为:
执行第一SQL查询语句和第二SQL查询语句。
实施例3
本实施例在实施例1和实施例2的基础上提供了一个实例,首先将下列数据导入数据库,INSERT INTO d1.student (name,age) VALUES ('李四',30);
INSERT INTO d1.student (name,age) VALUES ('王五',25);
INSERT INTO d1.student (name,age) VALUES ('赵四%',23);
INSERT INTO d1.student (name,age) VALUES ('%王麻子',20);
INSERT INTO d1.student (name,age) VALUES ('五百_',29);
INSERT INTO d1.student (name,age) VALUES ('李%',20);
INSERT INTO d1.student (name,age) VALUES ('%王',36);
INSERT INTO d1.student (name,age) VALUES ('%',30);
INSERT INTO d1.student (name,age) VALUES ('_',31);
INSERT INTO d1.student (name,age) VALUES ('赵四',30);
INSERT INTO d1.student (name,age) VALUES ('李',32);
INSERT INTO d1.student (name,age) VALUES ('王',NULL);
将“_”和“%”设置为需要进行转义处理的特殊字符后,通过下列代码进行查询测试;
public void test1(){
System.out.println("NO.1---->"+studentService.getList("李"));
System.out.println("NO.2---->"+studentService.getList("李%"));
System.out.println("NO.3---->"+studentService.getList("王%"));
System.out.println("NO.4---->"+studentService.getList("王"));
System.out.println("NO.5---->"+studentService.getList("%"));
System.out.println("NO.6---->"+studentService.getList("_"));
System.out.println("NO.7---->"+studentService.getList("五百_"));
System.out.println("NO.8---->"+studentService.getList("赵四%"));
};
使用如实施例1和实施例2中的方法的输出结果为:
NO.1---->[Student{id=1, name='李四', age=30}, Student{id=6, name='李%', age=20}, Student{id=11, name='李', age=32}];
NO.2---->[Student{id=6, name='李%', age=20}];
NO.3---->[];
NO.4---->[Student{id=2, name='王五', age=25}, Student{id=4, name='%王麻子', age=20}, Student{id=7, name='%王', age=36}, Student{id=12, name='王',age=null}];
NO.5---->[Student{id=3, name='赵四%', age=23}, Student{id=4, name='%王麻子', age=20}, Student{id=6, name='李%', age=20}, Student{id=7, name='%王', age=36}, Student{id=8, name='%', age=30}];
NO.6---->[Student{id=5, name='五百_', age=29}, Student{id=9, name='_', age=31}];
NO.7---->[Student{id=5, name='五百_', age=29}];
NO.8---->[Student{id=3, name='赵四%', age=23}];
未使用如实施例1和实施例2中的方法的输出结果为:
NO.1---->[Student{id=1, name='李四', age=30}, Student{id=6, name='李%', age=20}, Student{id=11, name='李', age=32}];
NO.2---->[Student{id=1, name='李四', age=30}, Student{id=6, name='李%', age=20}, Student{id=11, name='李', age=32}];
NO.3---->[Student{id=2, name='王五', age=25}, Student{id=4, name='%王麻子', age=20}, Student{id=7, name='%王', age=36}, Student{id=12, name='王',age=null}];
NO.4---->[Student{id=2, name='王五', age=25}, Student{id=4, name='%王麻子', age=20}, Student{id=7, name='%王', age=36}, Student{id=12, name='王',age=null}];
NO.5---->[Student{id=1, name='李四', age=30}, Student{id=2, name='王五', age=25}, Student{id=3, name='赵四%', age=23}, Student{id=4, name='%王麻子', age=20}, Student{id=5, name='五百_', age=29}, Student{id=6, name='李%',age=20}, Student{id=7, name='%王', age=36}, Student{id=8, name='%', age=30},Student{id=9, name='_', age=31}, Student{id=10, name='赵四', age=30}, Student{id=11, name='李', age=32}, Student{id=12, name='王', age=null}];
NO.6---->[Student{id=1, name='李四', age=30}, Student{id=2, name='王五', age=25}, Student{id=3, name='赵四%', age=23}, Student{id=4, name='%王麻子', age=20}, Student{id=5, name='五百_', age=29}, Student{id=6, name='李%',age=20}, Student{id=7, name='%王', age=36}, Student{id=8, name='%', age=30},Student{id=9, name='_', age=31}, Student{id=10, name='赵四', age=30}, Student{id=11, name='李', age=32}, Student{id=12, name='王', age=null}];
NO.7---->[Student{id=5, name='五百_', age=29}];
NO.8---->[Student{id=3, name='赵四%', age=23}, Student{id=10, name='赵四', age=30}];
成功解决了现有MyBatis-Plus在处理包含特殊字符的模糊查询时精确度较差的问题。
实施例4
本实施例提供一种计算机设备,该计算机设备包括存储器和处理器,存储器中存储有计算机程序,处理器执行计算机程序,实现上述任一方法。
实施例5
本实施例提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,处理器执行计算机程序,实现上述任一方法。
在一些实施例中,计算机可读存储介质可以是FRAM、ROM、PROM、EPROM、EEPROM、闪存、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备。计算机可以是包括智能终端和服务器在内的各种计算设备。
在本公开的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取非易失性存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个非易失性存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本公开各个实施例方法的全部或部分步骤。而前述的非易失性存储介质包括:U盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上仅是本公开的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本公开原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本公开的保护范围。

Claims (10)

1.一种SQL模糊查询方法,其特征在于,用于MyBatis框架,包括:
接收用户输入的第一SQL查询语句;
根据预设置的至少一个第一关键字,判断所述第一SQL查询语句中是否包含所述第一关键字;
当所述第一SQL查询语句中包含所述第一关键字时,根据所述第一SQL查询语句的结构,获取与所述第一关键字对应的至少一个第一匹配条件字段;
根据所述第一匹配条件字段,判断所述第一匹配条件字段中是否存在特殊字符需要进行转义处理;
当所述第一匹配条件字段中存在特殊字符需要进行转义处理时,将需要进行转义处理的特殊字符通过转义处理得到转义字符;
使用所述转义字符替换所述第一SQL查询语句中的特殊字符后得到第二SQL查询语句,并执行所述第二SQL查询语句,对数据库进行查询。
2.根据权利要求1所述的一种SQL模糊查询方法,其特征在于,所述接收用户输入的第一SQL查询语句之前,还包括:
创建第一拦截器;
在所述第一拦截器中设置的 InnerInterceptor 接口;
所述接收用户输入的第一SQL查询语句的方法,包括:
通过所述InnerInterceptor 接口接收用户输入的第一SQL查询语句。
3.根据权利要求2所述的一种SQL模糊查询方法,其特征在于,所述根据预设置的至少一个第一关键字,判断所述第一SQL查询语句中是否包含所述第一关键字之后,还包括:
当所述第一SQL查询语句中不包含所述第一关键字时,执行所述第一SQL查询语句,对数据库进行查询;
所述SQL模糊查询方法,还包括:
通过所述第一拦截器通过在所述第一SQL查询语句执行前调用Executor接口的方法,对所述第一SQL查询语句进行拦截。
4.根据权利要求3所述的一种SQL模糊查询方法,其特征在于,还包括:
通过@Intercepts注解标识所述第一拦截器;
通过@Signature注解指明所述第一拦截器拦截的类型和方法。
5.根据权利要求1所述的一种SQL模糊查询方法,其特征在于,所述当所述第一SQL查询语句中包含所述第一关键字时,还包括获取与所述第一关键字对应的至少一个第一参数名;
所述根据所述第一匹配条件字段,判断所述第一匹配条件字段中是否存在特殊字符需要进行转义处理,还包括:
根据所述第一参数名,获得与所述第一参数名对应的第一转义列表;
判断所述第一匹配条件字段中是否存在所述第一转义列表上的第一字段;
若存在,则所述第一字段中的特殊字符需要进行转义处理。
6.根据权利要求5所述的一种SQL模糊查询方法,其特征在于,所述根据所述第一匹配条件字段,判断所述第一匹配条件字段中是否存在特殊字符需要进行转义处理,还包括:
根据所述第一参数名,获得与所述第一参数名对应的第一约束条件;
判断所述第一匹配条件字段中是否存在满足所述第一约束条件的第二字段;
若存在,则所述第二字段中的特殊字符需要进行转义处理。
7.根据权利要求1所述的一种SQL模糊查询方法,其特征在于,所述将需要进行转义处理的特殊字符通过转义处理得到转义字符,包括:
判断所述第一SQL查询语句的种类;
根据所述第一SQL查询语句的种类,将需要进行转义处理的特殊字符通过转义处理得到转义字符;所述第一SQL查询语句的种类包括:条件构造器产生的模糊查询语句、手动拼接的模糊查询语句和Mapper注解SQL中的模糊查询语句中的至少一种。
8.根据权利要求1所述的一种SQL模糊查询方法,其特征在于,所述使用所述转义字符替换所述第一SQL查询语句中的特殊字符后得到第二SQL查询语句,包括:
通过beforeQuery方法,将所述第一SQL查询语句中的特殊字符替换为所述转义字符,得到第二SQL查询语句。
9.一种计算机设备,其特征在于,该计算机设备包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序,实现根据权利要求1-8中任一项所述的方法。
10.一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,处理器执行所述计算机程序,实现根据权利要求1-8中任一项所述的方法。
CN202410310195.3A 2024-03-19 一种sql模糊查询方法、设备及存储介质 Active CN117909389B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410310195.3A CN117909389B (zh) 2024-03-19 一种sql模糊查询方法、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410310195.3A CN117909389B (zh) 2024-03-19 一种sql模糊查询方法、设备及存储介质

Publications (2)

Publication Number Publication Date
CN117909389A true CN117909389A (zh) 2024-04-19
CN117909389B CN117909389B (zh) 2024-06-11

Family

ID=

Citations (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20030069880A1 (en) * 2001-09-24 2003-04-10 Ask Jeeves, Inc. Natural language query processing
US20040111388A1 (en) * 2002-12-06 2004-06-10 Frederic Boiscuvier Evaluating relevance of results in a semi-structured data-base system
US6826562B1 (en) * 1999-11-29 2004-11-30 International Business Machines Corporation Method of simplifying and optimizing scalar subqueries and derived tables that return exactly or at most one tuple
CN101686146A (zh) * 2008-09-28 2010-03-31 华为技术有限公司 模糊查询、查询结果处理和过滤条件处理的方法及设备
CN103399851A (zh) * 2013-06-25 2013-11-20 携程计算机技术(上海)有限公司 一种结构化查询语言(sql)脚本的性能分析与预测方法与系统
US20160283607A1 (en) * 2008-03-13 2016-09-29 Business Partners Limited Search engine
EP3133820A1 (en) * 2015-08-21 2017-02-22 Accenture Global Services Limited Interactive video distribution system with content similarity matching
CN106484815A (zh) * 2016-09-26 2017-03-08 北京赛思信安技术股份有限公司 一种基于海量数据类sql检索场景的自动识别优化方法
US20180121420A1 (en) * 2016-10-31 2018-05-03 Actiance, Inc. Result set manipulation
CA2985961A1 (en) * 2016-11-17 2018-05-17 Radicalogic Technologies, Inc. Domain specific language to query medical data
US10915523B1 (en) * 2010-05-12 2021-02-09 Richard Paiz Codex search patterns
US20210165788A1 (en) * 2019-12-03 2021-06-03 Embarcadero Technologies, Inc. Systems and methods for addressing errors in sql statements
CN114547094A (zh) * 2022-01-21 2022-05-27 深圳希施玛数据科技有限公司 一种数据查询的方法、装置及电子设备
WO2022105493A1 (zh) * 2020-11-17 2022-05-27 深圳壹账通智能科技有限公司 基于语义识别的数据查询方法、装置、设备及存储介质
CN114936271A (zh) * 2022-06-27 2022-08-23 阿里云计算有限公司 自然语言转换数据库查询语句的方法、设备及介质
US20230059796A1 (en) * 2021-08-05 2023-02-23 Cloud Linux Software Inc. Systems and methods for robust malware signature detection in databases
CN117194389A (zh) * 2023-11-08 2023-12-08 山东省国土空间数据和遥感技术研究院(山东省海域动态监视监测中心) 基于sql的数据库兼容方法和装置、电子设备和存储介质

Patent Citations (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6826562B1 (en) * 1999-11-29 2004-11-30 International Business Machines Corporation Method of simplifying and optimizing scalar subqueries and derived tables that return exactly or at most one tuple
US20030069880A1 (en) * 2001-09-24 2003-04-10 Ask Jeeves, Inc. Natural language query processing
US20040111388A1 (en) * 2002-12-06 2004-06-10 Frederic Boiscuvier Evaluating relevance of results in a semi-structured data-base system
US20160283607A1 (en) * 2008-03-13 2016-09-29 Business Partners Limited Search engine
CN101686146A (zh) * 2008-09-28 2010-03-31 华为技术有限公司 模糊查询、查询结果处理和过滤条件处理的方法及设备
US10915523B1 (en) * 2010-05-12 2021-02-09 Richard Paiz Codex search patterns
CN103399851A (zh) * 2013-06-25 2013-11-20 携程计算机技术(上海)有限公司 一种结构化查询语言(sql)脚本的性能分析与预测方法与系统
EP3133820A1 (en) * 2015-08-21 2017-02-22 Accenture Global Services Limited Interactive video distribution system with content similarity matching
CN106484815A (zh) * 2016-09-26 2017-03-08 北京赛思信安技术股份有限公司 一种基于海量数据类sql检索场景的自动识别优化方法
US20180121420A1 (en) * 2016-10-31 2018-05-03 Actiance, Inc. Result set manipulation
CA2985961A1 (en) * 2016-11-17 2018-05-17 Radicalogic Technologies, Inc. Domain specific language to query medical data
US20210165788A1 (en) * 2019-12-03 2021-06-03 Embarcadero Technologies, Inc. Systems and methods for addressing errors in sql statements
WO2022105493A1 (zh) * 2020-11-17 2022-05-27 深圳壹账通智能科技有限公司 基于语义识别的数据查询方法、装置、设备及存储介质
US20230059796A1 (en) * 2021-08-05 2023-02-23 Cloud Linux Software Inc. Systems and methods for robust malware signature detection in databases
CN114547094A (zh) * 2022-01-21 2022-05-27 深圳希施玛数据科技有限公司 一种数据查询的方法、装置及电子设备
CN114936271A (zh) * 2022-06-27 2022-08-23 阿里云计算有限公司 自然语言转换数据库查询语句的方法、设备及介质
CN117194389A (zh) * 2023-11-08 2023-12-08 山东省国土空间数据和遥感技术研究院(山东省海域动态监视监测中心) 基于sql的数据库兼容方法和装置、电子设备和存储介质

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
YANG, Y: "Database engine based intelligent SQL keyword searching method, involves adopting analysis database engine to construct optimal SQL statement for realizing quick SQL key word searching by using target keyword hit result", BLUEDON INFORMATION SECURITY TECHNOLOGIE, 31 December 2019 (2019-12-31) *
梁文楷: "一种基于ElasticSearch全文检索技术的研究", 计算机软件及计算机应用, 15 September 2021 (2021-09-15) *
邓会敏;: "数据库查询优化技术初探", 福建电脑, no. 04, 25 April 2006 (2006-04-25) *

Similar Documents

Publication Publication Date Title
CN107704265B (zh) 一种面向业务流可配置的规则生成方法
JP5431513B2 (ja) コマンド索引のためのローカル記憶装置および拡張記憶装置を使用したコマンドスクリプトの解釈
AU2018272840B2 (en) Automated dependency analyzer for heterogeneously programmed data processing system
KR101780233B1 (ko) 소프트웨어의 코드 클론 탐지 장치 및 방법
CN107644323A (zh) 一种面向业务流的智能审核系统
US20030208498A1 (en) System and method for enhancing XML schemas
CN110383238A (zh) 用于基于模型的软件分析的系统和方法
KR20040097909A (ko) 명령에 대한 입력 파라미터의 반영 기반 프로세싱
US7130862B2 (en) Methods, systems and computer program prodcuts for validation of XML instance documents using Java classloaders
JPH04505227A (ja) ドキュメント生成装置および方法
CN111179086A (zh) 一种基于WebAssembly的智能合约虚拟机
CN114168190A (zh) 接口文档生成方法、装置、计算机设备和存储介质
US11275625B2 (en) System and method for automated application programming interface generation
Zafar et al. Sol2js: translating solidity contracts into javascript for hyperledger fabric
US20220222253A1 (en) Sql statement generator
CN110765152A (zh) Sql提取方法、装置、计算机设备和存储介质
CN117234517A (zh) 接口参数校验方法、装置、设备及存储介质
CN112860265A (zh) 一种源代码数据库操作异常检测方法及装置
CN117909389B (zh) 一种sql模糊查询方法、设备及存储介质
CN115599388B (zh) 一种api接口文档生成方法、存储介质及电子设备
CN116841906A (zh) 智能合约的检测方法、装置及电子设备
CN117909389A (zh) 一种sql模糊查询方法、设备及存储介质
CN113722348A (zh) 结构化查询语言sql语句的处理方法、装置和电子设备
CN107577476A (zh) 一种基于模块划分的安卓系统源码差异性分析方法、服务器及介质
US20150324333A1 (en) Systems and methods for automatically generating hyperlinks

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
GR01 Patent grant