如何优雅的将Mybatis日志中的Preparing与Parameters转换为可执行SQL

2023-10-31

原文链接

疫情期间大家宅在家里是不是已经快憋出“病”了~~

公司给开了VPN,手机电脑都能连,手机装上APP测试包,就能干活了,所以walking从2020.02.01入京以来,已经窝在家里11天了。这两天在家远程办公,预测下周也要在家办公。。

最近在家隔离期间,其实也是学的少玩的多。这不,今天在看Mybatis源码的时候发现了一款好用的Mybatis插件和一个转换工具,今天就赶忙写出来分享给大伙。

我们大家在工作中应该都是用过Mybatis吧,有时候我们在本地调试的时候,会打开Mybatis的SQL日志打印,那么打印出来的SQL是下图这样的

你可以看到预编译的SQL条件用占位符(?)了select * from User where id = ? ,并不是真实的SQL select * from User where id = 1 。

如果我们想得到真实的SQL,像上图那样参数少的话还可以自己把参数值手动拼上去,但是如果参数多了呢?是不是自己手动填就很麻烦了。

不用MAME麻烦,今天就告诉你如何将mybatis日志的Preparing与Parameters转化为可执行sql。

分享两种方式哈,一种是IDEA的插件mybatis log plugin,另一种是没有条件安装这个插件或者没有IDEA的时候,一种静态页面的方式。

第一种 mybatis log plugin插件

在Idea的setting - plugins里搜索mybatis log plugin,如下图,点击install即可,然后按照提示重启idea就行了。(如下已经安装完成)

然后我们就可以选中SQL日志右键选择:Restore Sql from Selection

然后就可以在Mybatis Log窗口看到真实的SQL了

然后就可以复制出来到别的地方执行了

第二种 静态页面工具

另外还有聪明的同学搞了个静态页面出来,以便于在无法安装上述plugin的时候用。

原作者的文章地址:
https://blog.csdn.net/Zale_J/article/details/89402668

只需要搞个html文件,然后把作者的源码贴进去,然后保存,用浏览器打开,再把mybatis日志帖进去点击“转换”即可得到真实SQL。源码我在下面也贴出来了。

效果图:

源代码:

 <!DOCTYPE html>
 <html>
 <head>
   <meta charset="utf-8">
   <title></title>
   <script type="text/javascript">
     function f(obj){
       var textVa = obj.value;
       // 获取带问号的SQL语句
       var statementStartIndex = textVa.indexOf('Preparing: ');
       var statementEndIndex = textVa.length-1;
       for(var i = statementStartIndex; i < textVa.length; i++) {
         if(textVa[i] == "\n") {
          statementEndIndex = i;
          break;
         }
       }
       var statementStr = textVa.substring(statementStartIndex+"Preparing: ".length, statementEndIndex);
       console.log(statementStr);
       //获取参数
       var parametersStartIndex = textVa.indexOf('Parameters: ');
       var parametersEndIndex = textVa.length-1;
       for(var i = parametersStartIndex; i < textVa.length; i++) {
         if(textVa[i] == "\n") {
          parametersEndIndex = i;
          break;
         } else {
           console.log(textVa[i]);
         }
       }
       var parametersStr = textVa.substring(parametersStartIndex+"Parameters: ".length, parametersEndIndex);
       parametersStr = parametersStr.split(",");
       console.log(parametersStr);
       for(var i = 0; i < parametersStr.length; i++) {
         // 如果数据中带括号将使用其他逻辑
         tempStr = parametersStr[i].substring(0, parametersStr[i].indexOf("("));
         // 获取括号中内容
         typeStr = parametersStr[i].substring(parametersStr[i].indexOf("(")+1,parametersStr[i].indexOf(")"));
         // 如果为字符类型
         if (typeStr == "String" || typeStr == "Timestamp") {
           statementStr = statementStr.replace("?", "'"+tempStr.trim()+"'");
         }else{
           // 数值类型
           statementStr = statementStr.replace("?", tempStr.trim());
         }
       }
       console.log(statementStr);
       document.getElementById("d1").innerHTML = statementStr;
       return textVa;
     }
</script>
 </head>
 <body>
    <textarea   name="getStr" id="1" rows="4" cols="100"></textarea>
    <button type="submit" onclick="f(document.getElementById('1'))">转换</button>
  <div id="d1"></div>
 </body>
 </html>

