GithubHelp home page GithubHelp logo

kookob / mybatis-log-plugin Goto Github PK

View Code? Open in Web Editor NEW
363.0 11.0 149.0 78 KB

Restore mybatis sql log to original whole executable sql.

Home Page: https://plugins.jetbrains.com/plugin/13905-mybatis-log-plugin

License: Other

Java 100.00%
intellij-plugin mybatis mybatis-log

mybatis-log-plugin's Introduction

mybatis-log-plugin mybatis-log-plugin

MyBatis Log Plugin

插件功能

  • 还原MyBatis输出的日志为完整的SQL语句。
  • SQL日志里面的?替换为真正的参数值。
  • 选中要还原的MyBatis日志,右键点击菜单Restore Sql,还原SQL语句.
  • Java接口方法与Mapper xml文件互相跳转。

按钮作用

  • Text: 从文本内容还原SQL语句
  • Settings: 导航跳转开关,配置不想要输出的SQL语句
  • Format: 输出格式化过的SQL语句
  • Rerun: 重启插件
  • Stop: 停止插件

日志示例

MyBatis Log Test: DEBUG sql1 -  ==>  Preparing: select * from t_table where name = ?
MyBatis Log Test: DEBUG sql1 -  ==> Parameters: hello(String)
MyBatis Log Test: INFO sql2 -  ==>  Preparing: update t_table set name = ? where id = ?
MyBatis Log Test: INFO sql2 -  ==> Parameters: world(String), 123(Integer)
MyBatis Log Test: WARN sql3 -  ==>  Preparing: delete from t_table where id = ?
MyBatis Log Test: WARN sql3 -  ==> Parameters: 123(Integer)
MyBatis Log Test: ERROR sql4 - ==>  Preparing: select * from t_table order by id asc 
MyBatis Log Test: ERROR sql4 - ==>  Parameters: 

插件输出的完整的可执行的SQL语句如下:

--  1  MyBatis Log Test: DEBUG sql1 -  ==>
 select *
 FROM t_table
 WHERE name = 'hello';
------------------------------------------------------------
--  2  MyBatis Log Test: INFO sql2 -  ==>
 update t_table set name = 'world'
 WHERE id = 123;
------------------------------------------------------------
--  3  MyBatis Log Test: WARN sql3 -  ==>
 delete
 FROM t_table
 WHERE id = 123;
------------------------------------------------------------
--  4  MyBatis Log Test: ERROR sql4 - ==>
 select *
 FROM t_table order by id asc;

安装下载

mybatis-log-plugin.jar

价格

$5/year

插件文档

https://www.yuque.com/kookob/plugin
文档里面包含插件介绍,使用手册,购买流程,激活失败等说明。

其他插件

mybatis-log-plugin's People

Contributors

kookob avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mybatis-log-plugin's Issues

无法捕获

日志满足你所说的有:Preparing和Parameters,但插件无任何输出。

提issue的注意事项

大家提交issue时,如果有涉及到日志输出相关的,麻烦把当时的控制台输出内容一并粘贴上来,方便排查问题,如果没有及时粘粘,过后再重现当时的输出可能就不那么方便了。

涉及到的敏感内容,相应的做下替换

run/debug 工具条中的 插件图标无法移除

IntelliJ IDEA 2018.1.1 (Ultimate Edition)
Build #IU-181.4445.78, built on April 10, 2018
macOS 10.13.4

image
image
插件的这个图标即使从设置里面删除掉,界面上还是存在,而且很明显,这个插件的图标兼容性是存在问题的,移动这个图标的位置会导致界面显示的异常。

无法获取SQL

之前还可以捕捉到SQL,使用很好。今天突然不能用了,如下图:

qq 20181010112529

多线程打印SQL异常

多个线程输出mybatis日志时,SQL语句错位。
日志输出顺序:
thread1: Preparing
thread2: Preparing
thread1: Parameters
thread2: Parameters

sql print twice

when i execute one sql command,the plugin print sql twice
20191227095538
20191227095558

更新到2018.2.5存在的一些问题

大概作者已经发现这些小问题了,期待下一次更新

IDEA 版本:2018.2.5
插件版本:2.0.6

启用插件后在 Run Dashboard 中输出的日志不能自动滚动(Scroll to the end 失效)

异常信息类名无高亮显示,不可点击跳转定位。

禁用插件后恢复正常。

IntelliJ IDEA 2019.3.2 Unable Running

IntelliJ IDEA 2019.3.2 (Ultimate Edition)

java.lang.Throwable: Runner MyBatisLogPlugin is not registered
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:145)
at com.intellij.execution.ui.RunContentManagerImpl.getContentManagerForRunner(RunContentManagerImpl.java:472)
at com.intellij.execution.ui.RunContentManagerImpl.showRunContent(RunContentManagerImpl.java:260)
at com.intellij.execution.ui.RunContentManagerImpl.showRunContent(RunContentManagerImpl.java:252)
at mybatis.log.tail.TailContentExecutor.run(TailContentExecutor.java:153)
at mybatis.log.action.ShowLogInConsoleAction.showLogInConsole(ShowLogInConsoleAction.java:59)
at mybatis.log.action.TailMyBatisLog.actionPerformed(TailMyBatisLog.java:16)
at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:298)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:315)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:294)
at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:263)
at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:77)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:284)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:112)
at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:83)
at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransaction$1(TransactionGuardImpl.java:107)
at com.intellij.openapi.application.TransactionGuardImpl.submitTransaction(TransactionGuardImpl.java:116)
at com.intellij.openapi.application.TransactionGuard.submitTransaction(TransactionGuard.java:121)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:112)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:401)
at java.desktop/javax.swing.AbstractButton.doClick(AbstractButton.java:369)
at java.desktop/com.apple.laf.ScreenMenuItemCheckbox.itemStateChanged(ScreenMenuItemCheckbox.java:198)
at java.desktop/java.awt.CheckboxMenuItem.processItemEvent(CheckboxMenuItem.java:396)
at java.desktop/java.awt.CheckboxMenuItem.processEvent(CheckboxMenuItem.java:364)
at java.desktop/java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:375)
at java.desktop/java.awt.MenuComponent.dispatchEvent(MenuComponent.java:363)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:781)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:908)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:781)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:424)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:698)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:423)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

不支持sql中含有中文

当sql中含有中文,例如 :CASE WHEN status = 'REFUSE' THEN '拒绝' 时替换出来的sql是把 '拒绝' 替换成了参数

SQL太长被截断

原SQL语句的长度大概7200个字符,使用 Restore sql from text 功能格式化SQL的时候,输出的结果只有1800多个字符了,后面的字符都被截断了。

SQL来源只能是控制台输出吗

首先很喜欢作者的这个插件,本地调试很方便,但是我更多的痛点问题是把项目发布到服务器上,sql都在日志里,作者能否提供一个输入框让我直接粘贴进来?

最后先给个star,持续关注下

这样的格式识别不出来

这样的格式识别不出来

2018-04-18 13:43:55
[DEBUG]-[Thread: http-apr-8080-exec-2]-[org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug()]: ==>  Preparing: SELECT count(0) FROM p_ordrer WHERE 1 = 1 AND user_id = ? AND is_delete != 1 AND order_status = ? AND logistic_status = ? 

2018-04-18 13:43:55
[DEBUG]-[Thread: http-apr-8080-exec-2]-[org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug()]: ==> Parameters: 1(String), W(String), LW(String)

sql log 控制台遮挡database console 输出

sql log的控制台窗口的优先级比自带的database console优先级更高;

1.ctrl+shift+alt+o 呼出mybatis sql log console
2.输出解析的sql
3.idea db插件执行sql,explain
4.explain结果显示在database console中,但是被sql log console遮挡住

插件不起作用

Mybatis sql log如图

没有将“?”进行恢复

log 日志

sql打印log已包含"Preparing:"和"Parameters:"
按照动图示例,选中console的sql日志,右击 "Restore Sql from Selection"还是不能还原

Restore Sql from Selection进行还原

支持格式不全

可能是因为版本问题吧,我这里输出的不是Preparing:和Executing:
而是Preparing Statement:和Executing Statement:
是否能支持一下呢。

IDEA 2019版本支持吗?

IDEA 2018.03的时候还可以用,最近更新到2019版本了,什么都打印不出来了,不知道为什么

Can't restore sql from selection

IDEA 2018.1.4
插件版本:2.0.7
开发环境:Mybatis 3.4.6+Mybatis Plus 3.0.6+log4j2 2.11.1

配置Mybatis的日志为LOG4J2,并向控制台输出
1
2

点击Close后抛出NPE

IDEA 版本:2018.2.3
插件版本:2.0.4

程序运行期间,点击 Close 关闭 mybatis-log 的窗口后抛出 NPE

异常信息:

update failed for ActionGroup: Format Sql (Format Sql)[Format Sql]

java.lang.NullPointerException
	at mybatis.log.MyBatisLogConfig.getConfigVo(MyBatisLogConfig.java:23)
	at mybatis.log.tail.TailContentExecutor$FormatAction.isSelected(TailContentExecutor.java:248)
	at com.intellij.openapi.actionSystem.ToggleAction.update(ToggleAction.java:65)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareUpdate(ActionUtil.java:136)
	at com.intellij.openapi.actionSystem.impl.Utils.doUpdate(Utils.java:256)
	at com.intellij.openapi.actionSystem.impl.Utils.expandActionGroup(Utils.java:199)
	at com.intellij.openapi.actionSystem.impl.ActionToolbarImpl.updateActionsImpl(ActionToolbarImpl.java:1100)
	at com.intellij.openapi.actionSystem.impl.ActionToolbarImpl.access$000(ActionToolbarImpl.java:53)
	at com.intellij.openapi.actionSystem.impl.ActionToolbarImpl$2.updateActionsImpl(ActionToolbarImpl.java:175)
	at com.intellij.openapi.actionSystem.impl.ToolbarUpdater$MyUpdateRunnable.run(ToolbarUpdater.java:186)
	at com.intellij.openapi.actionSystem.impl.ToolbarUpdater.updateActions(ToolbarUpdater.java:101)
	at com.intellij.openapi.actionSystem.impl.ToolbarUpdater.updateActions(ToolbarUpdater.java:93)
	at com.intellij.openapi.actionSystem.impl.ActionToolbarImpl.updateActionsImmediately(ActionToolbarImpl.java:1093)
	at com.intellij.openapi.actionSystem.impl.ActionButton.performAction(ActionButton.java:163)
	at com.intellij.openapi.actionSystem.impl.ActionButton.processMouseEvent(ActionButton.java:388)
	at java.awt.Component.processEvent(Component.java:6298)
	at java.awt.Container.processEvent(Container.java:2237)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2295)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4889)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4526)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4467)
	at java.awt.Container.dispatchEventImpl(Container.java:2281)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:781)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:718)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

虽然此异常并不影响使用~

当SQL有换行的时候会提示SQL错误

[DEBUG][2018/04/09 17:38:04][http-nio-7001-exec-7] (BaseJdbcLogger.java:159) - ==> Preparing: insert into sql_execute_fact ( hash_code, sql_scripts, sql_type, execute_time, result_size, created_at ) values ( ?, ?, ?, ?, ?, ? )
[DEBUG][2018/04/09 17:38:04][http-nio-7001-exec-7] (BaseJdbcLogger.java:159) - ==> Parameters: d26e232643e79e6dd00f73a3dc770684(String), H4sIAAAAAAAAAIWMywrCMBBFf+XuWiHgY+vHDDGMTcGZSDIx5u+rhSKC4PJezjmFbxwMpcqo3Cjz
RFplB1/QD+7rb7NFeg9jLx/q6PAH2/+snxxC0uCNWhmHwcEiU2efHYSCknrhlXwC15wEW+FlPTgb
ppzqHZe+ipLU4nkBWJrAG84AAAA=(String), 0(Integer), 62(Long), 442(Long), 2018-04-09 17:38:04.761(Timestamp)

image

154 restore sql from selection - ==>
insert into sql_execute_fact ( hash_code, sql_scripts, sql_type, execute_time, result_size, created_at ) values ( 'd26e232643e79e6dd00f73a3dc770684', H4sIAAAAAAAAAIWMywrCMBBFf+XuWiHgY+vHDDGMTcGZSDIx5u+rhSKC4PJezjmFbxwMpcqo3Cjz, error, error, error, error );
---This is an error sql!---

image

谢谢 ^_^

SQL太长被截断

原SQL语句的长度大概7200个字符,使用 Restore sql from text 功能格式化SQL的时候,输出的结果只有1800多个字符了,后面的字符都被截断了。

无法自动识别sql

项目启动或者debug,插件都识别不出sql。但手工进行转换可以。

日期类型参数,输出后的sql无法执行,oracle数据库

生成的sql语句 截取部分
AND ts.order_date >= '2019-03-10 00:00:00.0'
AND ts.order_date < '2019-04-10 23:59:59.0'

执行报错
ORA-01861: literal does not match format string

转换后可执行
AND ts.order_date >= to_date('2019-03-10 00:00:00' , 'yyyy-mm-dd hh24:mi:ss')
AND ts.order_date < to_date('2019-04-10 23:59:59' , 'yyyy-mm-dd hh24:mi:ss')

oracle版本
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.