一种基于Mybatis检测sql语句合法性的方法

Mybatis作为一种常用的数据库持久层技术被普遍使用。在使用Mybatis技术研发的数据库应用软件中,软件的代码结构设计是这样的:即软件代码设计中,每个模块功能关联与之对应的数据库操作程序单元即MappedStatement接口,包含一条或多条sql语句的XML文件,与xml文件配对java程序接口Mapper。在一个XML文件中包含几条,十几条,甚至更多sql语句,同时每条sql语句因传递参数的值不同(即条件不同)可能最终生成的sql语句也不尽相同。

通常情况下检测这些sql语句语法合法性需要进行相应的软件功能操作或软件测试。当软件包含功能很多时这无疑是一项耗时繁重的工作,同时测试功能遗漏或者动态条件sql中不同参数内容数据覆盖不全经常出现,也就造成已上线使用的系统频繁出错。

出现上述情况,Mybatis现有技术没有sql语句语法正确性验证的检查方法

通过研发sql语句合法性检测模块,借助Spring、SpringBoot、Mybatis等技术以软件运行启动为基础说明基于Mybatis检测sql语句合法性方法的插件实现与使用。
流程如下:
1)    软件启动,使用文件或缓存(Redis)存储当前软件关联的数据库信息,主要包含:数据表名,数据表字段,数据库对象(存储过程、视图、自定义函数、内置函数)、数据库类型、sql语言关键词等。存储结构为json文件或Redis中的HashMap。其中每个数据库表的父节点Key为表名,子节点Value为表字段(列)名。
2)    软件启动监听器程序从配置信息中读取并解析各功能数据库操作程序单元即MappedStatement接口,对应XML文件sql语句和配对java接口Mapper。
3)    循环读取软件数据库操作程序单元并调用sql合法性检测接口。传递参数包含操作sql语句,sql参数类型;
4)    在sql合法性检测接口中依据步骤3传递参数创建当前数据库操作程序单元sql检测所需的参数对象数据,即依据sql语句参数类型创建随机对象(java对象),并将此参数对象各属性值匹配替换当前sql语句参数占位符即问号(?),最终获得完整的sql语句;
5)    按字符串方式解析当前完整sql语句,分三体组成:head头部,body执行体,bottom条件体。如当前sql语句包含多条或多层子语句时,按树型结构存储,即子语句为当前语句分支,然后各分支再解析包含上述三部分。
此处字符串分割标记(token)为sql结构关键词,语句格式种类主要有以下:
查询语句:select 列名称 from 表名称 where 条件;
删除语句:delete from 表名称 where 列名称 = 值;
更新语句:update 表名称 set 列名称 = 新值 where 列名称 = 某值;
插入语句:insert into 表名称 values (值1, 值2,….) ,insert into表名称 (列1, 列2,…) values (值1, 值2,….),insert into 表名称 values (值1, 值2,….) select (列1, 列2,…) from表名称等三种;
存储过程访问语句:call 存储过程名称(参数值1,参数值2,…)。
其余视为非法语句。
例如 select name,password from t_user where name =’admin’ and 1 = 1 ,sql解析后head为select name,password,body 为from t_user,bottom为where name =’admin’ and 1 = 1。
6)    循环上述解析的元素集使用预定义的sql合法性规则进行检测,当sql解析元素集全部通过规则检测则当前sql合法,否则当前sql检测失败并记录失败日志。最终只有软件全部功能包含的所有sql语句检测通过才表示当前软件数据库操作单元检测正确否则失败。其中预定义的sql合法性规则包括但不限于:1、起始关键词检测,即检测sql三体分割起始关键词是否存在,此处关键词有insert、insert into、select、delete、update、value、from、where等;2、多语句检测,即是否属于包含多条或多层子语句,并且每条子语句使用配对括号包围,如果存在多语句时需先解析子语句再逐个解析检测;3、元素检测,即三体中包含的表名称、列名称正确性、“表-字段”匹配、sql语言关键词正确性检测,此检测通过匹配步骤1预存储的内容判断;4、内置和自定义数据库函数正确性检测, 此检测通过匹配步骤1预存储的内容判断;5、数量配对检测,即检测插入语句列数与value值个数是否相等;6、其他规则检测还包含符号配对检测,如逗号,,括号(),单引号‘’;运算符(大于>,大于等于>=,等于=,不等于<>、!=,小于<,小于等于<=、and和or结合等)检测;特征语法(like、in、not in、top、limit、between..and等)检测等
7)    步骤6检测过程可分两种模式开展,即全量检测和唯一检测,全量检测是针对每个功能的每个sql语句最多可能创建随机参数对象值以遍历当前数据库操作单元可能产生的所有完整sql语句形态并逐一检测,待检测完成显示各语句块检测结果或错误信息,检测面覆盖完整,缺点为耗时长,通常用于软件功能自动化测试;唯一检测是指使用参数对象全值(每个属性均赋值)和空对象参数值构建各功能每一个完整sql语句,且只要过程中出现检测错误就立即终止当前检测执行并终止程序运行,检测过程快速,通常用于软件发布验证、软件启动等。

 

    原文作者:道光2008
    原文地址: https://blog.csdn.net/warison2008/article/details/107123493
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