Mybatis SQL 攔截器

一脆丁、前言

新的項目中需要檢測sql,其實已經(jīng)有了druid statview的檢測了动雹,不過自己還是想直接再console中看執(zhí)行的情況槽卫,所以再網(wǎng)上找了一個mybatis的攔截器,根據(jù)需要個格式改吧改吧胰蝠,就好了歼培。

二、代碼
package com.core.interceptor;


import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
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;

/**
 * 注解攔截接口的方法
 * Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
 * ParameterHandler (getParameterObject, setParameters)
 * ResultSetHandler (handleResultSets, handleOutputParameters)
 * StatementHandler (prepare, parameterize, batch, update, query)
 */
@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 MyBatisSQLInterceptor implements Interceptor {

    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);
            System.out.println(sql);
        }
        return returnValue;
    }

    public static String getSql(Configuration configuration, BoundSql boundSql, String sqlId, long time) {
        Map map = showSql(configuration, boundSql);
        StringBuilder str = new StringBuilder(100);
        str.append(">>>SQLInterceptor\n");
        str.append("[BaseMethod  ] : "+sqlId+"\n");
        str.append("[ParamterSize] : "+map.get("size")+"\n");
        str.append("[ExecuteSql  ] : "+map.get("sql")+"\n");
        List list = (List) map.get("list");
        String arr = "" ;
        for (int i = 0; i < list.size(); i++) {
            String item = list.get(i).toString().replaceAll("'", "");
            if(arr.length() > 0){
                arr += " , "+item;
            }else{
                arr += item;
            }
        }
        str.append("[ParamterList] : "+arr+"\n");
        str.append("[ExecuteTime ] : "+time+" 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 Map showSql(Configuration configuration, BoundSql boundSql) {
        Object parameterObject = boundSql.getParameterObject();
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
        //設(shè)置返回參數(shù)
        Map map = new HashMap();
        //格式化sql
        map.put("sql", sql);
        if (parameterMappings.size() > 0 && parameterObject != null) {
            //參數(shù)長度
            map.put("size", parameterMappings.size());
            //參數(shù)List
            List list = new ArrayList();
            TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
            if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {//單個參數(shù)
                //sql = sql.replaceFirst("\\?", getParameterValue(parameterObject));
                //添加參數(shù)
                list.add(getParameterValue(parameterObject));
            } else {//多個參數(shù)
                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));
                        list.add(getParameterValue(getParameterValue(obj)));
                    } else if (boundSql.hasAdditionalParameter(propertyName)) {
                        Object obj = boundSql.getAdditionalParameter(propertyName);
//                        sql = sql.replaceFirst("\\?", getParameterValue(obj));
                        list.add(getParameterValue(getParameterValue(obj)));
                    }
                }
            }
            map.put("list", list);
        }
        return map;
    }

    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    public void setProperties(Properties properties0) {
        this.properties = properties0;
    }
}

-end-

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茸塞,一起剝皮案震驚了整個濱河市躲庄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钾虐,老刑警劉巖噪窘,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異禾唁,居然都是意外死亡效览,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門荡短,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丐枉,“玉大人,你說我怎么就攤上這事掘托∈萸拢” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵闪盔,是天一觀的道長弯院。 經(jīng)常有香客問我,道長泪掀,這世上最難降的妖魔是什么听绳? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮异赫,結(jié)果婚禮上椅挣,老公的妹妹穿的比我還像新娘头岔。我一直安慰自己,他們只是感情好鼠证,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布峡竣。 她就那樣靜靜地躺著,像睡著了一般量九。 火紅的嫁衣襯著肌膚如雪适掰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天荠列,我揣著相機(jī)與錄音类浪,去河邊找鬼。 笑死肌似,一個胖子當(dāng)著我的面吹牛戚宦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锈嫩,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼垦搬!你這毒婦竟也來了呼寸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤猴贰,失蹤者是張志新(化名)和其女友劉穎对雪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體米绕,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑟捣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栅干。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迈套。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碱鳞,靈堂內(nèi)的尸體忽然破棺而出桑李,到底是詐尸還是另有隱情,我是刑警寧澤窿给,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布贵白,位于F島的核電站,受9級特大地震影響崩泡,放射性物質(zhì)發(fā)生泄漏禁荒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一角撞、第九天 我趴在偏房一處隱蔽的房頂上張望呛伴。 院中可真熱鬧勃痴,春花似錦、人聲如沸磷蜀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褐隆。三九已至污它,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庶弃,已是汗流浹背衫贬。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歇攻,地道東北人固惯。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像缴守,于是被迫代替她去往敵國和親葬毫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,757評論 25 707
  • 1. 簡介 1.1 什么是 MyBatis 屡穗? MyBatis 是支持定制化 SQL贴捡、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,454評論 0 4
  • 12月1日更新 謝謝,@搬磚技術(shù)的提醒需要添加些注意事項: 版本號對比是需要相同的位數(shù)的情況下的 比如:位數(shù)不同的...
    清河灣閱讀 19,251評論 49 30
  • 參考連接:cropperjs官方npm庫介紹 step1:npm安裝插件: step2:html結(jié)構(gòu): 繪圖內(nèi)容層...
    royluck閱讀 3,300評論 1 0
  • 我水銀一樣純凈的 愛人 今夜 我馬放南山 繞開死亡 在白雪之上 為你寫下絕世的詩行
    遠(yuǎn)方孤雁閱讀 278評論 0 3