码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Mybatis Druid日志拦截器


    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.bootgroupId>
    4. <artifactId>spring-boot-starter-webartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.bootgroupId>
    8. <artifactId>spring-boot-starter-testartifactId>
    9. <scope>testscope>
    10. dependency>
    11. <dependency>
    12. <groupId>org.mybatis.spring.bootgroupId>
    13. <artifactId>mybatis-spring-boot-starterartifactId>
    14. <version>2.2.2version>
    15. dependency>
    16. <dependency>
    17. <groupId>mysqlgroupId>
    18. <artifactId>mysql-connector-javaartifactId>
    19. <scope>runtimescope>
    20. dependency>
    21. <dependency>
    22. <groupId>com.alibabagroupId>
    23. <artifactId>druid-spring-boot-starterartifactId>
    24. <version>1.2.6version>
    25. dependency>
    26. dependencies>
    1. import java.sql.SQLException;
    2. import java.time.temporal.TemporalAccessor;
    3. import java.util.ArrayList;
    4. import java.util.Arrays;
    5. import java.util.List;
    6. import org.springframework.stereotype.Component;
    7. import com.alibaba.druid.DbType;
    8. import com.alibaba.druid.filter.FilterChain;
    9. import com.alibaba.druid.filter.FilterEventAdapter;
    10. import com.alibaba.druid.proxy.jdbc.JdbcParameter;
    11. import com.alibaba.druid.proxy.jdbc.ResultSetProxy;
    12. import com.alibaba.druid.proxy.jdbc.StatementProxy;
    13. import com.alibaba.druid.sql.SQLUtils;
    14. import com.alibaba.druid.util.StringUtils;
    15. @Component("sqlLogInterceptor")
    16. public class SqlLogInterceptor extends FilterEventAdapter {
    17. private static final SQLUtils.FormatOption FORMAT_OPTION = new SQLUtils.FormatOption(false, false);
    18. private static final List SQL_LOG_EXCLUDE = new ArrayList<>(Arrays.asList("ACT_RU_JOB", "ACT_RU_TIMER_JOB"));
    19. @Override
    20. protected void statementExecuteBefore(StatementProxy statement, String sql) {
    21. statement.setLastExecuteStartNano();
    22. }
    23. @Override
    24. protected void statementExecuteBatchBefore(StatementProxy statement) {
    25. statement.setLastExecuteStartNano();
    26. }
    27. @Override
    28. protected void statementExecuteUpdateBefore(StatementProxy statement, String sql) {
    29. statement.setLastExecuteStartNano();
    30. }
    31. @Override
    32. protected void statementExecuteQueryBefore(StatementProxy statement, String sql) {
    33. statement.setLastExecuteStartNano();
    34. }
    35. @Override
    36. protected void statementExecuteAfter(StatementProxy statement, String sql, boolean firstResult) {
    37. statement.setLastExecuteTimeNano();
    38. }
    39. @Override
    40. protected void statementExecuteBatchAfter(StatementProxy statement, int[] result) {
    41. statement.setLastExecuteTimeNano();
    42. }
    43. @Override
    44. protected void statementExecuteQueryAfter(StatementProxy statement, String sql, ResultSetProxy resultSet) {
    45. statement.setLastExecuteTimeNano();
    46. }
    47. @Override
    48. protected void statementExecuteUpdateAfter(StatementProxy statement, String sql, int updateCount) {
    49. statement.setLastExecuteTimeNano();
    50. }
    51. @Override
    52. public void statement_close(FilterChain chain, StatementProxy statement) throws SQLException {
    53. // 打印可执行的 sql
    54. String sql = statement.getBatchSql();
    55. // sql 为空直接返回
    56. if (StringUtils.isEmpty(sql)) {
    57. chain.statement_close(statement);
    58. return;
    59. }
    60. // sql 包含排除的关键字直接返回
    61. if (excludeSql(sql)) {
    62. chain.statement_close(statement);
    63. return;
    64. }
    65. int parametersSize = statement.getParametersSize();
    66. List parameters = new ArrayList<>(parametersSize);
    67. for (int i = 0; i < parametersSize; ++i) {
    68. // 转换参数,处理 java8 时间
    69. parameters.add(getJdbcParameter(statement.getParameter(i)));
    70. }
    71. String dbType = statement.getConnectionProxy().getDirectDataSource().getDbType();
    72. String formattedSql = SQLUtils.format(sql, DbType.of(dbType), parameters, FORMAT_OPTION);
    73. printSql(formattedSql, statement);
    74. chain.statement_close(statement);
    75. }
    76. private static Object getJdbcParameter(JdbcParameter jdbcParam) {
    77. if (jdbcParam == null) {
    78. return null;
    79. }
    80. Object value = jdbcParam.getValue();
    81. // 处理 java8 时间
    82. if (value instanceof TemporalAccessor) {
    83. return value.toString();
    84. }
    85. return value;
    86. }
    87. private static void printSql(String sql, StatementProxy statement) {
    88. // 打印 sql
    89. String sqlLogger = "\n\n============== Sql Start ==============" +
    90. "\nExecute SQL : %s" +
    91. "\nExecute Time: %d" +
    92. "\n============== Sql End ==============\n";
    93. String msg = String.format(sqlLogger, sql.trim(), statement.getLastExecuteTimeNano());
    94. System.err.println(msg);
    95. }
    96. private static boolean excludeSql(String sql) {
    97. // 判断关键字
    98. for (String exclude : SQL_LOG_EXCLUDE) {
    99. if (sql.contains(exclude)) {
    100. return true;
    101. }
    102. }
    103. return false;
    104. }
    105. }
    106.  

       

    107. 相关阅读:
      并发bug之源(一)-可见性
      Spring之@Qualifier注解简介及示例
      CM311-1a_CH_S905L3A_安卓9.0_纯净线刷固件包
      Nginx神奇的499竟然不在HTTP响应码标准内?快来了解一下!
      LVS+Keepalived
      数据分析---Python与sql
      ubuntu20.04 安装 pyconcorde
      剑指 Offer 55 - II. 平衡二叉树
      一名前端工程师自检清单与思考(来吧,干完这套清单年薪30不是梦)
      2022阿里巴巴全球数学竞赛 第4题 虎虎生威(盲盒问题、集卡问题)解决思路
    108. 原文地址:https://blog.csdn.net/qq_33335577/article/details/126858279
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号