还有另外一位网友,说原作者的有一点bug,具体什么bug也没说,应该是做了一些优化什么的吧。具体什么我也没有验证。

做优化的原文:https://www.cnblogs.com/n031/p/11176346.html

下面是效果图:

优化的代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>mybatis转换</title>
    <script type="text/javascript">
        function f(obj) {
            var textVa = obj.value;
            // 获取带问号的SQL语句
            var statementStartIndex = textVa.indexOf('Preparing: ');
            var statementEndIndex = textVa.length - 1;
            for (var i = statementStartIndex; i < textVa.length; i++) {
                if (textVa[i] == "\n") {
                    statementEndIndex = i;
                    break;
                }
            }
            var statementStr = textVa.substring(statementStartIndex + "Preparing: ".length, statementEndIndex);
            console.log(statementStr);
            //获取参数
            var parametersStartIndex = textVa.indexOf('Parameters: ');
            var parametersEndIndex = textVa.length;
            for (var i = parametersStartIndex; i < textVa.length; i++) {
                if (textVa[i] == "\n") {
                    parametersEndIndex = i;
                    break;
                } else {
                    // console.log(textVa[i]);
                }
            }
            var parametersStr = textVa.substring(parametersStartIndex + "Parameters: ".length, parametersEndIndex);
            console.log(parametersStr);
            // 参数列表
            var parametersStrArr = parametersStr.split(",");
            console.log(parametersStrArr);
            for (var i = 0; i < parametersStrArr.length; i++) {
                tempStr = parametersStrArr[i].substring(0, parametersStrArr[i].indexOf("("));
                // 不含"("是null
                if(tempStr == ''){
                    tempStr = "null";
                }
                // 如果数据中带括号需要判断参数类型
                typeStr = parametersStrArr[i].substring(parametersStrArr[i].indexOf("(") + 1, parametersStrArr[i].indexOf(")"));
                if (typeStr == "String" || typeStr == "Timestamp") {
                    statementStr = statementStr.replace("?", "'" + tempStr.trim() + "'");
                } else {
                    statementStr = statementStr.replace("?", tempStr.trim());
                }
            }
            console.log(statementStr);
            document.getElementById("d1").innerHTML = statementStr;
            return true;
        }
</script>
</head>
<body>
    <button type="submit" onclick="f(document.getElementById('1'))">转换</button><br><br>
    <textarea style="border:blue solid 2px;" name="getStr" id="1" rows="25" cols="150"></textarea><br>
    <p style="color:red;font:30px bold;">你的SQL</p>
    <div style="border:red solid 2px;" id="d1"></div>
</body>
</html>

这俩种方式具体用哪个视情况而定。感谢这两位作者的聪明才智和无私奉献。

如果感觉有用的话赶紧分享给你的小伙伴吧,现在没时间搞的话先收藏起来吧~

武汉加油!中国加油!


欢迎关注公众号:编程大道

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何优雅的将Mybatis日志中的Preparing与Parameters转换为可执行SQL 的相关文章

  • 几款ZooKeeper可视化工具,最后一个美炸了~

    本文首发于公众号 BiggerBoy 欢迎关注 ZooKeeper是我们工作中常用一个开源的分布式协调服务 提供分布式数据一致性解决方案 分布式应用程序可以实现数据发布订阅 负载均衡 命名服务 集群管理分布式锁 分布式队列等功能 当我们想通
  • jenkins部署聚合项目报错[FATAL] Non-resolvable parent POM for xxx: Could not find artifact xxx

    项目改为聚合工程后使用jenkins部署时报错 如下 ERROR The build could not read 2 projects gt Help 1 org apache maven project ProjectBuildingE
  • 如何优雅的将Mybatis日志中的Preparing与Parameters转换为可执行SQL

    原文链接 疫情期间大家宅在家里是不是已经快憋出 病 了 公司给开了VPN 手机电脑都能连 手机装上APP测试包 就能干活了 所以walking从2020 02 01入京以来 已经窝在家里11天了 这两天在家远程办公 预测下周也要在家办公 最
  • 关于Maven如何打Zip包

    1 通常我们使用Maven来打包Jar包 当我们需要打包成Zip包的时候就需要用到maven assembly plugin插件了 通过这个插件 不仅可以将源码打包 也能选择将一些特殊文件也打包进去 比如Build生成的Jar包
  • Docker-安装(Linux,Windows)

    目录 前言 安装版本 Docker版本说明 前提条件 Linux安装 使用YUM源部署 获取阿里云开源镜像站YUM源文件 安装Docker ce 配置Docker Daemon启动文件 启动Docker服务并查看已安装版本 使用二进制文件部
  • gdb 安装编译

    arm linux gdb gdbserver的编译安装 下载gdb 7 5 tar gz http www gnu org software gdb download ftp sourceware org pub gdb releases
  • Windows安装使用Nacos并进行服务治理

    Nacos简介 Nacos 致力于帮助您发现 配置和管理微服务 Nacos 提供了一组简单易用的特性集 帮助您快速实现动态服务发现 服务配置 服务元数据及流量管理 Nacos其实就是一个注册中心 用来管理和注册微服务 搭建Nacos环境 安
  • VS Code插件推荐(一)

    1 Power Mode 炫酷的输入特效 2 Rainbow Theme 炫酷的字体颜色 让枯燥的代码多了一丝生机 3 koroFileHeader 趣味头文件注释 4 Chinese 汉化插件 5 Bracket Pair Coloriz
  • 智能人像处理-ON1 Portrait AI 2021.1 v15.1.0工具

    介绍 ON1 Portrait AI是一款人像AI智能处理软件 可以根据自身喜好对图像进行修复 重点是对人脸的一些修饰项目 虽然没有PS功能齐全 但对于人脸处理方面来说要更加细腻方便 可以一键优化人脸效果 只需使用ON1 Portrait
  • Intellij IDEA 生成Get/Set方法快捷键

    1 选中你要创建getter setter的字段 然后选择generator 可以拖选住你想要生成get set方法的属性 点击完成即可自动生成get和set方法 菜单栏 gt generator 或者 点击右键 gt generator
  • SQLServer导入导出excel及常见问题

    前几天考试系统导入导出学生信息 初次接触导入导出 为sqlserver和excel的数据传递方法之简和MS产品的高效兼容所震惊 但也遇到各种各样问题 在此介绍SQLServer导入导出excel方法及遇到的问题 SQLServer导出Exc
  • cmd 窗口 make clean process_begin: CreateProcess(NULL, rm Dynamics.o test.o, …) failed.

    CMD执行make clean报错 make clean rm Dynamics o test o process begin CreateProcess NULL rm Dynamics o test o failed make e 2
  • idea授权服务器

    这里提供一个我已经搭建好的idea授权服务器 http ysk521 cn 1017
  • JetBrains插件推荐

    JetBrains软件本身就是效率神器 配合上一些好用的插件 效率就更是飞升了 本文就简单记录一些好用的插件和简介 持续更新 安装方法都很简单 这里就不过多叙述了 实在不会就百度一下 Chinese Simplified Language
  • git从某个分支创建新分支

    如题 记录一下从某个分支创建新分支的方法 如从dev分支创建一个test分支 第一种 纯命令行的方式 第一步 切换到你指定的分支 如我要从dev上拉一个分支 代码一模一样 git checkout dev 第二步 拉取dev的最新代码 gi
  • 【CentOS 7.9】基于VMware虚拟机的详细安装教程

    一 下载CentOS 7 9 镜像文件 Linux版本大家自己选择 目前市面还是7 X版本用的多 这里我就以7 9版本为例进行演示 镜像下载地址 https mirrors tuna tsinghua edu cn centos 7 9 2
  • 中文汉字 hex十六进制 互转

    工具地址 http stool chinaz com hex
  • 相见恨晚的办公插件合集(二)

    之前有分享过一些办公的插件 如不坑盒子 打工人插件 易用宝等 下面就简单的介绍一下上面的几个神器后再补充一些其它办公神器吧 不坑盒子 word wps 这是一个非常好用的插件工具 专门应用在Word文档和wps 支持Office 2010以
  • 如何解决fiddler抓包时出现443的问题

    之前公司的app使用的http协议 因此不需要安装证书也能够转包 后来改成https协议后 在使用fiddler进行抓包时 一直出现tunnel to 443 百度了好久也没有具体的解决办法 后来发现需要在手机端安装fiddler的证书才行
  • 简单有效,如何彻底卸载删除AlibabaProtect.exe

    简单有效 如何彻底卸载删除AlibabaProtect exe Process Hacker https www isharepc com 33781 html

随机推荐