springboot集成mybatis拦截器sql打印输出

简介: springboot集成mybatis拦截器sql打印输出

myabtis拦截器

package com.elite.demo1.util;

import java.text.DateFormat;

import java.util.Date;

import java.util.List;

import java.util.Locale;

import java.util.Properties;

import org.apache.ibatis.executor.Executor;

import org.apache.ibatis.mapping.BoundSql;

import org.apache.ibatis.mapping.MappedStatement;

import org.apache.ibatis.mapping.ParameterMapping;

import org.apache.ibatis.plugin.Interceptor;

import org.apache.ibatis.plugin.Intercepts;

import org.apache.ibatis.plugin.Invocation;

import org.apache.ibatis.plugin.Plugin;

import org.apache.ibatis.plugin.Signature;

import org.apache.ibatis.reflection.MetaObject;

import org.apache.ibatis.session.Configuration;

import org.apache.ibatis.session.ResultHandler;

import org.apache.ibatis.session.RowBounds;

import org.apache.ibatis.type.TypeHandlerRegistry;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

@Component

@Intercepts({

   @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }),

   @Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,

           RowBounds.class, ResultHandler.class }) })

public class MybatisInterceptor implements Interceptor {

  private static final Logger logger = LoggerFactory.getLogger(MybatisInterceptor.class);

  private Properties properties;

 

   @Override

   public Object intercept(Invocation invocation) throws Throwable {

       MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];

       Object parameter = null;

       if (invocation.getArgs().length > 1) {

           parameter = invocation.getArgs()[1];

       }

       String sqlId = mappedStatement.getId();

       BoundSql boundSql = mappedStatement.getBoundSql(parameter);

       Configuration configuration = mappedStatement.getConfiguration();

       Object returnValue = null;

       long start = System.currentTimeMillis();

       returnValue = invocation.proceed();

       long end = System.currentTimeMillis();

       long time = (end - start);

       if (time > 1) {

           String sql = getSql(configuration, boundSql, sqlId, time);

           logger.info(sql);

       }

       return returnValue;

   }

 

   public static String getSql(Configuration configuration, BoundSql boundSql, String sqlId, long time) {

       String sql = showSql(configuration, boundSql);

       StringBuilder str = new StringBuilder(100);

       str.append(":");

       str.append(sqlId);

       str.append(":执行的SQL语句为---->:");

       str.append(sql);

       str.append("\n----执行时间:");

       str.append(time);

       str.append("ms");

       return str.toString();

   }

 

   private static String getParameterValue(Object obj) {

       String value = null;

       if (obj instanceof String) {

           value = "'" + obj.toString() + "'";

       } else if (obj instanceof Date) {

           DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA);

           value = "to_date('" + formatter.format(obj) + "','yyyy-MM-dd hh24:mi:ss')";

       } else {

           if (obj != null) {

               value = obj.toString();

           } else {

               value = "";

           }

 

       }

       return value;

   }

 

   public static String showSql(Configuration configuration, BoundSql boundSql) {

       Object parameterObject = boundSql.getParameterObject();

       List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();

       String sql = boundSql.getSql().replaceAll("[\\s]+", " ");

       if (parameterMappings.size() > 0 && parameterObject != null) {

           TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();

           if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {

               sql = sql.replaceFirst("\\?", getParameterValue(parameterObject));

 

           } else {

               MetaObject metaObject = configuration.newMetaObject(parameterObject);

               for (ParameterMapping parameterMapping : parameterMappings) {

                   String propertyName = parameterMapping.getProperty();

                   if (metaObject.hasGetter(propertyName)) {

                       Object obj = metaObject.getValue(propertyName);

                       sql = sql.replaceFirst("\\?", getParameterValue(obj));

                   } else if (boundSql.hasAdditionalParameter(propertyName)) {

                       Object obj = boundSql.getAdditionalParameter(propertyName);

                       sql = sql.replaceFirst("\\?", getParameterValue(obj));

                   }

               }

           }

       }

       return sql;

   }

 

   @Override

   public Object plugin(Object target) {

       return Plugin.wrap(target, this);

   }

 

   @Override

   public void setProperties(Properties properties0) {

       this.properties = properties0;

   }

}

看到输出日志:

20200729195108602.png

相关文章
|
1月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
15天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
12天前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
45 1
|
21天前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
24 1
|
1月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
32 10
|
12天前
|
XML 存储 Java
SpringBoot集成Flowable:构建强大的工作流引擎
在企业级应用开发中,工作流管理是核心功能之一。Flowable是一个开源的工作流引擎,它提供了BPMN 2.0规范的实现,并且与SpringBoot框架完美集成。本文将探讨如何使用SpringBoot和Flowable构建一个强大的工作流引擎,并分享一些实践技巧。
32 0
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
92 1
|
1月前
|
存储 前端开发 Java
Spring Boot 集成 MinIO 与 KKFile 实现文件预览功能
本文详细介绍如何在Spring Boot项目中集成MinIO对象存储系统与KKFileView文件预览工具,实现文件上传及在线预览功能。首先搭建MinIO服务器,并在Spring Boot中配置MinIO SDK进行文件管理;接着通过KKFileView提供文件预览服务,最终实现文档管理系统的高效文件处理能力。
270 11
|
1月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
96 0
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
148 1

热门文章

最新文章