CN111259042A - 一种动态查询方法及系统 - Google Patents

一种动态查询方法及系统 Download PDF

Info

Publication number
CN111259042A
CN111259042A CN202010017244.6A CN202010017244A CN111259042A CN 111259042 A CN111259042 A CN 111259042A CN 202010017244 A CN202010017244 A CN 202010017244A CN 111259042 A CN111259042 A CN 111259042A
Authority
CN
China
Prior art keywords
dynamic
sql
variable
parameter
class
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
CN202010017244.6A
Other languages
English (en)
Other versions
CN111259042B (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.)
XIAMEN ZHIYE SOFTWARE ENGINEERING CO LTD
Original Assignee
XIAMEN ZHIYE SOFTWARE ENGINEERING 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 XIAMEN ZHIYE SOFTWARE ENGINEERING CO LTD filed Critical XIAMEN ZHIYE SOFTWARE ENGINEERING CO LTD
Priority to CN202010017244.6A priority Critical patent/CN111259042B/zh
Publication of CN111259042A publication Critical patent/CN111259042A/zh
Application granted granted Critical
Publication of CN111259042B publication Critical patent/CN111259042B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及软件开发技术领域,具体地说,涉及一种动态查询方法及系统。其方法包括如下步骤:动态SQL配置,MyBatis 3基于OGNL表达式通过在Mapper.xml中使用if、choose、trim、foreach动态SQL元素来编写包含逻辑判断的SQL语句;Groovy动态脚本配置,基于Groovy实现动态脚本执行工具类,进行动态脚本的执行并返回查询结果;Groovy、SQL脚本执行引擎;返回结果。该动态查询方法及系统,目的是避免编写重复性接口,通过配置的方式增加开发的灵活度,提高开发效率,缩短开发时间。大部分需求都可以系统在线直接配置处理,省去功能开发及系统发布操作。

Description

一种动态查询方法及系统
技术领域
本发明涉及软件开发技术领域,具体地说,涉及一种动态查询方法及系统。
背景技术
在中小平台系统中存在很多需要进行数据查询和Excel导出的功能,客户需求多而且变化快。之前的做法是将相关的查询SQL语句放到数据库中进行存储,然后编写相关接口,调用配置在数据库中的SQL语句执行后返回执行结果。按之前做法,在客户提出新的需求时,需要先配置SQL语句,再编写接口,最后调用接口返回数据,这样无法快速响应客户需求,涉及后端代码更新的还需要重新发布系统,较为繁琐。
发明内容
本发明的目的在于提供一种动态查询方法及系统,以解决上述背景技术中提出的问题。
为实现上述技术问题的解决,本发明的目的之一在于,提供一种动态查询方法,其方法包括如下步骤:
S1、动态SQL配置,MyBatis 3基于OGNL表达式通过在Mapper.xml中使用if、choose、trim、foreach等动态SQL元素来编写包含逻辑判断的SQL语句,在执行过程中可根据用户提供的参数,动态决定最终执行的SQL语句;解决了手动拼接SQL语句麻烦且容易出错的问题;
S2、Groovy动态脚本配置,基于Groovy实现动态脚本执行工具类(GroovyExecutor),使用复合SQL语句配置中script节点的内容和相关参数输入到GroovyExecutor的evaluate方法,进行动态脚本的执行并返回查询结果,GroovyExecutor的类图如图3所示,可以跟Spring无缝集成,可直接调用相关的Spring Bean;
S3、Groovy、SQL脚本执行引擎;
S4、返回结果。
作为优选,所述S1中,动态SQL配置的方法包括如下步骤:
S1.1、动态SQL注册,将动态SQL语句注册到MyBatis的配置对象。目前有1个接口SqlConfig,1个基类SqlConfigBase和2个具体的实现类SimpleSqlConfig、ComplexSqlConfig模块类图关系如图1所示;
S1.2、动态SQL执行,动态SQL执行类集成了动态SQL注册类(SqlConfig),对外提供了executeSelectList、executeSelect、executeSelectPage等3个SQL语句执行方法,动态SQL执行类(SqlExecutor)根据传入的xmlType参数来创建哪个动态SQL注册类(SqlConfig);类图关系如图2所示。
作为优选,所述S1.1中,动态SQL注册的方法包括如下步骤:
S1.1.1、SqlConfigBase类构造函数,构造函数包含2个参数,分别是:
参数1,字符串变量xmlId,该参数为动态SQL的xml配置的唯一id;
参数2,字符串变量xmlContent,该参数为动态SQL的文本内容;
S1.1.2、getXmlId方法返回私有字段xmlId的值;
S1.1.3、getXmlContent方法返回私有字段xmlContent的值;
S1.1.4、getSelectId方法返回私有字段namespace的值拼接上点号“.”和方法入参字符串变量id的值;
S1.1.5、执行parseDocument方法;
S1.1.6、执行registerXml方法实现注册动态SQL语句。
SimpleSqlConfig实现类主要实现了单条SQL语句注册。单条SQL语句的示例如图4所示,SimpleSqlConfig类说明如下:
SimpleSqlConfig覆写了父类方法getXmlContent,将传入的SQL语句内容包装成MyBatis Xml Mapper的格式,使用mapper根元素及select子节点包裹getXmlContent方法的返回值(单条SQL语句的内容),并将select的id属性设置为方法getXmlId的值。
ComplexSqlConfig实现类主要实现了复合SQL语句注册,一般包含一条及以上的动态SQL配置和一个包含业务逻辑的script节点,script的内容使用groovy脚本编写。在script节点中直接调用动态SQL执行类的实体对象sqlExecutor执行复合配置中的动态SQL语句,最终得出需要的返回结果。复合SQL语句的示例如图5所示:
ComplexSqlConfig类说明如下:
1)、覆写父类方法parseDocument,具体步骤如下:
a、调用父类的parseDocument方法返回Document赋值到变量document;
b、调用document的getRootElement方法获取文档的根元素对象,赋值给Element类型的变量rootElement;
c、ootElement的selectSingleNode方法并传入参数/mapper/script,返回当调用r前根元素对象下的script子节点到Node类型的变量scriptNode;
d、判断scriptNode是否为null,如果是则抛出运行时异常:缺少script节点;
e、调用rootElement的remove方法并传入参数scriptNode,移除script节点;
f、将scriptNode变量强制转换为Element类型并调用getTextTrim方法获取配置的groovy脚本内容并赋值给类中的私有字符串变量scriptContent;
g、返回方法中的变量document;
2)、getScriptContent方法返回私有字段scriptContent的值。
作为优选,所述S1.1.1中,构造函数的执行操作包括如下步骤:
S1.1.1.1、将参数xmlId赋值给私有字段xmlId;
S1.1.1.2、将参数xmlContent赋值给私有字段xmlContent;
S1.1.1.3、将当前类全名拼接上点号“.”和xmlId参数,并赋值给私有字段namespace,作为当前动态SQL配置类的命名空间;
S1.1.1.4、调用当前类的parseDocument方法进行xml的内容解析操作。
作为优选,所述S1.1.5中,执行parseDocument方法的步骤如下:
S1.1.5.1、使用java类库dom4j的DocumentHelper类的parseText方法,将getXmlContent方法的返回值作为入参传入,进行xml文档解析操作,返回xml文档的Document对象document;
S1.1.5.2、判断document的getDocType方法的返回值是否为null,如果是则为document添加MyBatis XML Mapper的docType;
S1.1.5.3、调用document的getRootElement方法获取文档的根元素对象,赋值给Element类型的变量rootElement;
S1.1.5.4、调用rootElement变量的addAttribute方法设置根元素的namespace属性为当前类的私有字段namespace;
S1.1.5.5、调用rootElement的selectNodes方法并传入参数/mapper/select,返回当前根元素对象下的select子节点到List类型的变量selectNodes;
S1.1.5.6、使用for循环selectNodes,判断迭代对象的resultType属性值是否为空,如果为空则设置为map;
S1.1.5.7、返回方法中的变量document。
作为优选,所述S1.1.6中,执行registerXml方法实现注册动态SQL语句的步骤如下:
S1.1.6.1、将字符串变量xml赋值为配置单条SQL语句或者复合SQL语句的xml文本;
S1.1.6.2、将字符串变量namespace赋值为SqlConfigBase的类名和SQL语句配置的唯一ID进行字符串拼接作为当前xml配置的命名空间;
S1.1.6.3、将字节数组输入流对象(ByteArrayInputStream)变量byteArrayInputStream赋值为S1.1.6.1的xml变量的UTF8编码字节数组,作为参数传入java的字节数组输入流对象(ByteArrayInputStream)的实例化对象;
S1.1.6.4、将Configuration类型变量configuration赋值为MyBatis的Configuration实例对象;
S1.1.6.5、调用configuration变量的isResourceLoaded方法,传入参数为S1.1.6.2的namespace,判断是否已经加载过当前xml文本,如果已经加载过当前xml文本,则获取configuration的loadedResources变量,并使用namespace参数调用其remove方法进行删除,以便重新注册xml;
S1.1.6.6、使用byteArrayInputStream,configuration,namespace等参数实例化MyBatis的XMLMapperBuilder对象,赋值给变量mapperBuilder;
S1.1.6.7、调用S1.1.6.6的mapperBuilder变量的parse方法解析当前xml,完成SQL语句的注册工作。
作为优选,所述S1.2中,动态SQL执行的方法包括executeSelect方法和executeSelect方法:
所述executeSelect方法(只有一个Map<String,Object>类型的入参params)执行方法:调用executeSelect方法,传入参数:sqlConfig对象的getXmlId方法作为selectId参数,当前方法的入参params作为第二个参数;
所述executeSelect方法(包含一个字符串类型的入参selectId和一个Map<String,Object>类型的入参params)执行内容说明:调用MyBatis的SqlSessionUtils工具类的getSqlSession方法并传入参数sqlSessionFactory,将返回的SqlSession对象赋值给方法内的临时变量sqlSession;使用try·finally包裹代码,try块中执行sqlSession的selectList方法,其中调用sqlConfig类变量的getSelectId方法并入参selectId的返回结果作为selectList的第一个参数,方法入参params作为selectList的第二个参数,最后将selectList执行后方法的List对象作为本方法的返回值,finally块中执行调用SqlSessionUtils工具类的closeSqlSession方法并传入参数sqlSession和sqlSessionFactory以关闭MyBatis的session连接释放连接资源。
动态SQL执行的SqlExecutor类说明如下:
类构造函数包含3个参数,分别是:
参数1,字符串变量xmlId,该参数为动态SQL的xml配置的唯一id;
参数2,字符串变量xmlType,该参数为动态SQL的类型,有2个可选值,“1”表示单条SQL语句,“2”表示复合SQL语句;
参数3,字符串变量xmlContent,该参数为动态SQL的文本内容。
构造函数执行的操作如下步骤:
a、判断字符串“1”是否等于xmlType,如果是则使用xmlId和xmlContent参数初始化SimpleSqlConfig对象并赋值给类的SqlConfig类型的私有字段sqlConfig;
b、判断字符串“2”是否等于xmlType,如果是则使用xmlId和xmlContent参数初始化ComplexSqlConfig对象并赋值给类的SqlConfig类型的私有字段sqlConfig;
c、如果xmlType为其他值,则抛出运行时异常:无效的参数:xmlType;
d、调用类变量sqlConfig的registerXml方法完成动态SQL语句注册到MyBatis的操作;
e、调用获取Spring Bean实例的工具类BeanFactory的getBean方法获取MyBatis的SqlSessionFactory类型实例并赋值给类的SqlSessionFactory类型私有字段sqlSessionFactory。
本发明的目的之二在于,提供一种动态查询系统,包括:
动态SQL配置模块,用于根据用户提供的参数,动态决定最终执行的SQL语句;
Groovy动态脚本配置模块,用于基于Groovy实现动态脚本执行工具类(GroovyExecutor);
脚本执行模块,用于Groovy、SQL脚本的执行。
本发明的目的之三在于,提供一种动态查询装置,包括处理器、存储器以及存储在所述存储器中并在所述处理器上运行的计算机程序,所述处理器执行上述的计算机程序时实现如上述中任一所述的动态查询方法的步骤。
本发明的目的之四在于,一种计算机可读存储介质,所述存储介质中存储有至少一段程序,所述至少一段程序由上述的处理器执行以实现如上述中任一所述的动态查询方法的步骤。
与现有技术相比,本发明的有益效果:
1、该动态查询方法及系统中,通过动态SQL注册模块实现SQL语句的动态注册,并可将配置内容持久化到数据库中,实现自由修改。
2、该动态查询方法及系统中,动态SQL执行类实现对已注册的动态SQL的执行功能;
3、通过引入Groovy动态语言,动态执行复合SQL配置中的脚本内容,提高业务逻辑的可定制性。
附图说明
图1为本发明的动态SQL注册模块类图;
图2为本发明的SqlExecutor与SqlConfig的聚合关系图;
图3为本发明的GroovyExecutor的类图;
图4为本发明的单条SQL语句的示例图;
图5为本发明的复合SQL语句的示例图;
图6为本发明的动态查询装置结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1-图6所示,本发明提供一种技术方案:
本发明提供一种动态查询方法,其方法包括如下步骤:
S1、动态SQL配置,MyBatis 3基于OGNL表达式通过在Mapper.xml中使用if、choose、trim、foreach等动态SQL元素来编写包含逻辑判断的SQL语句,在执行过程中可根据用户提供的参数,动态决定最终执行的SQL语句;解决了手动拼接SQL语句麻烦且容易出错的问题;
S2、Groovy动态脚本配置,基于Groovy实现动态脚本执行工具类(GroovyExecutor),使用复合SQL语句配置中script节点的内容和相关参数输入到GroovyExecutor的evaluate方法,进行动态脚本的执行并返回查询结果,GroovyExecutor的类图如图3所示,可以跟Spring无缝集成,可直接调用相关的Spring Bean;
S3、Groovy、SQL脚本执行引擎;
S4、返回结果。
本实施例中,S1中,动态SQL配置的方法包括如下步骤:
S1.1、动态SQL注册,将动态SQL语句注册到MyBatis的配置对象。目前有1个接口SqlConfig,1个基类SqlConfigBase和2个具体的实现类SimpleSqlConfig、ComplexSqlConfig模块类图关系如图1所示;
S1.2、动态SQL执行,动态SQL执行类集成了动态SQL注册类(SqlConfig),对外提供了executeSelectList、executeSelect、executeSelectPage等3个SQL语句执行方法,动态SQL执行类(SqlExecutor)根据传入的xmlType参数来创建哪个动态SQL注册类(SqlConfig);类图关系如图2所示。
进一步的,S1.1中,动态SQL注册的方法包括如下步骤:
S1.1.1、SqlConfigBase类构造函数,构造函数包含2个参数,分别是:
参数1,字符串变量xmlId,该参数为动态SQL的xml配置的唯一id;
参数2,字符串变量xmlContent,该参数为动态SQL的文本内容;
S1.1.2、getXmlId方法返回私有字段xmlId的值;
S1.1.3、getXmlContent方法返回私有字段xmlContent的值;
S1.1.4、getSelectId方法返回私有字段namespace的值拼接上点号“.”和方法入参字符串变量id的值;
S1.1.5、执行parseDocument方法;
S1.1.6、执行registerXml方法实现注册动态SQL语句。
本实施例中,SimpleSqlConfig实现类主要实现了单条SQL语句注册。单条SQL语句的示例如图4所示,SimpleSqlConfig类说明如下:
其中,SimpleSqlConfig覆写了父类方法getXmlContent,将传入的SQL语句内容包装成MyBatis Xml Mapper的格式,使用mapper根元素及select子节点包裹getXmlContent方法的返回值(单条SQL语句的内容),并将select的id属性设置为方法getXmlId的值。
此外,ComplexSqlConfig实现类主要实现了复合SQL语句注册,一般包含一条及以上的动态SQL配置和一个包含业务逻辑的script节点,script的内容使用groovy脚本编写。在script节点中直接调用动态SQL执行类的实体对象sqlExecutor执行复合配置中的动态SQL语句,最终得出需要的返回结果。复合SQL语句的示例如图5所示:
除此之外,ComplexSqlConfig类说明如下:
1)、覆写父类方法parseDocument,具体步骤如下:
a、调用父类的parseDocument方法返回Document赋值到变量document;
b、调用document的getRootElement方法获取文档的根元素对象,赋值给Element类型的变量rootElement;
c、ootElement的selectSingleNode方法并传入参数/mapper/script,返回当调用r前根元素对象下的script子节点到Node类型的变量scriptNode;
d、判断scriptNode是否为null,如果是则抛出运行时异常:缺少script节点;
e、调用rootElement的remove方法并传入参数scriptNode,移除script节点;
f、将scriptNode变量强制转换为Element类型并调用getTextTrim方法获取配置的groovy脚本内容并赋值给类中的私有字符串变量scriptContent;
g、返回方法中的变量document;
2)、getScriptContent方法返回私有字段scriptContent的值。
具体的,S1.1.1中,构造函数的执行操作包括如下步骤:
S1.1.1.1、将参数xmlId赋值给私有字段xmlId;
S1.1.1.2、将参数xmlContent赋值给私有字段xmlContent;
S1.1.1.3、将当前类全名拼接上点号“.”和xmlId参数,并赋值给私有字段namespace,作为当前动态SQL配置类的命名空间;
S1.1.1.4、调用当前类的parseDocument方法进行xml的内容解析操作。
再进一步的,S1.1.5中,执行parseDocument方法的步骤如下:
S1.1.5.1、使用java类库dom4j的DocumentHelper类的parseText方法,将getXmlContent方法的返回值作为入参传入,进行xml文档解析操作,返回xml文档的Document对象document;
S1.1.5.2、判断document的getDocType方法的返回值是否为null,如果是则为document添加MyBatis XML Mapper的docType;
S1.1.5.3、调用document的getRootElement方法获取文档的根元素对象,赋值给Element类型的变量rootElement;
S1.1.5.4、调用rootElement变量的addAttribute方法设置根元素的namespace属性为当前类的私有字段namespace;
S1.1.5.5、调用rootElement的selectNodes方法并传入参数/mapper/select,返回当前根元素对象下的select子节点到List类型的变量selectNodes;
S1.1.5.6、使用for循环selectNodes,判断迭代对象的resultType属性值是否为空,如果为空则设置为map;
S1.1.5.7、返回方法中的变量document。
具体的,S1.1.6中,执行registerXml方法实现注册动态SQL语句的步骤如下:
S1.1.6.1、将字符串变量xml赋值为配置单条SQL语句或者复合SQL语句的xml文本;
S1.1.6.2、将字符串变量namespace赋值为SqlConfigBase的类名和SQL语句配置的唯一ID进行字符串拼接作为当前xml配置的命名空间;
S1.1.6.3、将字节数组输入流对象(ByteArrayInputStream)变量byteArrayInputStream赋值为S1.1.6.1的xml变量的UTF8编码字节数组,作为参数传入java的字节数组输入流对象(ByteArrayInputStream)的实例化对象;
S1.1.6.4、将Configuration类型变量configuration赋值为MyBatis的Configuration实例对象;
S1.1.6.5、调用configuration变量的isResourceLoaded方法,传入参数为S1.1.6.2的namespace,判断是否已经加载过当前xml文本,如果已经加载过当前xml文本,则获取configuration的loadedResources变量,并使用namespace参数调用其remove方法进行删除,以便重新注册xml;
S1.1.6.6、使用byteArrayInputStream,configuration,namespace等参数实例化MyBatis的XMLMapperBuilder对象,赋值给变量mapperBuilder;
S1.1.6.7、调用S1.1.6.6的mapperBuilder变量的parse方法解析当前xml,完成SQL语句的注册工作。
值得说明的是,S1.2中,动态SQL执行的方法包括executeSelect方法和executeSelect方法:
executeSelect方法(只有一个Map<String,Object>类型的入参params)执行方法:调用executeSelect方法,传入参数:sqlConfig对象的getXmlId方法作为selectId参数,当前方法的入参params作为第二个参数;
executeSelect方法(包含一个字符串类型的入参selectId和一个Map<String,Object>类型的入参params)执行内容说明:调用MyBatis的SqlSessionUtils工具类的getSqlSession方法并传入参数sqlSessionFactory,将返回的SqlSession对象赋值给方法内的临时变量sqlSession;使用try·finally包裹代码,try块中执行sqlSession的selectList方法,其中调用sqlConfig类变量的getSelectId方法并入参selectId的返回结果作为selectList的第一个参数,方法入参params作为selectList的第二个参数,最后将selectList执行后方法的List对象作为本方法的返回值,finally块中执行调用SqlSessionUtils工具类的closeSqlSession方法并传入参数sqlSession和sqlSessionFactory以关闭MyBatis的session连接释放连接资源。
具体的,动态SQL执行的SqlExecutor类说明如下:
类构造函数包含3个参数,分别是:
参数1,字符串变量xmlId,该参数为动态SQL的xml配置的唯一id;
参数2,字符串变量xmlType,该参数为动态SQL的类型,有2个可选值,“1”表示单条SQL语句,“2”表示复合SQL语句;
参数3,字符串变量xmlContent,该参数为动态SQL的文本内容。
值得说明的是,构造函数执行的操作如下步骤:
a、判断字符串“1”是否等于xmlType,如果是则使用xmlId和xmlContent参数初始化SimpleSqlConfig对象并赋值给类的SqlConfig类型的私有字段sqlConfig;
b、判断字符串“2”是否等于xmlType,如果是则使用xmlId和xmlContent参数初始化ComplexSqlConfig对象并赋值给类的SqlConfig类型的私有字段sqlConfig;
c、如果xmlType为其他值,则抛出运行时异常:无效的参数:xmlType;
d、调用类变量sqlConfig的registerXml方法完成动态SQL语句注册到MyBatis的操作;
e、调用获取Spring Bean实例的工具类BeanFactory的getBean方法获取MyBatis的SqlSessionFactory类型实例并赋值给类的SqlSessionFactory类型私有字段sqlSessionFactory。
具体的,S2中,Groovy动态脚本配置的方法如下:
S2.1、setVariable方法,调用binding对象的setVariable方法用来设置脚本所需的变量;
S2.2、removeVariable方法,调用binding对象的getVariables方法返回值的remove方法用来移除脚本变量;
S2.3、第一个evaluate方法只包含一个字符串类型的入参expression,执行内容为调用第二个evaluate方法,并传入expression和null作为参数,表示没有需要外部传入的变量;
S2.4、第二个evaluate方法包含一个字符串类型的入参expression和一个Map<String,Object>类型的变量列表入参variables。
其中,GroovyExecutor类说明如下:
类中包含3个私有类型的变量,分别是:
SCRIPTS变量为ConcurrentHashMap的实例,用来存储已经被groovy解析过的基本;
binding变量为groovy的Binding对象实例;
SHELL变量为groovy的GroovyShell实例,使用binding作为入参,用来执行基本。
值得说明的是,S2.4中,变量列表入参variables的方法包括如下步骤:
S2.4.1、初始化方法内部groovy Script类型变量script,用来存储groovy解析后的脚本对象;
S2.4.2、调用SCRIPTS的containsKey方法判断入参expression是否被解析过。如果是,则从SCRIPTS的get方法传入expression获取解析后的Script对象并赋值给script变量。如果否,则调用SHELL对象的parse方法并传入expression进行脚本解析,并将解析后的结果Script对象赋值给script变量,同时调用SCRIPTS的put方法传入expression和script进行缓存操作;
S2.4.3、判断入参variables是否不为null,如果是则使用for循环variables的entrySet,在循环体内调用script的setProperty方法将variables的entry对象的key和value作为第一和第二个参数传入,进行groovy脚本执行变量设置;
S2.4.4、调用script的run方法进行脚本执行,并将执行结果作为返回值。
本发明的目的之二在于,提供一种动态查询系统,包括:
动态SQL配置模块,用于根据用户提供的参数,动态决定最终执行的SQL语句;
Groovy动态脚本配置模块,用于基于Groovy实现动态脚本执行工具类(GroovyExecutor);
脚本执行模块,用于Groovy、SQL脚本的执行。
需要说明的是,动态SQL配置模块、Groovy动态脚本配置模块、脚本执行模块的功能具体参见各模块对应的方法部分的描述,这里就不再赘述。
参阅图6,示出了本发明实施例所涉及的一种动态查询装置结构示意图,该装置包括处理器、存储器和总线。
处理器包括一个或一个以上处理核心,处理器通过总线与处理器相连,存储器用于存储程序指令,处理器执行存储器中的程序指令时实现上述的动态查询方法。
可选的,存储器可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随时存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。
此外,本发明还提供一种计算机可读存储介质,存储介质中存储有至少一段程序,至少一段程序由上述的处理器执行以实现如上述中任一的动态查询方法的步骤。
可选的,本发明还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述各方面动态查询方法的步骤。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储与一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上显示和描述了本发明的基本原理、主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的仅为本发明的优选例,并不用来限制本发明,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。

Claims (10)

1.一种动态查询方法,其方法包括如下步骤:
S1、动态SQL配置,MyBatis 3基于OGNL表达式通过在Mapper.xml中使用if、choose、trim、foreach动态SQL元素来编写包含逻辑判断的SQL语句;
S2、Groovy动态脚本配置,基于Groovy实现动态脚本执行工具类,使用复合SQL语句配置中script节点的内容和相关参数输入到GroovyExecutor的evaluate方法,进行动态脚本的执行并返回查询结果;
S3、Groovy、SQL脚本执行引擎;
S4、返回结果。
2.根据权利要求1所述的动态查询方法,其特征在于:所述S1中,动态SQL配置的方法包括如下步骤:
S1.1、动态SQL注册,将动态SQL语句注册到MyBatis的配置对象;
S1.2、动态SQL执行,动态SQL执行类集成了动态SQL注册类。
3.根据权利要求2所述的动态查询方法,其特征在于:所述S1.1中,动态SQL注册的方法包括如下步骤:
S1.1.1、SqlConfigBase类构造函数,构造函数包含2个参数,分别是:
参数1,字符串变量xmlId,该参数为动态SQL的xml配置的唯一id;
参数2,字符串变量xmlContent,该参数为动态SQL的文本内容;
S1.1.2、getXmlId方法返回私有字段xmlId的值;
S1.1.3、getXmlContent方法返回私有字段xmlContent的值;
S1.1.4、getSelectId方法返回私有字段namespace的值拼接上点号“.”和方法入参字符串变量id的值;
S1.1.5、执行parseDocument方法;
S1.1.6、执行registerXml方法实现注册动态SQL语句。
4.根据权利要求3所述的动态查询方法,其特征在于:所述S1.1.1中,构造函数的执行操作包括如下步骤:
S1.1.1.1、将参数xmlId赋值给私有字段xmlId;
S1.1.1.2、将参数xmlContent赋值给私有字段xmlContent;
S1.1.1.3、将当前类全名拼接上点号“.”和xmlId参数,并赋值给私有字段namespace,作为当前动态SQL配置类的命名空间;
S1.1.1.4、调用当前类的parseDocument方法进行xml的内容解析操作。
5.根据权利要求3所述的动态查询方法,其特征在于:所述S1.1.5中,执行parseDocument方法的步骤如下:
S1.1.5.1、使用java类库dom4j的DocumentHelper类的parseText方法,将getXmlContent方法的返回值作为入参传入,进行xml文档解析操作,返回xml文档的Document对象document;
S1.1.5.2、判断document的getDocType方法的返回值是否为null,如果是则为document添加MyBatis XML Mapper的docType;
S1.1.5.3、调用document的getRootElement方法获取文档的根元素对象,赋值给Element类型的变量rootElement;
S1.1.5.4、调用rootElement变量的addAttribute方法设置根元素的namespace属性为当前类的私有字段namespace;
S1.1.5.5、调用rootElement的selectNodes方法并传入参数/mapper/select,返回当前根元素对象下的select子节点到List类型的变量selectNodes;
S1.1.5.6、使用for循环selectNodes,判断迭代对象的resultType属性值是否为空,如果为空则设置为map;
S1.1.5.7、返回方法中的变量document。
6.根据权利要求3所述的动态查询方法,其特征在于:所述S1.1.6中,执行registerXml方法实现注册动态SQL语句的步骤如下:
S1.1.6.1、将字符串变量xml赋值为配置单条SQL语句或者复合SQL语句的xml文本;
S1.1.6.2、将字符串变量namespace赋值为SqlConfigBase的类名和SQL语句配置的唯一ID进行字符串拼接作为当前xml配置的命名空间;
S1.1.6.3、将字节数组输入流对象变量byteArrayInputStream赋值为S1.1.6.1的xml变量的UTF8编码字节数组,作为参数传入java的字节数组输入流对象的实例化对象;
S1.1.6.4、将Configuration类型变量configuration赋值为MyBatis的Configuration实例对象;
S1.1.6.5、调用configuration变量的isResourceLoaded方法,传入参数为S1.1.6.2的namespace,判断是否已经加载过当前xml文本,如果已经加载过当前xml文本,则获取configuration的loadedResources变量,并使用namespace参数调用其remove方法进行删除,以便重新注册xml;
S1.1.6.6、使用byteArrayInputStream,configuration,namespace等参数实例化MyBatis的XMLMapperBuilder对象,赋值给变量mapperBuilder;
S1.1.6.7、调用S1.1.6.6的mapperBuilder变量的parse方法解析当前xml,完成SQL语句的注册工作。
7.根据权利要求2所述的动态查询方法,其特征在于:所述S1.2中,动态SQL执行的方法包括executeSelect方法和executeSelect方法:
所述executeSelect方法执行方法:调用executeSelect方法,传入参数:sqlConfig对象的getXmlId方法作为selectId参数,当前方法的入参params作为第二个参数;
所述executeSelect方法执行内容说明:调用MyBatis的SqlSessionUtils工具类的getSqlSession方法并传入参数sqlSessionFactory,将返回的SqlSession对象赋值给方法内的临时变量sqlSession;使用try·finally包裹代码,try块中执行sqlSession的selectList方法,其中调用sqlConfig类变量的getSelectId方法并入参selectId的返回结果作为selectList的第一个参数,方法入参params作为selectList的第二个参数,最后将selectList执行后方法的List对象作为本方法的返回值,finally块中执行调用SqlSessionUtils工具类的closeSqlSession方法并传入参数sqlSession和sqlSessionFactory以关闭MyBatis的session连接释放连接资源。
8.一种动态查询系统,包括:
动态SQL配置模块,用于根据用户提供的参数,动态决定最终执行的SQL语句;
Groovy动态脚本配置模块,用于基于Groovy实现动态脚本执行工具类;
脚本执行模块,用于Groovy、SQL脚本的执行。
9.一种动态查询装置,其特征在于:包括处理器、存储器以及存储在所述存储器中并在所述处理器上运行的计算机程序,所述处理器执行上述的计算机程序时实现如权利要求1-9中任一所述的动态查询方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一段程序,所述至少一段程序由上述的处理器执行以实现如权利要求1-9中任一所述的动态查询方法的步骤。
CN202010017244.6A 2020-01-08 2020-01-08 一种动态查询方法及系统 Active CN111259042B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010017244.6A CN111259042B (zh) 2020-01-08 2020-01-08 一种动态查询方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010017244.6A CN111259042B (zh) 2020-01-08 2020-01-08 一种动态查询方法及系统

