亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mybatis攔截器的使用方式(輸出日志或sql語(yǔ)句)

 更新時(shí)間:2025年05月07日 15:34:18   作者:春風(fēng)十里不及你  
這篇文章主要介紹了mybatis攔截器的使用方式(輸出日志或sql語(yǔ)句),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

攔截器的一個(gè)作用

是我們可以攔截某些方法的調(diào)用,我們可以選擇在這些被攔截的方法執(zhí)行前后加上某些邏輯,也可以在執(zhí)行這些被攔截的方法時(shí)執(zhí)行自己的邏輯而不再執(zhí)行被攔截的方法。

Mybatis攔截器設(shè)計(jì)的一個(gè)初衷就是為了供用戶在某些時(shí)候可以實(shí)現(xiàn)自己的邏輯而不必去動(dòng)Mybatis固有的邏輯。mybatis攔截器一般用于分頁(yè)插件、輸出日志、sql等。

使用的方法

首先要實(shí)現(xiàn)mybatis的Interceptor接口,

實(shí)現(xiàn)它的三個(gè)方法:

Object intercept(Invocation invocation) throws Throwable;
Object plugin(Object target);
void setProperties(Properties properties);

plugin方法是攔截器用于封裝目標(biāo)對(duì)象的,通過(guò)該方法我們可以返回目標(biāo)對(duì)象本身,也可以返回一個(gè)它的代理。

當(dāng)返回的是代理的時(shí)候我們可以對(duì)其中的方法進(jìn)行攔截來(lái)調(diào)用intercept方法,當(dāng)然也可以調(diào)用其他方法,這點(diǎn)將在后文講解。

  • setProperties方法是用于在Mybatis配置文件中指定一些屬性的。
  • plugin方法中我們可以決定是否要進(jìn)行攔截進(jìn)而決定要返回一個(gè)什么樣的目標(biāo)對(duì)象。而intercept方法就是要進(jìn)行攔截的時(shí)候要執(zhí)行的方法。

下面例子本來(lái)相用于記錄日志到數(shù)據(jù)庫(kù)

但是由于mybatis底層無(wú)法注入spring的對(duì)象,所以,只能用于輸出日志。

@Intercepts({@Signature(method = "update", type = Executor.class, args = {MappedStatement.class, Object.class})})
public class LogInterceptor implements Interceptor {
    /**
     * 注解攔截接口的方法
     * Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
     * ParameterHandler (getParameterObject, setParameters)
     * ResultSetHandler (handleResultSets, handleOutputParameters)
     * StatementHandler (prepare, parameterize, batch, update, query)
     */

    private static final Logger LOGGER = LoggerFactory.getLogger(LogInterceptor.class);

    private Properties properties;

    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        // 獲取執(zhí)行的方法
        if (args.length > 1) {
            // 傳入的對(duì)象
            Object obj = args[1];
            if (obj instanceof Log) {
                // 若是日志對(duì)象 則直接跳過(guò)
                return invocation.proceed();
            }
            saveLog(args[0], obj);
        }
        return invocation.proceed();
    }

    private void saveLog(Object arg, Object obj) {
        Log log = new Log();
        log.setCreateTime(DateUtils.now());
        log.setModifyTime(DateUtils.now());
        MappedStatement mappedStatement = (MappedStatement) arg;
        // 執(zhí)行的方法名
        String name = mappedStatement.getSqlCommandType().name();
        String change = JsonMapper.toJson(obj);
        if (name.startsWith("INSERT")) {
            log.setType("新增" + obj.getClass().getSimpleName());
            log.setNewContent(change);
        } else if (name.startsWith("UPDATE")) {
            log.setType("修改" + obj.getClass().getSimpleName());
            log.setNewContent(change);
        } else if (name.startsWith("DELETE")) {
            log.setType("刪除" + obj.getClass().getSimpleName());
            log.setOldContent(change);
        }

        LOGGER.info("----------------------------------------------");
        LOGGER.info(JsonMapper.toJson(log));
        LOGGER.info("----------------------------------------------");
    }

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

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

}

類上面必須添加@Intercepts注解

@Signature,代表攔截點(diǎn),

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

method表示需要攔截的方法

mybatis有update, query, flushStatements, commit, rollback, getTransaction, close, isClosed等方法,其中,update包括新增、修改、刪除等方法,query用于查詢,其它的基本用不到。

  • type表示攔截的接口類型,有Executor、StatementHandler、ParameterHandler和ResultSetHandler。
  • args表示攔截的參數(shù)類型,有MappedStatement、Object、RowBounds和ResultHandler等等.

編寫完攔截器

需要在配置文件中注冊(cè)攔截器,在sqlMapConfig配置文件中加上

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <settings>
      <setting name="cacheEnabled" value="true"/>
      <setting name="lazyLoadingEnabled" value="true"/>
      <setting name="multipleResultSetsEnabled" value="true"/>
      <setting name="useColumnLabel" value="true"/>
      <setting name="useGeneratedKeys" value="false"/>
    </settings>
    
    <plugins>
        <plugin interceptor="com.tc.itfarm.commons.interceptor.LogInterceptor"></plugin>
    </plugins>
