SSM+MySQL开发架构中SQL mapper文件的解析和审计

SSM+MySQL已是Java开发的主流架构。在SSM+MySQL架构中,SQL一般写在mapper映射文件中,对于mapper文件的审计一直是个头疼的问题,测试人员很难覆盖mapper文件中动态SQL的所有情况,开发人员更是无法罗列每一个select id对应的所有SQL。在和开发同时沟通后,觉得自己可以写一个小工具来解决这一痛点!笔者作为一名DBA,自学了golang,经过七个月的努力初步完成了myaudit这一款实用性极强的SQLAudit小工具的开发,欢迎使用和吐槽,项目地址:https://github.com/gaozhongzheng/myaudit
下面简单介绍下myaudit这个小工具:

myaudit是一个审计SSM + MySQL开发架构中SQL映射文件(xml文件)的SQLAudit工具。

设计思路如下:

  • 1.格式化xml文件
  • 2.重写xml文件
  • 3.构造Mybatis工程
  • 4.调起Mybatis工程打印所有可能的SQL到日志
  • 5.解析日志获取SQL,并根据动态字段类型将SQL中的‘?‘替换为具体值
  • 6.调用SOAR获取审计报告

    特点:

  • 1.与业务代码深度解耦
  • 2.解析并审计动态SQL所有可能的情况
  • 3.根据字段类型替换绑定变量值,解决了SQL指纹无法在MySQL中获取执行计划的问题

    安装/部署(Linux)

    方式一

  • step1.克隆源代码至本地
  • step2.编译命令文件:cd cmd;go build myaudit.go
  • step3.执行createDir.sh创建相应目录,目录含义见目录说明
  • step4.上传log4j-1.2.17.jar、mybatis-3.2.8.jar、mysql-connector-java-5.1.47.jar至/usr/local/myaudit/lib,可从此处获取jar包
  • step5.将step2中编译好的命令文件拷贝至/usr/local/myaudit/bin并将此目录添加至环境变量
    注:需先安装SOAR

    方式二(免编译快速部署)

  • step1.克隆deployment至本地
  • step2.将/usr/local/myaudit/bin添加至环境变量

    使用myaudit(如有疑问或建议,请邮件至2818962342@qq.com)

    Usage of myaudit:
    -ftype       mapper|slowlog|normal, default mapper          --待审计文件种类,默认为mapper(暂时只支持Mybatis项目中的mapper文件)
    -fname       file waitting for audit                      --待审计文件名,不需加扩展名,如MapperSakila.xml传参时为MapperSakila
    -conn        $IP:$PORT/$DB, like 127.0.0.1:3306/sakila    --测试环境连接串,待审计文件对应的测试环境数据库
    -u           username    --MySQL用户名
    -p           password    --MySQL用户密码
    -report-type html|json, default html    --报告类型,默认为html
  • step1.上传待审计的SQL映射文件至/usr/local/myaudit/file
  • step2.执行审计(示例):
    myaudit -ftype mapper -fname MapperSakila -conn 127.0.0.1:3306/sakila -u root -p 123456 -report-type html
    Dir ‘/usr/local/myaudit/tmp/MapperSakila‘ was created/rebuilt successfully!
    /usr/local/myaudit/file/MapperSakila.xml read ok!
    /usr/local/myaudit/tmp/MapperSakila/tmp.xml read ok!
    /usr/local/myaudit/tmp/MapperSakila/oldMapper.xml read ok!
    /usr/local/myaudit/tmp/MapperSakila/oldMapperFormated.xml read ok!
    Compile and execute java files successfully!
    /usr/local/myaudit/log/mapperLog/MapperSakila.log read ok!
    Database connect success!
    Dir ‘/usr/local/myaudit/sql/MapperSakila‘ was created/rebuilt successfully!
    Dir ‘/usr/local/myaudit/audit/MapperSakila‘ was created/rebuilt successfully!
    xml file was successfully audited, you can find the audit file ‘getFilmInfoTest1_audit.html‘ in directory /usr/local/myaudit/audit/MapperSakila.
    xml file was successfully audited, you can find the audit file ‘getFilmInfoTest2_audit.html‘ in directory /usr/local/myaudit/audit/MapperSakila.

    MapperSakila.xml解析出的SQL文件在此

    审计报告截图:

原文地址:http://blog.51cto.com/13476134/2351434