Publications (2)

Publication Number Publication Date
CN111259042A true CN111259042A (zh) 2020-06-09
CN111259042B CN111259042B (zh) 2022-05-31

Family

ID=70943826

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010017244.6A Active CN111259042B (zh) 2020-01-08 2020-01-08 一种动态查询方法及系统

Country Status (1)

Country Link
CN (1) CN111259042B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112307068A (zh) * 2020-11-10 2021-02-02 天元大数据信用管理有限公司 一种动态sql查询方法
CN113760877A (zh) * 2021-03-10 2021-12-07 中科天玑数据科技股份有限公司 一种基于标准sql的流式数据清洗转换方法和系统

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103902743A (zh) * 2014-04-29 2014-07-02 厦门市智业软件工程有限公司 通过业务名词操控数据的自助查询方法
US20170103106A1 (en) * 2015-10-07 2017-04-13 International Business Machines Corporation Processing sql statement in alternating modes
CN106649630A (zh) * 2016-12-07 2017-05-10 乐视控股(北京)有限公司 数据查询方法及装置
CN109213776A (zh) * 2017-06-30 2019-01-15 北京神州泰岳软件股份有限公司 一种报表展现方法和装置
CN110019433A (zh) * 2018-01-02 2019-07-16 北京神州泰岳软件股份有限公司 一种报表查询方法和装置
CN110086827A (zh) * 2019-05-14 2019-08-02 重庆商勤科技有限公司 一种sql注入校验方法、服务器以及系统

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103902743A (zh) * 2014-04-29 2014-07-02 厦门市智业软件工程有限公司 通过业务名词操控数据的自助查询方法
US20170103106A1 (en) * 2015-10-07 2017-04-13 International Business Machines Corporation Processing sql statement in alternating modes
CN106649630A (zh) * 2016-12-07 2017-05-10 乐视控股(北京)有限公司 数据查询方法及装置
CN109213776A (zh) * 2017-06-30 2019-01-15 北京神州泰岳软件股份有限公司 一种报表展现方法和装置
CN110019433A (zh) * 2018-01-02 2019-07-16 北京神州泰岳软件股份有限公司 一种报表查询方法和装置
CN110086827A (zh) * 2019-05-14 2019-08-02 重庆商勤科技有限公司 一种sql注入校验方法、服务器以及系统

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112307068A (zh) * 2020-11-10 2021-02-02 天元大数据信用管理有限公司 一种动态sql查询方法
CN113760877A (zh) * 2021-03-10 2021-12-07 中科天玑数据科技股份有限公司 一种基于标准sql的流式数据清洗转换方法和系统

Also Published As

Publication number Publication date
CN111259042B (zh) 2022-05-31

Similar Documents

Publication Publication Date Title
CN107644323B (zh) 一种面向业务流的智能审核系统
US8959106B2 (en) Class loading using java data cartridges
US7934207B2 (en) Data schemata in programming language contracts
US8108834B2 (en) Defining and executing processes using declarative programming language constructs
US7013458B2 (en) Method and apparatus for associating metadata attributes with program elements
CN112394942B (zh) 基于云计算的分布式软件开发编译方法及软件开发平台
US8141035B2 (en) Method for accessing internal states of objects in object oriented programming
JP7394211B2 (ja) スマートコントラクトの並行実行の方法、装置、機器、及び媒体
US20090328016A1 (en) Generalized expression trees
Shatnawi et al. Analyzing program dependencies in java ee applications
WO2003001373A1 (en) Java rule engine framework
US20120173575A1 (en) Record Based Code Structure
US7669191B1 (en) Compile-time dispatch of operations on type-safe heterogeneous containers
CN111259042B (zh) 一种动态查询方法及系统
Lapadula et al. Using formal methods to develop WS-BPEL applications
US20080127128A1 (en) Type Validation for Applications Incorporating A Weakly-Typed Language
Lazar et al. Using a fUML Action Language to construct UML models
CN113626001A (zh) 一种基于脚本的api动态编排方法及装置
EP4204960A1 (en) Thread-local return structure for asynchronous state machine
Colombo et al. Linear Temporal Logic
US20240241697A1 (en) Extensible built-in object management
CN109308256A (zh) 一种java程序动态分析方法、设备和存储介质
US8983984B2 (en) Methods and systems for simplifying object mapping for external interfaces
US20240135210A1 (en) Replacing lambda expressions in a rete network with corresponding code classes
US20240232666A9 (en) Replacing lambda expressions in a rete network with corresponding code classes

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