</configuration>

啟動(dòng)項(xiàng)目測(cè)試即可

輸出的日志如下:

2016-08-28 14:48:02 [ http-apr-8888-exec-8:70630 ] - [ INFO ] ----------------------------------------------
2016-08-28 14:48:02 [ http-apr-8888-exec-8:70634 ] - [ INFO ] {"recordId":null,"type":"修改User","oldContent":null,"newContent":"{\"recordId\":1,\"username\":\"wdd\",\"telephone\":\"18888888888\",\"sex\":2,\"password\":null,\"age\":22,\"status\":1,\"address\":\"安徽靈璧1\",\"photo\":null,\"email\":\"asdds\",\"qq\":\"812908087\",\"nickname\":\"愛(ài)吃貓的魚1\",\"registerTime\":null,\"modifyTime\":1472366881824}","userId":null,"username":null,"createTime":1472366881824,"modifyTime":1472366881824}
2016-08-28 14:48:02 [ http-apr-8888-exec-8:70634 ] - [ INFO ] ----------------------------------------------

若要插入到數(shù)據(jù)庫(kù),必須new一個(gè)dao對(duì)象操作

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java.lang.Void類的解析與使用詳解

    java.lang.Void類的解析與使用詳解

    這篇文章主要介紹了java.lang.Void類的解析與使用詳解,文中涉及到了java.lang.integer類的源碼,分場(chǎng)景給大家介紹的非常詳細(xì),給大家補(bǔ)充介紹java.lang.Void 與 void的比較及使用,需要的朋友可以參考下
    2017-12-12
  • 淺談java object對(duì)象在heap中的結(jié)構(gòu)

    淺談java object對(duì)象在heap中的結(jié)構(gòu)

    本文主要介紹了淺談java object對(duì)象在heap中的結(jié)構(gòu),感興趣的同學(xué),可以參考下。
    2021-06-06
  • 實(shí)例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法

    實(shí)例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法

    今天小編就為大家分享一篇關(guān)于實(shí)例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 從內(nèi)存模型中了解Java final的全部細(xì)節(jié)

    從內(nèi)存模型中了解Java final的全部細(xì)節(jié)

    關(guān)于final關(guān)鍵字,它也是我們一個(gè)經(jīng)常用的關(guān)鍵字,可以修飾在類上、或者修飾在變量、方法上,以此看來(lái)定義它的一些不可變性!像我們經(jīng)常使用的String類中,它便是final來(lái)修飾的類,并且它的字符數(shù)組也是被final所修飾的。但是一些final的一些細(xì)節(jié)你真的了解過(guò)嗎
    2022-03-03
  • java遞歸實(shí)現(xiàn)復(fù)制一個(gè)文件夾下所有文件功能

    java遞歸實(shí)現(xiàn)復(fù)制一個(gè)文件夾下所有文件功能

    這篇文章主要介紹了java遞歸實(shí)現(xiàn)復(fù)制一個(gè)文件夾下所有文件功能n次,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 深入理解Java并發(fā)編程之LinkedBlockingQueue隊(duì)列

    深入理解Java并發(fā)編程之LinkedBlockingQueue隊(duì)列

    本文主要介紹了Java并發(fā)編程之LinkedBlockingQueue隊(duì)列,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 淺談 java中ArrayList、Vector、LinkedList的區(qū)別聯(lián)系

    淺談 java中ArrayList、Vector、LinkedList的區(qū)別聯(lián)系

    ArrayList,Vector底層是由數(shù)組實(shí)現(xiàn),LinkedList底層是由雙線鏈表實(shí)現(xiàn),從底層的實(shí)現(xiàn)可以得出性能問(wèn)題ArrayList,Vector插入速度較慢,查詢速度較快,而LinkedList插入速度較快,而查詢速度較慢。再者由于Vevtor使用了線程安全鎖,所以ArrayList的運(yùn)行效率高于Vector
    2015-11-11
  • mybatis?log4j2打印sql+日志實(shí)例代碼

    mybatis?log4j2打印sql+日志實(shí)例代碼

    在學(xué)習(xí)mybatis的時(shí)候,如果用log4j2來(lái)協(xié)助查看調(diào)試信息,則會(huì)大大提高學(xué)習(xí)的效率,加快debug速度,下面這篇文章主要給大家介紹了關(guān)于mybatis?log4j2打印sql+日志的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Java使用ObjectMapper的簡(jiǎn)單示例

    Java使用ObjectMapper的簡(jiǎn)單示例

    這篇文章主要介紹了Java使用ObjectMapper的簡(jiǎn)單示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java中使用正則檢查有效日期的實(shí)現(xiàn)

    Java中使用正則檢查有效日期的實(shí)現(xiàn)

    要判斷一個(gè)字符串是否符合時(shí)間格式,可以使用正則表達(dá)式,本文主要介紹了Java中使用正則檢查有效日期的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10

最新評(píng)論