使用JS解析idea控制台SQL日志——JS版MybatisLogPlugin

 由于idea升级到了20.3版本,新版的Mybatis Log Plugin插件要收费,遂参照网上代码,修改了一下,产生如下js替换版本。

功能:将idea控制台输出的 sql日志 转化为 sql语句 。支持同时解析多条sql语句。

示例:

: ==>  Preparing: update sys_config set v=? where id=? 
2021-09-03 11:18:00.054 DEBUG 7428 --- [pool-2-thread-1] c.w.p.b.m.ConfigMapper.editFilePath      : ==> Parameters: 2021-09-03 11:23:00(String), B22B3AB2-E88B-A432-E050-0A0A18230287(String)
2021-09-03 11:18:00.056 DEBUG 7428 --- [pool-2-thread-1] c.w.p.b.m.ConfigMapper.editFilePath      : <==    Updates: 2

结果: 

update sys_config set v='2021-09-0311:23:00' where id='B22B3AB2-E88B-A432-E050-0A0A18230287' 

页面效果如下:

如何使用?

新建一个html页面,放入以下代码,保存为html文件,使用浏览器在本地打开该html文件,即可使用。

HTML文件代码:  

<!DOCTYPE html>
<html lang="en" style="background: #40434e">
<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>
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <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;
        }
        .el-textarea__inner {
            background: #40434e;
            color: deepskyblue;
        }
    </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="multiConvert" style="height: 50px; width: 80px;">转换</el-button>
    <el-button type="info" @click="res=''" style="height: 50px; width: 80px;">重置</el-button>
    <el-checkbox v-model="checked">自动重置</el-checkbox>
    <el-input ref="res" type="textarea" v-model="res" placeholder="输出结果"
              :rows="28" style="width: 600px"></el-input>
</div>

<script type="text/javascript">
    const SQL_PRE = 'Preparing: '
    const PARAM_PRE = 'Parameters: '
    var app = new Vue({
        el: '#app',
        data() {
            return {
                // 原始str
                pre: '',
                // 输出结果
                res: '',
                checked: true
            }
        },
        methods: {
            multiConvert() {
                if (this.checked) this.res = ''
                let text = this.pre
                let mybatisSQLList = []
                while (text.lastIndexOf(SQL_PRE) !== -1) {
                    // 尾部截取,从数组的头部添加
                    mybatisSQLList.unshift(text.substring(text.lastIndexOf(SQL_PRE)));
                    text = text.substring(0, text.lastIndexOf(SQL_PRE));
                }
                console.log(mybatisSQLList);
                if (mybatisSQLList.length === 0) {
                    this.$message.error(`解析失败!请将${SQL_PRE}和${PARAM_PRE}语句行完整复制进来`)
                }
                mybatisSQLList.forEach(item => {
                    this.convert(item)
                })
                this.copyRes()
            },
            convert(str) {
                // str为完整的三行或两行mybatisSQL
                if (str.indexOf(SQL_PRE) === -1 || str.indexOf(PARAM_PRE) === -1) {
                    this.$message.error(`请将${SQL_PRE}和${PARAM_PRE}语句行完整复制进来`)
                }
                // 提取预编译语句行
                let prepare = str.substring(str.indexOf(SQL_PRE) + SQL_PRE.length, str.indexOf('\n'))
                // 获取参数行
                let params = str.substring(str.indexOf(PARAM_PRE) + PARAM_PRE.length, str.indexOf('\n', str.indexOf(PARAM_PRE)))
                // 参数数组
                let array = params.replace(/ /g, '').split(',')
                // 循环替换占位符,字符串方式替换每次替换第一个
                array.forEach(item => {
                    // 获取参数值
                    let value = item.substring(0, item.indexOf('('))
                    // 获取参数类型
                    const type = item.substring(item.indexOf('(') + 1, item.indexOf(')'))
                    if ('String' === type) {
                        value = "'" + value + "'"
                    }
                    prepare = prepare.replace('?', value)
                })
                this.res += prepare + '\n\n\n'
            },
            copyRes() {
                // 确保复制成功,延时执行
                setTimeout(() => {
                    if (this.res.length === 0) return
                    this.$refs.res.select()
                    document.execCommand('copy')
                    this.$message.success('SQL已复制到剪切板!')
                }, 1)
            }
        }
    })
</script>
</body>
</html>

新的想法,可以利用mybatis拦截器拦截sql,直接转换sql打印到log。就省去了粘贴的过程。可能会增加性能消耗。

新的想法实现:SpringBoot通过MyBatis拦截器打印完整SQL语句(无问号)_hunt_er的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值