技术分享:MyBatis SQL 日志解析脚本

ops/2025/2/24 21:25:26/

技术分享:MyBatis SQL 日志解析脚本

  • 1. 脚本功能概述
  • 2. 实现细节
    • 2.1 HTML 结构
    • 2.2 JavaScript 逻辑
  • 3. 脚本代码
  • 4. 使用方法
    • 4.1 示例
  • 5. 总结

在日常开发中,使用 MyBatis 作为持久层框架时,我们经常需要查看 SQL 日志以调试和优化查询。然而,MyBatis 的日志输出通常包含占位符和参数信息,这使得直接执行这些 SQL 语句变得困难。为了解决这个问题,我们开发了一个简单的 HTML 和 JavaScript 脚本,用于解析 MyBatis 的 SQL 日志并生成可执行的 SQL 语句。

1. 脚本功能概述

该脚本的主要功能是:

  1. 解析 SQL 日志:从 MyBatis 日志中提取 SQL 语句和参数。
  2. 参数替换:将 SQL 语句中的占位符 ? 替换为实际的参数值。
  3. 生成可执行 SQL:输出完整的 SQL 语句,便于在数据库中直接执行。

2. 实现细节

2.1 HTML 结构

脚本的 HTML 部分提供了一个简单的用户界面,包含输入区域、解析按钮和输出区域。

  • 输入区域:用户可以在此粘贴 MyBatis 的 SQL 日志。
  • 解析按钮:点击后触发 JavaScript 函数进行解析。
  • 输出区域:显示解析后的可执行 SQL 语句。

2.2 JavaScript 逻辑

JavaScript 部分实现了日志解析的核心逻辑:

  • 日志分割:通过换行符将日志分割为多行,逐行处理。
  • SQL 语句提取:识别包含 Preparing: 的行,提取 SQL 语句。
  • 参数解析:识别包含 Parameters: 的行,提取参数并根据类型进行处理。
    • 字符串和时间戳:用单引号包裹,处理转义字符。
    • 空值:替换为 NULL
    • 其他类型:直接替换。
  • 结果输出:将替换后的 SQL 语句显示在输出区域。

3. 脚本代码

创建一个.html文件,编辑,将脚本内容贴至文件内,保存,用浏览器打开文件即可使用

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Mybatis SQL日志解析</title><script type="text/javascript">javascript">function f(obj) {try {var textVa = obj.value;var logs = textVa.split('\n'); // Split by newlinevar results = [];var currentStatement = null;logs.forEach(function(log) {// Check if this line contains "Preparing:" or "Parameters:"if (log.indexOf('Preparing:') !== -1) {if (currentStatement !== null) {// If we have a current statement, push it to the resultsresults.push(currentStatement);}// Start a new statementcurrentStatement = log.substring(log.indexOf('Preparing:') + "Preparing:".length).trim();} else if (log.indexOf('Parameters:') !== -1 && currentStatement !== null) {// If we find parameters and have a current statement, parse the parametersvar parametersStr = log.substring(log.indexOf('Parameters:') + "Parameters:".length).trim();var parameters = parametersStr.split(/,(?![^()]*\))/g); // Use regex to split correctlyfor (var i = 0; i < parameters.length; i++) {var paramValue = parameters[i].trim();if (paramValue === "null") {currentStatement = currentStatement.replace("?", "NULL");} else {var typeStr = paramValue.substring(paramValue.indexOf("(") + 1, paramValue.indexOf(")"));paramValue = paramValue.substring(0, paramValue.indexOf("(")).trim();if (typeStr === "String" || typeStr === "Timestamp") {paramValue = "'" + paramValue.replace("'", "''") + "'";}currentStatement = currentStatement.replace("?", paramValue);}}// Add the final statement to the results and reset currentStatementresults.push(currentStatement);currentStatement = null;}});// If there's a remaining statement, push it to the resultsif (currentStatement !== null) {results.push(currentStatement);}document.getElementById("d1").value = results.join("\n\n");} catch (e) {console.error(e);alert("解析SQL时发生错误:" + e.message);}}function copySQL() {var SQL = document.getElementById("d1");navigator.clipboard.writeText(SQL.value).then(function() {var msg = document.getElementById("msg");msg.innerHTML = "已复制到剪切板";setTimeout(function () {msg.innerHTML = "";}, 3000);}).catch(function(err) {console.error("复制失败:", err);alert("复制SQL时发生错误:" + err.message);});}function clearLog(obj) {obj.value = "";}</script>
</head>
<body><h2><font color="#00bfff"> 输入Mybatis SQL日志:</font></h2>
<textarea id="sqlLog" rows="12" cols="140" style="font-size:12px;font-family: 'CourierNew';font-weight: bold;width: 98%;"></textarea>
<div style="border:0px deepskyblue solid;width:1425px;height:50px;text-align:right;"><button style="color:mediumblue;width:100px;height:60px" type="button" onclick="javascript language-javascript">clearLog(document.getElementById('sqlLog'))">清空</button><button style="color:mediumblue;width:100px;height:60px" type="submit" onclick="javascript language-javascript">f(document.getElementById('sqlLog'))">解析SQL</button>
</div><h2><font color="#32cd32">解析为可执行SQL:</font></h2>
<textarea id="d1" rows="12" cols="140" style="font-size:12px;font-family: 'CourierNew';font-weight: bold;width: 98%;"></textarea>
<div style="border:0px deepskyblue solid;width:1425px;height:50px;text-align:right;"><button style="color:mediumblue;width:100px;height:60px" type="button" onclick="javascript language-javascript">copySQL()">复制SQL</button>
</div><div id="msg" style="color:cornflowerblue;border:0px black solid;width:800px;height:20px;text-align:right;font-style: initial;font-size: large"></div></body>
</html>

4. 使用方法

  1. 将 MyBatis 的 SQL 日志粘贴到输入区域。
  2. 点击"解析SQL"按钮。
  3. 在输出区域查看并复制解析后的 SQL 语句。

4.1 示例

假设输入的日志为:

Preparing: INSERT INTO users (name, email) VALUES (?, ?)
Parameters: John(String), null

解析后的输出为:

INSERT INTO users (name, email) VALUES ('John', NULL)

在这里插入图片描述

5. 总结

通过这个简单的脚本,我们可以快速将 MyBatis 的 SQL 日志转换为可执行的 SQL 语句,极大地方便了开发和调试工作。希望这个工具能对你有所帮助!


http://www.ppmy.cn/ops/161046.html

相关文章

Docker入门及基本概念

让我们从最基础的概念开始逐步理解。假设你已经准备好了docker 环境。 第一步&#xff0c;让我们先通过实际操作来看看当前系统中的镜像(images)和容器(containers)状态&#xff1a; docker images # 查看所有镜像 docker ps -a # 查看所有容器&#xff08;包括未运行…

postman调用ollama的api

按照如下设置&#xff0c;不需要设置key 保持长会话的方法 # 首次请求 curl http://localhost:11434/api/generate -d {"model": "deepseek-r1:32b","prompt": "请永久记住&#xff1a;110&#xff0c;1-12&#xff0c;之后所有数学计算必…

QT 基础知识点

1.基础窗口类QMainWindow qDialog Qwidget 随项目一起创建的窗口基类有三个可选QMainWindow qDialog Qwidget 1.1 Qwidget 是所有窗口的基类&#xff0c;只要是他的子类&#xff0c;或子类的子类&#xff0c;都具有他的属性。 右键项目 Add New -> Qt qt设计师界面类&am…

FTP 实验(ENSP模拟器实现)

FTP 概述 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型&#xff0c;客户端通过FTP客户端软件&#xff0c;连接到FTP服务…

重学SpringBoot3-Spring Retry实践

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-Spring Retry实践 1. 简介2. 环境准备3. 使用方式 3.1 注解方式 基础使用自定义重试策略失败恢复机制重试和失败恢复效果注意事项 3.2 编程式使用3.3 监听重试过程 监…

计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

go json处理 encoding/json 查询和修改gjson/sjson

推荐 标准库encoding/json import ("encoding/json""log" )// Student1 注意点&#xff1a; // 1. 注意alain别名的写法&#xff1a; json:"name1" 而非 "json:name1" // 2. 注意json.Marshal的时候只输出首字母大写的属性 // 3. jso…

机器视觉--Halcon的数据结构(数组)

引言 在机器视觉领域&#xff0c;Halcon 作为一款功能强大且广泛应用的软件&#xff0c;其丰富的数据结构为开发者提供了高效处理各种视觉任务的能力。数组作为其中一种基础且重要的数据结构&#xff0c;在 Halcon 中扮演着不可或缺的角色。它能够有序地存储多个相同类型的数据…