mybatis自定義攔截器

自定義注解

/**
 * 獲取sql注解
 *
 * @author ruoyi
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SqlLogs
{
    /**
     * 是否打印sql
     */
    public boolean hasSqlLog() default false;



}

自定義攔截器

@Slf4j
@AllArgsConstructor
//@Aspect
@Intercepts({
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
        @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
@Component
public class SqlLogsInterceptor extends AbstractSqlParserHandler implements Interceptor {
 
    private DataSource dataSource;
 
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Map<String,Object> sqlMap = new HashMap<>();
        Boolean hasSqlLogs = false;
        StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget());
        MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
        this.sqlParser(metaObject);
        // 先判斷是不是SELECT操作 不是直接過(guò)濾
        MappedStatement mappedStatement =
                (MappedStatement) metaObject.getValue("delegate.mappedStatement");
        if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) {
            return invocation.proceed();
        }
 
        final Object[] args = invocation.getArgs();
        //獲取執(zhí)行方法的位置
        String namespace = mappedStatement.getId();
        //獲取mapper名稱
        String className = namespace.substring(0,namespace.lastIndexOf("."));
        //獲取方法名
        String methedName= namespace.substring(namespace.lastIndexOf(".") + 1,namespace.length());
        //獲取當(dāng)前mapper 的方法
        Method[] ms = Class.forName(className).getMethods();
        for(Method m : ms){
            if(m.getName().equals(methedName)){
          //獲取注解  來(lái)判斷是不是要儲(chǔ)存sql
                SqlLogs annotation = m.getAnnotation(SqlLogs.class);
                if(annotation != null){
                    hasSqlLogs = annotation.hasSqlLog();
                }
            }
        }
        //如果是有注解值為true,便獲取sql處理參數(shù)
        if(hasSqlLogs){
            BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");
            // 執(zhí)行的SQL語(yǔ)句
            String originalSql = boundSql.getSql();
            // SQL語(yǔ)句的參數(shù)
            Object parameterObject = boundSql.getParameterObject();
            if(parameterObject != null){
                originalSql = showSql(configuration, boundSql);
            }
            System.err.println("sql :"+originalSql);
        }
        return invocation.proceed();
 
    }
 
    /**
     * 生成攔截對(duì)象的代理
     *
     * @param target 目標(biāo)對(duì)象
     * @return 代理對(duì)象
     */
    @Override
    public Object plugin(Object target) {
        if (target instanceof StatementHandler) {
            return Plugin.wrap(target, this);
        }
        return target;
    }
 
    /**
     * 獲取參數(shù)值
     * @param obj
     * @return
     */
    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 = "";
            }
 
        }
        System.err.println("獲取值: "+value);
        return value;
    }
 
    /***
     * sql 參數(shù)替換
     * @param configuration
     * @param boundSql
     * @return
     */
    public static String showSql(Configuration configuration, BoundSql boundSql) {
        //獲取參數(shù)對(duì)象
        Object parameterObject = boundSql.getParameterObject();
        //獲取當(dāng)前的sql語(yǔ)句有綁定的所有parameterMapping屬性
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        //去除空格
        String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
        if (parameterMappings.size() > 0 && parameterObject != null) {
            TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
            /* 如果參數(shù)滿足:org.apache.ibatis.type.TypeHandlerRegistry#hasTypeHandler(java.lang.Class<?>)
            org.apache.ibatis.type.TypeHandlerRegistry#TYPE_HANDLER_MAP
            * 即是不是屬于注冊(cè)類型(TYPE_HANDLER_MAP...等/有沒(méi)有相應(yīng)的類型處理器)
             * */
            if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
                sql = sql.replaceFirst("\\?", getParameterValue(parameterObject));
            } else {
                //裝飾器煤蹭,可直接操作屬性值 ---》 以parameterObject創(chuàng)建裝飾器
                //MetaObject 是 Mybatis 反射工具類祠丝,通過(guò) MetaObject 獲取和設(shè)置對(duì)象的屬性值
                MetaObject metaObject = configuration.newMetaObject(parameterObject);
                //循環(huán) parameterMappings 所有屬性
                for (ParameterMapping parameterMapping : parameterMappings) {
                    //獲取property屬性
                    String propertyName = parameterMapping.getProperty();
                    System.err.println("propertyName: "+propertyName);
                    //是否聲明了propertyName的屬性和get方法
                    if (metaObject.hasGetter(propertyName)) {
                        Object obj = metaObject.getValue(propertyName);
                        sql = sql.replaceFirst("\\?", getParameterValue(obj));
                    } else if (boundSql.hasAdditionalParameter(propertyName)) {
                        //判斷是不是sql的附加參數(shù)
                        Object obj = boundSql.getAdditionalParameter(propertyName);
                        sql = sql.replaceFirst("\\?", getParameterValue(obj));
                    }
                }
            }
        }
        return sql;
    }
 
}

在MybatisPlusConfig中注冊(cè)bean

@Bean
    @ConditionalOnMissingBean //有此實(shí)例便不進(jìn)行注冊(cè)
    public SqlLogsInterceptor dataScopeInterceptor(DataSource dataSource) {
        return new SqlLogsInterceptor(dataSource);
    }

使用注解

 @SqlLogs(hasSqlLog = true)
    List<XgYyxxVo> selectByLqw(@Param(Constants.WRAPPER) Wrapper queryWrapper);

2.詳細(xì)關(guān)于mybatis攔截器:

https://www.cnblogs.com/top-sky-hua/p/11306376.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窝撵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拴还,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡欧聘,警方通過(guò)查閱死者的電腦和手機(jī)片林,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人费封,你說(shuō)我怎么就攤上這事焕妙。” “怎么了孝偎?”我有些...
    開(kāi)封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵访敌,是天一觀的道長(zhǎng)凉敲。 經(jīng)常有香客問(wèn)我衣盾,道長(zhǎng),這世上最難降的妖魔是什么爷抓? 我笑而不...
    開(kāi)封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任势决,我火速辦了婚禮,結(jié)果婚禮上蓝撇,老公的妹妹穿的比我還像新娘果复。我一直安慰自己,他們只是感情好渤昌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布虽抄。 她就那樣靜靜地躺著,像睡著了一般独柑。 火紅的嫁衣襯著肌膚如雪迈窟。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天忌栅,我揣著相機(jī)與錄音车酣,去河邊找鬼。 笑死索绪,一個(gè)胖子當(dāng)著我的面吹牛湖员,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瑞驱,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼娘摔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了唤反?” 一聲冷哼從身側(cè)響起凳寺,我...
    開(kāi)封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拴袭,沒(méi)想到半個(gè)月后读第,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拥刻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年怜瞒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吴汪,死狀恐怖惠窄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漾橙,我是刑警寧澤杆融,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站霜运,受9級(jí)特大地震影響脾歇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淘捡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一藕各、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焦除,春花似錦激况、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至创葡,卻和暖如春浙踢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹈丸。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工成黄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逻杖。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓奋岁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親荸百。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闻伶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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