CN111752542B - 基于xml模板的数据库查询接口引擎 - Google Patents
基于xml模板的数据库查询接口引擎 Download PDFInfo
- Publication number
- CN111752542B CN111752542B CN202010600923.6A CN202010600923A CN111752542B CN 111752542 B CN111752542 B CN 111752542B CN 202010600923 A CN202010600923 A CN 202010600923A CN 111752542 B CN111752542 B CN 111752542B
- Authority
- CN
- China
- Prior art keywords
- value
- node
- acquiring
- result
- statement
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Mathematical Physics (AREA)
- Computational Linguistics (AREA)
- Computer Security & Cryptography (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及信息技术领域,提供了基于XML模板的数据库查询接口引擎。目的在于通过写XML模板替代传统的硬编码快速开发法数据库查询接口,即时对外提供服务。主要方案包括通过预先定义XML模板规则,通过编写XML模板替代硬编码实现数据库查询接口功能。模板引擎会按照接口命名规则自动读取模板信息,在解析XML模板时会按照字段规则自动校验请求调用的参数;根据SQL语句生成规则,分析并执行条件判断语句,可以按需生成SQL查询条件;在SQL语句生成之后,根据数据源自动发起数据库查询调用,并将查询的结果按照自定义的结构返回给调用方。
Description
技术领域
本发明涉及信息技术领域,提供了基于XML模板的数据库查询接口引擎。
背景技术
关系型数据库是各个行业数据资产的重要存储介质,而SQL语句又是关系 型数据库中数据检索的重要方式。现在的软件的数据检索语句穿插于代码之 中,根据各种不同的调用参数形成不同的SQL语句,然后发送至数据库进行查 询调用。也有类似于在固定的配置文件中编写SQL,做到SQL与代码分离的效 果。不管哪种方式,在目前都没办法能做到修改SQL语句即时生效的能力。
本方案提出一种通过XML模板的方式快速构建SQL语句的引擎方案,能做 到简单的请求参数校验,请求参数语句判断,根据需要构建不同的返回结果, 同时可以做到模板随时修改随时生效的能力。
发明内容
本发明的目的在于解决目前都没办法能做到修改SQL语句即时生效的问 题。
未解决上述技术问题,本发明采用以下技术方案:
基于XML模板的数据库查询接口引擎:
XML模板的说明如下:
步骤S0:定义XML模板的命名规则,以.xml为后缀,名称为查询标识id 加上”_”再加上版本号,例如queryUser_v05.xml
步骤S1:XML模板的根节点为<service>,其有三个属性值,分别为 id:该查询语句的标识;
type:该查询语句对应的关系型数据库类型,例如oracle、mysql等;
datasource:该检索语句对应的数据源标识。数据源是按照各个数据库连 接规则已经预置好的,这些数据库以对象形式缓存在内存。
步骤S2:XML的请求参数节点<request-param>,该节点定义了检索语句所 支持的查询参数,其有一个type属性,仅支持一个值”map”(代表参数是一种 (k,v)键值对结构)。<service>有且仅有一个<request-param>节点。
步骤S2.1:<request-param>有一个或者多个<entry>子节点,每个<entry>
节点都代表着一个参数定义说明,定义的参数的名称、类型、以及基本的 校验条件。
<entry>的属性如下
key-name:参数名称
key-type:参数类型,将会对代入的参数进行校验。仅支持int、long、 short、byte、float、double、bool、bigDecimal类型。
nullable:是否可以为空,代表这该参数是否必传,默认为true(必 传),如非必传,则设置为false。
步骤S3:XML的SQL查询语句节点<select>,它代表着查询语句的整个模 块。SQL查询语句则按照<service>节点的type属性值所代表的的数据库规则 进行编写。
步骤S3.1:SQL语句的查询条件与请求参数通过#{}插值对应。在#{}出现的 地方,将被#{}中的字段值所替换。#{}中的值就是该查询条件对应的<request- param>中定义的字段名。
步骤S3.2:SQL语句中的<须用<![CADATA[<]]>或者&|t;代替
步骤S3.3:<select>节点中的<if>节点,代表一个判断。判断条件语句在 属性“test”编写,其中
1、test语句基本格式为”操作数”“比较运算符””操作数”;
2、判断条件的比较运算符包括>、<、==、>=、<=、!=;
2、判断条件的逻辑运算符包括and、or;
3、判断条件的优先级运算符包括(、);
<if>节点可以多级嵌套,也可以嵌套<select>;
步骤S4:XML文档的<result-set>是定义返回结构的节点,XML文档有且 仅有一个<result-set>节点。该节点有一个type属性,代表返回的结果集类 型,其值包括
map:一种(k,v)的键值对结构
array:一种(k,v)键值对结构的数组
步骤S4.1:<entry>节点定义了返回结果集每一个字段的类型、取值方 式、返
回的结果类型,其各个属性的含义如下:
key-name:返回字段的名称
value-from:字段值的取值表达式,表示的是从查询结果集中取值的方式。 其表达式分为两部分,并且以#分隔,前半部分表示查询结果集的下标,
后半部分表示查询结果集的字段。如果<result-set>的type属性值 为”map”,
则表达式必须是带”#”的表达式,如果<result-set>的type属性值
为”array”,则可以不用带“#”。例如O#userName,表示从查询结果集数 组 的第一个元素取userName字段值。
实现该功能需要如下步骤:
步骤0:定义模板引擎的调用入口功能parse,其接收到的参数为模板名称 a,构建SQL语句的参数b(b的结构为为一种k,v的键值对结构)
步骤1:根据a读取模板文件,得到其内容为doc
步骤2:解析doc的<request-param>,验证b的有效性,其验证规则如下
步骤2.1:获取<request-param>的所有<entry>子节点列表entryList
步骤2.2:遍历entryList,对entryList的每个元素temp做如下操作
步骤2.2.1:获取temp的”key-name”属性keyName,获取temp 的”value-type”属性valueType,获取temp的”nullable”属性nullable
步骤2.2.2:从b中获取属性为keyName的值keyValue
步骤2.2.3:如果nullable为false,并且keyValue为空,则调用失败, 否则继续执行2.2.4。
步骤2.2.4:如果keyValue的类型不是valueType,则将b中属性值为 keyName的元素删除。
步骤3:解析doc的<select>,构建查询语句sql,其步骤如下:
步骤3.1:创建字符串变量sql;
步骤3.2:获取<select>的每一行内容t;
步骤3.3:如果t是文本或者是cdata,则直接将t与sql拼接;
步骤3.4:如果t是<if>节点,则做如下处理,得到执行结果ifr;
步骤3.4.1:获取t的“test”属性值test,该值其实是一个判断语句;
步骤3.4.2:解析test判断语句,得到语句列表explist,具体步骤如下:
步骤3.4.2.1:将test用空格拆分,得到新数组strArr;
步骤3.4.2.2:遍历strArr,对每一个元素e做如下处理;
步骤3.4.2.3:如果e含有“(”、“)”,则将e拆分成“(”、“)”以及字 符串tt,将tt、“(”、“)”按照顺序放入列表explist
步骤3.4.2.4:如果e没有“(”和“)”,则直接将e放入explist
步骤3.4.3:执行explist中的语句,具体步骤如下:
步骤3.4.3.1:创建临时栈stack;
步骤3.4.3.2:遍历explist,得到每一个元素exp;
步骤3.4.3.2:如果exp是”(”,或者逻辑运算符,则将exp压栈;
步骤3.4.3.3:如果exp是”)”,或者exp是explist的最后一个元素,则 做如下步骤:
步骤3.4.3.3.1:stack连续出栈三个元素,分别是o1,o2,o3,o1是用于比 较的第一个操作数,o2是比较运算符,o3用于比较的第二个操作:
步骤3.4.3.3.2:o1、o2、o3做三元比较操作,得到结果rb;
步骤3.4.3.3.3:如果exp是explist的最后一个元素,且此时stack已 空,则返回rb执行结束;否则对stack做出栈操作,再将rb压栈;
步骤3.4.3.3.4:重复3.4.3.3.1至3.4.3.3.3操作,直至stack为空;
步骤3.4.3.4:如果exp是比较运算符,则做如下操作:
步骤3.4.3.4.1:从stack中出栈一个元素ss,从b中取名为ss的元素值 ssv;
步骤3.4.3.4.2:从explist中获取exp的下一个元素expn,从b中取名 为expn的元素值expnv;
步骤3.4.3.4.3:对ssv、exp、expnv做三元比较运算,得到结果rrb;
步骤3.4.3.4.3:将rrb压栈;
步骤3.4.3.5:如果exp为其他值,则直接压栈stack;
步骤3.5:ifr为”true”,则获取<if>节点的ift,执行如下操作;
步骤3.5.1:如果ift是文本值,则对ift做如下处理后,将ift拼接到 sql;
步骤3.5.1.1:如果ift含有#{},则获取{}中的值cd;
步骤3.5.1.2:从b中获取名为cd的元素值cdv;
步骤3.5.1.3:将ift中的#{}插值用cdv代替;
步骤3.5.2:如果ift是<if>节点,则执行步骤3.4;
步骤3.5.2:如果ift是<select>节点,则执行步骤3;
步骤4:获取<service>节点”datasource”属性值ds,从内置数据源映射表 中获取名为ds的数据源,执行sql语句得到执行结果sqlResult;
步骤5:获取<result-set>节点的”type”属性值rtype,对sqlResult、 rtype做如下操作得到结果returnObj;
步骤5.1:如果<result-set>的type属性rtype值等于”map”,则创建一 个(k,v)结构的结果变量rmp,继续如下操作后,返回rmp,rmap就是步骤5中 的returnObj;
步骤5.1.1:获取<result-set>的<entry>节点列表entrylist;
步骤5.1.2:遍历entrylist列表,得到每一个元素entryele;
步骤5.1.3:获取entryele的“key-name”属性值kn;
步骤5.1.4:获取entryele的“value-from”属性值vf;
步骤5.1.4.1:将vf用#分隔,得到值index,rfiled;
步骤5.1.4.2:获取sqlResult中第index个元素名为rfiled的值 rfiledvv,获取entryele的“value-type”属性值vt,将rfiledvv转换成ct 类型,得到结果rfiledv;
步骤5.1.4.3:将kn、rfiledv以(k,v)键值对的形式放入rmp;
步骤5.2:如果rtype值等于”array”,则创建一个(k,v)结构的数组结果 变量rar,继续如下操作后,返回rar;
步骤5.2.1:获取<result-set>的<entry>节点列表entrylist;
步骤5.2.2:遍历entrylist列表,得到每一个元素entryele;
步骤5.2.3:获取entryele的“key-name”属性值kn;
步骤5.2.4:获取entryele的“value-from”属性值vf;
步骤5.2.4.1:将vf用#分隔,得到值index,rfiled;
步骤5.2.4.2:获取sqlResult中第index个元素名为rfiled的值 rfiledvv,获取entryele的“value-type”属性值vt,将rfiledvv转换成ct 类型,得到结果rfiledv;
步骤5.2.4.3:创建(k,v)结构变量m,将kn、rfiledv以(k,v)键值对的形 式放入m;
步骤5.2.4.4:将m放入rar,返回rar,rar就是步骤5中的 returnObj;
步骤6:将returnObj返回,至此整个调用结束。
因为本发明采用了上述技术方案,因此具备以下有益效果:
1、通过编写XML模板的方式实现数据库查询接口,能够达到快速开发 部署的效果,极大的提高了接口的开发效率。由于XML是通过模板引擎即 时解析的,所以接口的变更和修改不需要经过传统开发模式的编译打包的 操作,在完成接口模板的开发和修改之后可以即时生效,对生产的运行和 维护效率是一种极大的提升。
2、天生具备了一定的路由能力,模板中的datasouce属性决定了SQL 语句发往的数据库,datasource的变更就代表路由的变更。
3、数据总线是这样一种应用:数据总线是将机构内的数据资产(各个 数据库)以接口的形式向外输出的应用。其内容包括请求参数封装、字段 校验、语句生成、数据路由、数据库调用、结果封装等一系列功能。该方 案通过模板引擎的方式一站式解决了数据总线类应用的功能,同时还能做 到快速开发,随时部署,7x24小时不停服务的能力。
附图说明
图1为模板引擎执行与调度流程示例图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实 施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅 用以解释本发明,并不用于限定本发明,即所描述的实施例仅仅是本发明一部 分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施 例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要 求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实 施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施 例,都属于本发明保护的范围。
需要说明的是,术语“第一”和“第二”等之类的关系术语仅仅用来将一 个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实 体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包 含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素 的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的 其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在 没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包 括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本发明公开了一种基于XML模板的数据库查询接口引擎:
XML模板的说明如下:
步骤S0:定义XML模板的命名规则,以.xml为后缀,名称为查询标识id 加上”_”再加上版本号,例如queryUser_v05.xml
步骤S1:XML模板的根节点为<service>,其有三个属性值,分别为
id:该查询语句的标识;
type:该查询语句对应的关系型数据库类型,例如oracle、mysql等;
datasource:该检索语句对应的数据源标识。数据源是按照各个数据库连 接规则已经预置好的,这些数据库以对象形式缓存在内存。
步骤S2:XML的请求参数节点<request-param>,该节点定义了检索语句所 支持的查询参数,其有一个type属性,仅支持一个值”map”(代表参数是一种 (k,v)键值对结构)。<service>有且仅有一个<request-param>节点。
步骤S2.1:<request-param>有一个或者多个<entry>子节点,每个 <entry>
节点都代表着一个参数定义说明,定义的参数的名称、类型、以及基本的 校验条件。
<entry>的属性如下
key-name:参数名称
key-type:参数类型,将会对代入的参数进行校验。仅支持int、long、 short、byte、float、double、bool、bigDecimal类型。
nullable:是否可以为空,代表这该参数是否必传,默认为true(必 传),如非必传,则设置为false。
步骤S3:XML的SQL查询语句节点<select>,它代表着查询语句的整个模 块。SQL查询语句则按照<service>节点的type属性值所代表的的数据库规则 进行编写。
步骤S3.1:SQL语句的查询条件与请求参数通过#{}插值对应。在#{}出现的 地方,将被#{}中的字段值所替换。#{}中的值就是该查询条件对应的<request- param>中定义的字段名。
步骤S3.2:SQL语句中的<须用<![CADATA[<]]>或者&It;代替
步骤S3.3:<select>节点中的<if>节点,代表一个判断。判断条件语句在 属性“test”编写,其中
1、test语句基本格式为”操作数”“比较运算符””操作数”;
2、判断条件的比较运算符包括>、<、==、>=、<=、!=
2、判断条件的逻辑运算符包括and、or
3、判断条件的优先级运算符包括(、)
<if>节点可以多级嵌套,也可以嵌套<select>
步骤S4:XML文档的<result-set>是定义返回结构的节点,XML文档有且 仅有
一个<result-set>节点。该节点有一个type属性,代表返回的结果集类 型,其值包括
map:一种(k,v)的键值对结构
array:一种(k,v)键值对结构的数组
步骤S4.1:<entry>节点定义了返回结果集每一个字段的类型、取值方 式、返
回的结果类型,其各个属性的含义如下:
key-name:返回字段的名称
value-from:字段值的取值表达式,表示的是从查询结果集中取值的方式。 其表达式分为两部分,并且以#分隔,前半部分表示查询结果集的下标,
后半部分表示查询结果集的字段。如果<result-set>的type属性值 为”map”,
则表达式必须是带”#”的表达式,如果<result-set>的type属性值
为”array”,则可以不用带“#”。例如O#userName,表示从查询结果集数 组 的第一个元素取userName字段值。
实现该功能需要如下步骤:
步骤0:定义模板引擎的调用入口功能parse,其接收到的参数为模板名称 a,构建SQL语句的参数b(b的结构为为一种k,v的键值对结构)
步骤1:根据a读取模板文件,得到其内容为doc
步骤2:解析doc的<request-param>,验证b的有效性,其验证规则如下
步骤2.1:获取<request-param>的所有<entry>子节点列表entryList
步骤2.2:遍历entryList,对entryList的每个元素temp做如下操作
步骤2.2.1:获取temp的”key-name”属性keyName,获取temp 的”value-type”属性valueType,获取temp的”nullable”属性nullable
步骤2.2.2:从b中获取属性为keyName的值keyValue
步骤2.2.3:如果nullable为false,并且keyValue为空,则调用失败, 否则继续执行2.2.4。
步骤2.2.4:如果keyName字段值的类型不是valueType,则将b中属性值 为keyName的元素删除。keyName是这个字段的名称。比如参照图1中第6 行,b中有一个名称”userld”的字段,按照XML规则,这个字段值应该 是”long”类型。模板引擎在获取到”userld”字段值之后,会检查这个值是 否为long类型,如果不是,则将该字段从b中删除。
步骤3:解析doc的<select>,构建查询语句sql,其步骤如下:
步骤3.1:创建字符串变量sql;
步骤3.2:获取<select>的每一行内容t;
步骤3.3:如果t是文本或者是cdata,则直接将t与sql拼接;
步骤3.4:如果t是<if>节点,则做如下处理,得到执行结果ifr;
步骤3.4.1:获取t的“test”属性值test,该值其实是一个判断语句;
步骤3.4.2:解析test判断语句,得到语句列表explist,具体步骤如下:
步骤3.4.2.1:将test用空格拆分,得到新数组strArr;
步骤3.4.2.2:遍历strArr,对每一个元素e做如下处理;
步骤3.4.2.3:如果e含有“(”、“)”,则将e拆分成“(”、“)”以及字 符串tt,将tt、“(”、“)”按照顺序放入列表explist
步骤3.4.2.4:如果e没有“(”和“)”,则直接将e放入explist
步骤3.4.3:执行explist中的语句,具体步骤如下:
步骤3.4.3.1:创建临时栈stack;
步骤3.4.3.2:遍历explist,得到每一个元素exp;
步骤3.4.3.2:如果exp是”(”,或者逻辑运算符,则将exp压栈;
步骤3.4.3.3:如果exp是”)”,或者exp是explist的最后一个元素,则 做如下步骤:
步骤3.4.3.3.1:stack连续出栈三个元素,分别是o1,o2,o3,o1是用于比 较的第一个操作数,o2是比较运算符,o3用于比较的第二个操作:
步骤3.4.3.3.2:o1、o2、o3做三元比较操作,得到结果rb;
步骤3.4.3.3.3:如果exp是explist的最后一个元素,且此时stack已 空,则返回rb执行结束;否则对stack做出栈操作,再将rb压栈;
步骤3.4.3.3.4:重复3.4.3.3.1至3.4.3.3.3操作,直至stack为空;
步骤3.4.3.4:如果exp是比较运算符,则做如下操作:
步骤3.4.3.4.1:从stack中出栈一个元素ss,从b中取名为ss的元素值 ssv;
步骤3.4.3.4.2:从explist中获取exp的下一个元素expn,从b中取名 为expn的元素值expnv;
步骤3.4.3.4.3:对ssv、exp、expnv做三元比较运算,得到结果rrb;
步骤3.4.3.4.3:将rrb压栈;
步骤3.4.3.5:如果exp为其他值,则直接压栈stack;
步骤3.5:ifr为”true”,则获取<if>节点的ift,执行如下操作;
步骤3.5.1:如果ift是文本值,则对ift做如下处理后,将ift拼接到 sql;
步骤3.5.1.1:如果ift含有#{},则获取{}中的值cd;
步骤3.5.1.2:从b中获取名为cd的元素值cdv;
步骤3.5.1.3:将ift中的#{}插值用cdv代替;
步骤3.5.2:如果ift是<if>节点,则执行步骤3.4;
步骤3.5.2:如果ift是<select>节点,则执行步骤3;
步骤4:获取<service>节点”datasource”属性值ds,从内置数据源映射表 中获取名为ds的数据源,执行sql语句得到执行结果sqlResult;
步骤5:获取<result-set>节点的”type”属性值rtype,对sqlResult、 rtype做如下操作得到结果returnObj;
步骤5.1:如果rtype值等于”map”,则创建一个(k,v)结构的结果变量 rmp,继续如下操作后,返回rmp,rmap就是步骤5中的returnObj;
步骤5.1.1:获取<result-set>的<entry>节点列表entrylist;
步骤5.1.2:遍历entrylist列表,得到每一个元素entryele;
步骤5.1.3:获取entryele的“key-name”属性值kn;
步骤5.1.4:获取entryele的“value-from”属性值vf;
步骤5.1.4.1:将vf用#分隔,得到值index,rfiled;
步骤5.1.4.2:获取sqlResult中第index个元素名为rfiled的值 rfiledvv,获取entryele的“value-type”属性值vt,将rfiledvv转换成ct 类型,得到结果rfiledv;
步骤5.1.4.3:将kn、rfiledv以(k,v)键值对的形式放入rmp;
步骤5.2:如果rtype值等于”array”,则创建一个(k,v)结构的数组结果 变量rar,继续如下操作后,返回rar;
步骤5.2.1:获取<result-set>的<entry>节点列表entrylist;
步骤5.2.2:遍历entrylist列表,得到每一个元素entryele;
步骤5.2.3:获取entryele的“key-name”属性值kn;
步骤5.2.4:获取entryele的“value-from”属性值vf;
步骤5.2.4.1:将vf用#分隔,得到值index,rfiled;
步骤5.2.4.2:获取sqlResult中第index个元素名为rfiled的值 rfiledvv,获取entryele的“value-type”属性值vt,将rfiledvv转换成ct 类型,得到结果rfiledv;
步骤5.2.4.3:创建(k,v)结构变量m,将kn、rfiledv以(k,v)键值对的形 式放入m;
步骤5.2.4.4:将m放入rar,返回rar,rar就是步骤5中的 returnObj;
步骤6:将returnObj返回,至此整个调用结束。
Claims (7)
1.一种基于XML模板的数据库查询接口引擎实现方法,其特征在于,包括:
XML模板配置,
所述XML模板配置包括以下步骤:
步骤A0:定义XML模板的命名规则,以.xml为后缀,名称为查询标识id加上”_”再加上版本号,得到模块名称a;
步骤A1:定义XML模板的根节点为<service>,其有三个属性值,分别为:
id:查询语句的标识;
type:查询语句对应的关系型数据库类型;
datasource:查询语句对应的数据源标识,数据源是按照各个数据库连接规则已经预置好的,这些数据库以对象形式缓存在内存;
步骤A2:定义XML的请求参数节点<request-param>,该节点定义了查询语句所支持的查询参数,其有一个type属性,仅支持一个值”map”,<service>有且仅有一个<request-param>节点;
步骤A3:定义XML的SQL查询语句节点<select>,它代表着查询语句的整个模块;SQL查询语句则按照<service>节点的type属性值所代表的的数据库规则进行编写;
步骤A4:XML文档的<result-set>是定义返回结构的节点,XML文档有且仅有一个<result-set>节点,该节点有一个type属性,代表返回的结果集类型,其值包括:
map:一种(k,v)的键值对结构;
array:一种(k,v)键值对结构的数组;
功能实现步骤:
步骤B0:定义模板引擎的调用入口功能parse,其接收到的参数为模板名称a,构建SQL语句的参数b,b的结构为为一种k,v的键值对结构;
步骤B1:根据a读取模板文件,得到其内容为doc ;
步骤B2:解析doc的<request-param>,验证SQL语句的参数b的有效性;
步骤B3:解析doc的<select>,构建查询语句sq;
步骤B4:获取<service>节点”datasource”属性值ds,从内置数据源映射表中获取名为ds的数据源,执行sql语句得到执行结果sqlResult;
步骤B5:获取<result-set>节点的”type”属性值rtype,将sqlResult按照子节点<entry>定义的取值规则和字段类型进行处理,得到类型为type的结果returnObj;
步骤B6:将returnObj返回,至此整个调用结束。
2.根据权利要求1所述的一种基于XML模板的数据库查询接口引擎实现方法,其特征在于,步骤A2具体为: <request-param>有一个或者多个<entry>子节点,每个<entry>节点都代表着一个参数定义说明,定义的参数的名称、类型、以及基本的校验条件;
<entry>的属性如下:
key-name:参数名称;
key-type:参数类型,将会对代入的参数进行校验,仅支持int、long、short、byte、float、double、bool、bigDecimal类型;
nullable:是否可以为空,代表这该参数是否必传,默认为true,代表必传,如非必传,则设置为false。
3.根据权利要求1所述的一种基于XML模板的数据库查询接口引擎实现方法,其特征在于,步骤A3,包括以下步骤:
步骤A3.1:SQL语句的查询条件与请求参数通过#{}插值对应,在#{}出现的地方,将被#{}中的字段值所替换,#{}中的值就是该查询条件对应的<request-param>中定义的字段名;
步骤A3.2:SQL语句中的“<”使用“<![CADATA[<]]>”或者“<”代替;
步骤A3.3:<select>节点中的<if>节点,代表一个判断,判断条件语句在属性“test”编写,其中:
1、test语句包括“操作数”、“比较运算符”、“逻辑运算符”、“优先级运算符” ;
2、判断条件的比较运算符包括“>”、“<”、“==”、“>=”、“<=”、“!=”;
3、判断条件的逻辑运算符包括“and”、“or”;
4、判断条件的优先级运算符包括“(”、“)”;
<if>节点可以多级嵌套,也可以嵌套<select>。
4.根据权利要求1所述的一种基于XML模板的数据库查询接口引擎实现方法,其特征在于,步骤A4,包括以下步骤:
<entry>节点定义了返回结果集每一个字段的类型、取值方式、返回的结果类型,其各个属性的含义如下:
key-name:返回字段的名称;
value-from:字段值的取值表达式,表示的是从查询结果集中取值的方式;其表达式分为两部分,并且以#分隔,前半部分表示查询结果集的下标,后半部分表示查询结果集的字段;
如果<result-set>的type属性值为”map”,则表达式必须是带”#”的表达式,如果<result-set>的type属性值为”array”,则可以不用带“#”。
5.根据权利要求1所述的一种基于XML模板的数据库查询接口引擎实现方法,其特征在于,步骤B2,包括以下步骤:
步骤2.1:获取<request-param>的所有<entry>子节点列表entryList;
步骤2.2:遍历entryList,对entryList的每个元素temp做如下操作;
步骤2.2.1:获取temp的“key-name”属性keyName,获取temp的”value-type”属性valueType,获取temp的”nullable”属性nullable;
步骤2.2.2:从SQL语句的参数b中获取属性为keyName的值keyValue;
步骤2.2.3:如果nullable为false,并且keyValue为空,则调用失败,否则继续执行2.2.4;
步骤2.2.4:如果keyName字段值的类型不是valueType,则将SQL语句的参数b中属性值为keyName的元素删除。
6.根据权利要求1所述的一种基于XML模板的数据库查询接口引擎实现方法,其特征在于,步骤B3,包括以下步骤:
步骤3.1:创建字符串变量sql;
步骤3.2:获取<select>的每一行内容t;
步骤3.3:如果内容t是文本或者是cdata,则直接将内容t与sql拼接;
步骤3.4:如果内容t是<if>节点,则做如下处理,得到执行结果ifr;
步骤3.4.1:获取内容t的“test”属性值test,该属性值test是一个判断语句;
步骤3.4.2:解析test判断语句,得到语句列表explist,具体步骤如下:
步骤3.4.2.1:将test用空格拆分,得到新数组strArr;
步骤3.4.2.2:遍历strArr,对每一个元素e做如下处理;
步骤3.4.2.3:如果e含有“(”、“)”,则将e拆分成“(”、“)”以及字符串tt,将tt、“(”、“)”按照顺序放入列表explist;
步骤3.4.2.4:如果e没有“(”、“)”,则直接将e放入explist;
步骤3.4.3:执行explist中的语句,具体步骤如下:
步骤3.4.3.1:创建临时栈stack;
步骤3.4.3.2:遍历explist,得到每一个元素exp;
步骤3.4.3.2:如果exp是“(”,或者逻辑运算符,则将exp压栈;
步骤3.4.3.3:如果exp是“)”,或者exp是explist的最后一个元素,则做如下步骤:
步骤3.4.3.3.1:stack连续出栈三个元素,分别是o1,o2,o3,o1是用于比较的第一个操作数,o2是比较运算符,o3用于比较的第二个操作;
步骤3.4.3.3.2:o1、o2、o3做三元比较操作,得到结果rb;
步骤3.4.3.3.3:如果exp是explist的最后一个元素,且此时stack已空,则返回rb执行结束,这里返回的rb为执行结果ifr;否则对stack做出栈操作,再将rb压栈;
步骤3.4.3.3.4:重复3.4.3.3.1至3.4.3.3.3操作,直至stack为空;
步骤3.4.3.4:如果exp是比较运算符,则做如下操作:
步骤3.4.3.4.1:从stack中出栈一个元素ss,从SQL语句的参数b中取名为ss的元素值ssv;
步骤3.4.3.4.2:从explist中获取exp的下一个元素expn,从b 中取名为expn的元素值expnv;
步骤3.4.3.4.3:对ssv、exp、expnv做三元比较运算,得到结果rrb,rrb为执行结果ifr;
步骤3.4.3.4.4:将rrb压栈;
步骤3.4.3.5:如果exp为其他值,则直接压栈stack;
步骤3.5:ifr为”true”,则获取<if>节点的ift,执行如下操作;
步骤3.5.1:如果ift是文本值,则对ift做如下处理后,将ift拼接到sql;
步骤3.5.1.1:如果ift含有#{},则获取{}中的值cd;
步骤3.5.1.2:从SQL语句的参数b中获取名为cd的元素值cdv;
步骤3.5.1.3:将ift中的#{}插值用cdv代替;
步骤3.5.2:如果ift是<if>节点,则执行步骤3.4;
步骤3.5.3:如果ift是<select>节点,则执行步骤3。
7.根据权利要求1所述的一种基于XML模板的数据库查询接口引擎实现方法,其特征在于,步骤B5,包括以下步骤:
步骤5.1:如果<result-set>的type属性rtype值等于”map”,则创建一个(k,v)结构的结果变量rmp,继续如下操作后,返回rmp,rmap就是步骤B5中的returnObj;
步骤5.1.1:获取<result-set>的<entry>节点列表entrylist;
步骤5.1.2:遍历entrylist列表,得到每一个元素entryele;
步骤5.1.3:获取entryele的“key-name”属性值kn;
步骤5.1.4:获取entryele的“value-from”属性值vf;
步骤5.1.4.1:将vf用#分隔,得到值index,rfiled;
步骤5.1.4.2:获取sqlResult中第index个元素名为rfiled的值rfiledvv,获取entryele的“value-type”属性值vt,将rfiledvv转换成ct类型,得到结果rfiledv;
步骤5.1.4.3:将kn、rfiledv以(k,v)键值对的形式放入rmp;
步骤5.2:如果rtype值等于”array”,则创建一个(k,v)结构的数组结果变量rar,继续如下操作后,返回rar;
步骤5.2.1:获取<result-set>的<entry>节点列表entrylist;
步骤5.2.2:遍历entrylist列表,得到每一个元素entryele;
步骤5.2.3:获取entryele的“key-name”属性值kn;
步骤5.2.4:获取entryele的“value-from”属性值vf;
步骤5.2.4.1:将vf用#分隔,得到值index,rfiled;
步骤5.2.4.2:获取sqlResult中第index个元素名为rfiled的值rfiledvv,获取entryele的“value-type”属性值vt,将rfiledvv转换成ct类型,得到结果rfiledv ;
步骤5.2.4.3:创建(k,v)结构变量m,将kn、rfiledv以(k,v)键值对的形式放入m;
步骤5.2.4.4:将m放入rar,返回rar,rar就是步骤5中的returnObj。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010600923.6A CN111752542B (zh) | 2020-06-26 | 2020-06-26 | 基于xml模板的数据库查询接口引擎 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010600923.6A CN111752542B (zh) | 2020-06-26 | 2020-06-26 | 基于xml模板的数据库查询接口引擎 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111752542A CN111752542A (zh) | 2020-10-09 |
CN111752542B true CN111752542B (zh) | 2020-12-29 |
Family
ID=72677741
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010600923.6A Active CN111752542B (zh) | 2020-06-26 | 2020-06-26 | 基于xml模板的数据库查询接口引擎 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111752542B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112256931A (zh) * | 2020-10-26 | 2021-01-22 | 北京神州数字科技有限公司 | 一种数据提取方法 |
CN112632333A (zh) * | 2020-12-17 | 2021-04-09 | 杭州迪普科技股份有限公司 | 查询语句生成方法、装置、设备及计算机可读存储介质 |
CN112965748B (zh) * | 2021-04-08 | 2022-04-15 | 武汉众邦银行股份有限公司 | 一种可配置的自动添加代码注解的方法 |
CN114356286A (zh) * | 2021-11-29 | 2022-04-15 | 南京瀚元科技有限公司 | 一种低代码化接口开发的方法和系统 |
CN118503311B (zh) * | 2024-07-17 | 2024-09-24 | 恒生电子股份有限公司 | 数据查询方法、电子设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1804840A (zh) * | 2005-01-12 | 2006-07-19 | 微软公司 | 数据访问层类生成器 |
CN101183376A (zh) * | 2007-12-07 | 2008-05-21 | 武汉达梦数据库有限公司 | 基于关系代数范围运算的xml数据库查询方法 |
CN103279509A (zh) * | 2013-05-17 | 2013-09-04 | 北京首钢自动化信息技术有限公司 | 一种采用动态查询语言的快速查询方法 |
CN104484337A (zh) * | 2014-11-19 | 2015-04-01 | 西安电子科技大学 | Xml文档的存储方法 |
CN104598454A (zh) * | 2013-10-31 | 2015-05-06 | 南京思润软件有限公司 | 一种基于xml的信息搜索方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100293524A1 (en) * | 2009-05-12 | 2010-11-18 | International Business Machines, Corporation | Development environment for managing database aware software projects |
-
2020
- 2020-06-26 CN CN202010600923.6A patent/CN111752542B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1804840A (zh) * | 2005-01-12 | 2006-07-19 | 微软公司 | 数据访问层类生成器 |
CN101183376A (zh) * | 2007-12-07 | 2008-05-21 | 武汉达梦数据库有限公司 | 基于关系代数范围运算的xml数据库查询方法 |
CN103279509A (zh) * | 2013-05-17 | 2013-09-04 | 北京首钢自动化信息技术有限公司 | 一种采用动态查询语言的快速查询方法 |
CN104598454A (zh) * | 2013-10-31 | 2015-05-06 | 南京思润软件有限公司 | 一种基于xml的信息搜索方法 |
CN104484337A (zh) * | 2014-11-19 | 2015-04-01 | 西安电子科技大学 | Xml文档的存储方法 |
Non-Patent Citations (1)
Title |
---|
XML与关系型数据库数据交换的实现;施学勤 等;《计算机与数字工程》;20070723;第38卷(第(2007)06期);153、154、173 * |
Also Published As
Publication number | Publication date |
---|---|
CN111752542A (zh) | 2020-10-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111752542B (zh) | 基于xml模板的数据库查询接口引擎 | |
CN107092656B (zh) | 一种树状结构数据处理方法及系统 | |
US7054854B1 (en) | Structured document search method, structured document search apparatus and structured document search system | |
US7886224B2 (en) | System and method for transforming tabular form date into structured document | |
US9305096B2 (en) | Uniform resource identifier template manipulation | |
CN109522225B (zh) | 一种自动化测试断言方法及装置、测试平台及存储介质 | |
KR101082814B1 (ko) | 키워드를 이용한 온톨로지 정보 검색 방법 및 장치 | |
US9535966B1 (en) | Techniques for aggregating data from multiple sources | |
US20040205615A1 (en) | Enhanced mechanism for automatically generating a transformation document | |
CN107016071B (zh) | 一种利用简单路径特征优化树状结构数据的方法及系统 | |
CN110795526B (zh) | 一种用于检索系统的数学公式索引创建方法与系统 | |
US8024353B2 (en) | Method and system for sequentially accessing compiled schema | |
Hazber et al. | Integration mapping rules: Transforming relational database to semantic web ontology | |
CN110909523B (zh) | 一种数据处理方法及装置 | |
CN103365992A (zh) | 一种基于一维线性空间实现Trie树的词典检索方法 | |
CN112579610A (zh) | 多数据源结构分析方法、系统、终端设备及存储介质 | |
JP4247135B2 (ja) | 構造化文書記憶方法、構造化文書記憶装置、構造化文書検索方法 | |
Haider et al. | CSV2RDF: Generating RDF data from CSV file using semantic web technologies | |
JP2005190163A (ja) | 構造化データ検索方法、構造化データ検索装置およびプログラム | |
JP5789236B2 (ja) | 構造化文書分析方法、構造化文書分析プログラム、および構造化文書分析システム | |
US20060184562A1 (en) | Method and system for decoding encoded documents | |
CN115576603B (zh) | 一种获取代码片段中的变量值的方法及装置 | |
CN118475924A (zh) | 用于计算机实现的数据变换的处理器、计算机程序产品、系统和方法 | |
CN114880523A (zh) | 字符串处理方法、装置、电子设备及存储介质 | |
US20060212799A1 (en) | Method and system for compiling schema |
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 |