时间: 2024-11-05 22:01:48

SSM+MySQL开发架构中SQL mapper文件的解析和审计的相关文章

springboot不加载mapper文件问题解析

1. 场景描述 启动的时候报"springboot available: expected at least 1 bean which qualifies as autowire candidate". 2. 解决方案 该错误一眼看过去,简单说就是bean无效,无法注入,使用的@Autowired或者@Resource注入bean有问题. 才想起来昨天从其他地方新加入一个mapper文件,为了区分现在的mapper,就单独放到一个文件夹里了. 2.1 问题定位 (1)首先确认新建文件夹

iOS中中UIView头文件详细解析

@interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem> /** *  通过一个frame来初始化一个UI控件 */ - (id)initWithFrame:(CGRect)frame; // YES:能够跟用户进行交互 @property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteraction

mybatis 中 sql 映射文件 select 标签以及 入 resultMap 标签的应用

1.自定义某个 javabean 的封装规则: 注:可以看到,select 标签中引用了 定义好的 resultMap 的值.resultMap 标签中的 type 为javabean 类型,id 为唯一标识.id 子标签定义主键(这样定义底层会有优化.)column 属性为字段名,property 属性为字段值. 注:可以看到测试结果没有出现问题,说明代码没有错误. 2.自定义某个 javabean 的级联属性封装: a.准备工作:mysql 数据库中,在之前 tbl_employees 表的

MySql基础架构以及SQL语句执行流程

01. mysql基础架构 SQL语句是如何执行的 学习一下mysql的基础架构,从一条sql语句是如何执行的来学习. 一般我们写一条查询语句类似下面这样: select user,password from mysql.user; 这样就可以返回一个结果,但却不知这条语句的内部执行流程. 如下是mysql的逻辑架构图: Mysql可以分为Server层和存储引擎层二部分. Server层有连接器/缓存/分析器/优化器/执行器,涵盖了mysql的很多核心功能. 存储引擎层负责数据的存储和读取,支

apt系统中sources.list文件的解析

为什么要分析 sources.list 的解析? 我不是APT的开发者, 仅仅是遇到了躲只是的问题,不分析就没法update,详细原因就不详述了,反正搜索到这篇文章的人,肯定也是碰到了类似的问题.什么?你没有问题? 那还浪费时间看这个干嘛? 为啥这么说呢? 由于我花了非常多时间,搞明确了 apt sources.list 的格式,问题攻克了,但是这些知识又有什么意义呢? 和我真正想干的事全然不相干啊,纯属浪费时间而已.这属于被逼无奈的被动无用功, 由于不搞明确了就没法干正事. . 所以,读了王垠

MySQL(三):MHA实现MySQL主从架构中主服务器的高可用,zabbix完成manager重启

MHA(Master High Availability)是目前在MySQL高可用方面相对成熟的一个解决方案,MHA在监控到master节点故障时,会提升其中拥有最新数据的slave节点成为新的master节点,在此期间,MHA会通过于其它从节点获取额外信息来避免一致性方面的问题.MHA还提供了master节点的在线切换功能. MHA 服务有两种角色,MHA Manager(管理节点)和 MHA Node(数据节点): MHA Manager:通常单独部署在一台独立机器上管理多个 master/

使用MHA对mysql主从架构中的主节点做高可用

MHA:Master HA(主从结构的高可用方案)只是实现了对主节点高可用,它是建构在mysql主从复制结构之上的,也就是说需要事先把mysq配置成传统的复制集群. MHA在监控到master节点故障时,会提升其中拥有最新数据的slave节点称为新的master,在此期间,MHA会通过其它从节点获取额外信息来避免一致性方面的问题.MHA还提供了master节点在线切换的功能,即按需切换master/salve节点. MHA服务有两种角色,MHA Manager(管理节点)和MHA Node(数据

python web开发-flask中读取txt文件内容

某些情况下,需要读取flask网站要目录下的txt文件.但是直接在flask网站的目录下创建一个文件是无法访问的.从网站找了一些资料,最终发现通过写一个方法返回txt内容比较简单方便,不过此方法适用于简单的文件读取以及读取量比较小的时候.详细代码如下: @app.route('/<path>')def today(path):base_dir = os.path.dirname(__file__)resp = make_response(open(os.path.join(base_dir,

maven中的profile文件的解析

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersi