Mybatis日志参数快速替换占位符工具的详细步骤

Mybatis log printf工具网页地址: http://www.feedme.ltd/log.html

Mybatis执行的sql的打印格式为:

2020-08-04 09:16:44 -DEBUG - [io-8888-exec-5] .mapper.operation.OperationMapper.insert.        debug 145 : ==>  Preparing: INSERT INTO tulu.t_log_operation (id, module, module_description, type, method, operator, operate_time) VALUES (?, ?, ?, ?, ?, ?, unix_timestamp(now()))
2020-08-04 09:16:44 -DEBUG - [io-8888-exec-5] .mapper.operation.OperationMapper.insert.        debug 145 : ==> Parameters: 2743672230717162752(Long), 1(Integer), 登录(String), 3(Integer), com.simba.tuloosa.controller.auth.LoginController.nativeLogin(String), 6d63b98cbe5e42d18c126da149162404(String)
2020-08-04 09:16:44 -DEBUG - [io-8888-exec-5] .mapper.operation.OperationMapper.insert.        debug 145 : <==    Updates: 1

IDEA里有一个插件Mybatis log plugin可以帮我们快速的提取参数拼成完整的SQL语句执行,以快速排错,但是很可惜,他是收费的ε=(´ο`*)))唉,整来整取也没法破解,算了,不如自己写一个挂到公网上,也能复制sql随时拼接,纯js即可。

下面我们来逐步分析一下需要的步骤:

  1. 首先需要提取出preparedStatement语句
  2. 提取出所有的参数,String类型还需要手动添加引号
  3. 将statement中的占位符?替换为对应的参数

很简单吧,就这三步即可。接下来动手操作。

1、提取statement:只需截取从Preparing到行尾的\n即可

// str为完整的三行或两行SQL 提取预编译语句
let prepare = str.substring(str.indexOf('Preparing') + 11, str.indexOf('\n'))

indexOf(str: string):提取第一个匹配到的字符串的位置,返回其索引值

2、提取参数:只需截取从Parameters到其行尾的\n即可

这时我们需要提取到str的第二个\n换行符,怎么提取某个字符串中的第n个字符串呢?

indexOf()函数在js中是有重载的,默认提取第一个匹配的。它可以接受第二个参数,可以传入一个起始位置,即从position(索引)开始取第一个匹配的。

// js api
indexOf(searchString: string, position?: number): number;

分析:取第二个\n,我们可以将第一个\n的索引传入再加1;取第三个\n,则将第二个\n的索引传入加1,以此类推,所以这是一个递归函数,实现如下

// 返回字符串str中的第n字符串reg在str中的索引值index
function index(str, reg, n) {
	if (!str || !reg || n <= 0) return -1
	// 先求出第一个,再递归n-1
	if (n === 1) {
		return str.indexOf(reg)
	}
	// 注意n-1的索引后一定要加1,负责会一直是第一个reg的索引
	return str.indexOf(reg, index(str, reg, n - 1) + 1)
}

接下来先测试一下index函数,打印正确

const str = 'hello world ok'
const reg = '0'
console.log(index(str, reg, 3)) // 求第三个o的索引,打印结果是12,正确

完成函数提取,所以回到上面的步骤,继续提取第二个\n的位置

// 获取参数字符串,去掉所有空格
const params = str.substring(str.indexOf('Parameters') + 12, index(str, '\n', 2)).replace(/ /g, '')

获取参数后以逗号切割,返回是一个字符串参数数组

const array = params.split(',')
// ['2743672230717162752(Long)','1(Integer)','登录(String)','3(Integer)']

提取完毕,则进行第三步的替换

3、替换参数

// 遍历数组,每次调用一次replace(old, new)即可,对字符串参数需要加上引号
array.map(item => {
	// 获取每个参数值
	let newValue = item.substring(0, item.indexOf('('))
	// 获取参数类型
	const type = item.substring(item.indexOf('(') + 1, item.indexOf(')'))
	if ('String' === type) {
		newValue = "'" + newValue + "'"
	}
	prepare = prepare .replace('?', newValue)

})
// 遍历完毕,所有的占位符也就被参数替换完成啦
console.log(prepare)
// INSERT INTO tulu.t_log_operation (id, module, module_description, type, method, operator, operate_time) VALUES (2743672230717162752, 1, '登录', 3, 'com.simba.tuloosa.controller.auth.LoginController.nativeLogin', '6d63b98cbe5e42d18c126da149162404', unix_timestamp(now())) 

这样我们就实现了整个的js遍历、寻找、替换逻辑,整个过程就是不停的去indexOf(),substring()和replace(),是不是很简单呢,手写一个就不用了去找插件了。

我把这个网页放在了我的公网服务器上,访问地址是http://www.feedme.ltd/log.html
方便直接打开使用。

另外懒得写样式和DOM,所以在线引用了vue.js和elemenui,可能会出现有时候加载js文件速度比较慢的情况。

最后贴出整个HTML代码:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8" />
 <title>Mybatis Log Helper</title>
 <meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" />
 <link rel="shortcut icon" href="" />
 <script src="https://unpkg.com/vue@2.6.11/dist/vue.js"></script>
 <!-- 引入样式 -->
 <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" rel="external nofollow" >
 <!-- 引入组件库 -->
 <script src="https://unpkg.com/element-ui/lib/index.js"></script>
 <style>
 #app {
 margin-top: 70px;
 display: flex;
 justify-content: space-evenly;
 align-items: center;
 font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
 }
 </style>
</head>
<body>
 <div id="app">
 <el-input type="textarea" v-model="pre" placeholder="请复制输入Mybatis打印的日志,须完整Prepareing语句和Parameter语句"
  :rows="28" style="width: 600px"></el-input>
 <el-button type="success" @click="convert" style="height: 60px; width: 80px;">转换</el-button>
 <el-input type="textarea" v-model="res" placeholder="输出结果"
  :rows="28" style="width: 600px"></el-input>
 </div>

 <script type="text/javascript">
 const app = new Vue({
 el: '#app',
 data() {
 return {
  // 原始str
  pre: '',
  // 输出结果
  res: ''
 }
 },
 methods: {
 convert() {
  const str = this.pre
  if (str.indexOf('Preparing') == -1 || str.indexOf('Parameters') == -1) {
  this.$message({
  message: '请将Preparing和Parameters语句复制进来',
  type: 'error',
  center: true
  })
  }
  // str为完整的三行或两行SQL 提取预编译语句
  let prepare = str.substring(str.indexOf('Preparing') + 11, str.indexOf('\n'))
  // 获取参数,去空格
  const params = str.substring(str.indexOf('Parameters') + 12, index(str, '\n', 2)).replace(/ /g, '')
  // 参数数组
  const array = params.split(',')
  // 循环替换占位符,字符串方式替换每次替换第一个
  array.map(item => {
  // 获取每个参数值
  let newValue = item.substring(0, item.indexOf('('))
  // 获取参数类型
  const type = item.substring(item.indexOf('(') + 1, item.indexOf(')'))
  if ('String' === type) {
  newValue = "'" + newValue + "'"
  }
  prepare = prepare .replace('?', newValue)

  })
  this.res = prepare
 }
 }
 })

 // 返回字符串str中的第n字符串reg在str中的索引值index
 function index(str, reg, n) {
 if (!str || !reg || n <= 0) return -1
 // 先求出第一个,再递归n-1
 if (n === 1) {
 return str.indexOf(reg)
 }
 // 注意n-1的索引后一定要加1,负责会一直是第一个reg的索引
 return str.indexOf(reg, index(str, reg, n - 1) + 1)
 }
	// 测试index函数
 const str = 'hello world ok'
 const reg = 'o'
 console.log(index(str, reg, 3))
 </script>
</body>
</html>

总结

到此这篇关于Mybatis日志参数快速替换占位符工具的文章就介绍到这了,更多相关Mybatis日志参数替换占位符内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring及Mybatis整合占位符解析失败问题解决

    问题:写了一个新的dao接口,进行单元测试时提示: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'maxActive'; nested exceptio

  • Mybatis日志参数快速替换占位符工具的详细步骤

    Mybatis log printf工具网页地址: http://www.feedme.ltd/log.html Mybatis执行的sql的打印格式为: 2020-08-04 09:16:44 -DEBUG - [io-8888-exec-5] .mapper.operation.OperationMapper.insert.        debug 145 : ==>  Preparing: INSERT INTO tulu.t_log_operation (id, module, mod

  • Mybatis打印替换占位符后的完整Sql教程

    利用mybtis插件打印完整的sql,将占位符?替换成实际值 import org.apache.ibatis.cache.CacheKey; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.Paramete

  • 在MyBatis中使用 # 和 $ 书写占位符的区别说明

    #将传入的数据都当成一个字符串,会对传入的数据自动加上引号: $将传入的数据直接显示生成在SQL中 注意:使用 $ 占位符可能会导致SQL注入攻击,能用#的地方就不要使用 $ 写order by 子句的时候应该用 $ 而不是# 补充知识:mybatis 中生成的字段不带引号 #{}和${} 最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"",比如 sel

  • Python开发.exe小工具的详细步骤

    v1.0.0 完成基础框架.初始功能 背景:为了提高日常工作效率.学习界面工具开发,可以将一些常用的功能集成到一个小的测试工具中,供大家使用. 一.环境 Python3,pyinstall pyinstall安装: pip install pyinstaller   (会自动下载future,pywin32,pyinstaller) 或者采用国内镜像 pip install -i https://pypi.douban.com/simple/ pyinstaller(豆瓣源) 二.代码准备,直接

  • 在Docker快速部署Node.js应用的详细步骤

    一.前言 可能还有一些同学不了解docker这个项目,docker是由go语言编写的,一个快速部署的轻量级虚拟技术项目,他允许开发人员将自己的程序和运行环境一起打包,制作成一个docker的image(镜像),这样部署到服务器上,也只需要下载这个image就可以将程序跑起来,免去每次都安装各种依赖和环境的麻烦,还能够做到应用程序之间的隔离 二.实现准备 我会先创建一个简单的Node.js web app,来构建一个镜像.然后基于这个Image运行一个container.从而实现快速部署. 由于网

  • Python3安装pip工具的详细步骤

    前几天安装Python的时候没有装上pip工具,所以只能现在手动安装了. 首先,访问https://bootstrap.pypa.io/get-pip.py这个网址,然后Ctrl+S将get-pip.py文件 保存到你所安装的Python的Scripts目录下: 然后进入Scripts目录,并在该目录下输入cmd,进入cmd界面: 在命令行界面输入python get-pip.py,pip3工具就会自动安装: 安装成功之后输入python -m pip --version, 确保成功安装了pip

  • linux服务器安装SonarQube代码检测工具的详细步骤

    目录 背景 注意(重点) 步骤 1.安装jdk 2.安装配置mysql5.7 3.安装SonarQube 4.配置数据库和SonarQube 5.安装中文语音包 背景 最近公司技术大佬同事告知,sonarlint可以用来检测代码是否有问题,并且能将其集成到Jenkins里面.本着好奇的心思来研究了一下,花了点时间将其在linux服务器上搭建完毕,网上可以查到的文章和教程资料并不少,但是很多写的不是很完美,会很容易踩坑,所以这里把本次成功的步骤记录下,并且把安装前注意的点接下来介绍下. 注意(重点

  • MyBatis中#{}占位符与${}拼接符的用法说明

    1.关于#{}占位符 先来看以下的示例,该示例是MyBatis中的SQL映射配置文件(Mapper配置文件),在该配置中使用了#{}占位符. <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mappe

  • .properties文件读取及占位符${...}替换源码解析

    前言 我们在开发中常遇到一种场景,Bean里面有一些参数是比较固定的,这种时候通常会采用配置的方式,将这些参数配置在.properties文件中,然后在Bean实例化的时候通过Spring将这些.properties文件中配置的参数使用占位符"${}"替换的方式读入并设置到Bean的相应参数中. 这种做法最典型的就是JDBC的配置,本文就来研究一下.properties文件读取及占位符"${}"替换的源码,首先从代码入手,定义一个DataSource,模拟一下JDB

  • Java实现占位符名称替换值

    目录 前言 代码 原理 前言 占位符现在应该说是比较流行的动态赋值,方法有String.format(),通过%s或其他来赋值:或者MessageFormat.format(),通过{0}来赋值,参数名都不可定义 项目中有个需求,根据一串带着参数名占位符的url,替换掉对应参数名的值,由此有了以下的工具类. 代码 import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public

随机推荐