• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

mybatis 搞代码 4年前 (2022-01-09) 15次浏览 已收录 0个评论

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)
	}
	// 注<i style="color:transparent">本文来源gaodai$ma#com搞$$代**码)网8</i>意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)']

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Mybatis日志参数快速替换占位符工具的详细步骤

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址