• mybatis使用拦截器显示sql,使用druid配置连接信息


    mybatis使用拦截器显示sql,使用druid配置连接信息

    1、显示出sql内容:

    新建2个类:
    MybatisInterceptor ;拦截sql,并获得输出sql内容

    package com.cpp.core.filter;
    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 com.cpp.core.common.utils.SQLFormatter;
     
    @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 Logger logger = LoggerFactory.getLogger(MybatisInterceptor.class);
        private Properties properties;
     
        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("调用的java方法为:
     "+sql.split(":")[0]);
                logger.info("查询sql语句为:
    "+SQLFormatter.format(sql.split(":")[1])  +"
    "+"sql语句执行的时间:"+time+"
    
    ");
            }
            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(sqlId);
            str.append(":");
            str.append(sql);
            str.append(":");
            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 = "'" + formatter.format(new Date()) + "'";
            } 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;
        }
     
        public Object plugin(Object target) {
            return Plugin.wrap(target, this);
        }
     
        public void setProperties(Properties properties0) {
            this.properties = properties0;
        }
    }
    

    2、在新建sql格式化工具,格式化sql语句

    package com.cpp.core.filter;
    import java.util.Properties;
    import org.apache.ibatis.executor.Executor;
    import org.apache.ibatis.mapping.MappedStatement;
    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.session.ResultHandler;
    import org.apache.ibatis.session.RowBounds;
    @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 SqlStatementInterceptor implements Interceptor{
        private Properties properties;
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            System.out.println("test");
            return invocation.proceed();
        }
        @Override
        public Object plugin(Object target) {
            return Plugin.wrap(target, this);
        }
        @Override
        public void setProperties(Properties properties0) {
            this.properties = properties0;
        }
    }
    

    3、在spring的配置文件中添加

     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
            <property name="typeAliasesPackage" value="com.cpp.core" />
            <!-- 显式指定Mapper文件位置 -->
            <property name="mapperLocations" value="classpath:/mybatis/*/*Mapper.xml" />
            <property name="plugins">
                <array>
                    <ref bean="paginationInterceptor"/>
                    <ref bean="sqlStatementInterceptor"/>
                </array>
            </property>
            <property name="configurationProperties">
                <props>
                    <prop key="dialect">mysql</prop>
                </props>
            </property>
        </bean>
    

    配置插件

     <ref bean="sqlStatementInterceptor"/>
    

    配置注入的内容

     <bean id="sqlStatementInterceptor" class="com.cpp.core.filter.MybatisInterceptor"></bean>
    

    2、如果使用的是Druid来连接的数据库


    在web.xml文件中添加下面的信息

     <servlet>
          <servlet-name>DruidStatView</servlet-name>
          <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>DruidStatView</servlet-name>
          <url-pattern>/druid/*</url-pattern>
      </servlet-mapping>  
    

    可以通过web的访问的形式进行访问页面:输入:
    http://dev.eop.zhc360.com:8080/cpp-middleman-api/druid/sql.html
    就可以查看到输出的sql语句了
    enter description here

  • 相关阅读:
    MyBatis 学习笔记
    JavaEE路径陷阱之getRealPath
    Java路径问题最终解决方案—可定位所有资源的相对路径寻址
    Hibernate4.3.10通过slf4j使用log4j
    Hibernate关联关系映射
    SpringMVC 学习笔记
    Spring 学习笔记
    Hibernate 学习笔记
    Struts2 学习笔记
    vue element tree组件,根据不同的状态显示不同的字体颜色
  • 原文地址:https://www.cnblogs.com/babyhhcsy/p/4497172.html
Copyright © 2020-2023  润新知