码农知识堂 - 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. 相关阅读:
      log4j日志漏洞问题
      MySQL——锁
      STM32WB55开发(4)----配置串口打印Debug调试信息
      做一个贪吃蛇小游戏happy一下
      Java数据类型转换:强制类型转换+自动类型转换
      完全背包问题 —— 贪心优化 DP 范围
      安装npm包时出现依赖树错误的解决办法
      LeetCode·20.有效的括号·栈模拟
      Vue3中的几个坑,你都见过吗?
      易基因: Nature Biotech:番茄细菌性青枯病的噬菌体联合治疗|国人佳作
    108. 原文地址:https://blog.csdn.net/qq_33335577/article/details/126858279
      • 最新文章
      • 沪漂五周年了:我越来越迷茫了
        Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
        MySQL-Seconds_behind_master的精度误差
        [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
        AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
        Agent OS :五种驯服不确定性的范式
        PortSwigger SQL注入LAB11
        数据库即时编译JIT
        [Begin]AI Learn Data Day 0
        深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      小工具 小游戏
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

      京公网安备 11010502049817号