最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus輸出完整SQL(帶參數(shù))的三種方案

 更新時(shí)間:2025年02月06日 10:02:03   作者:( ????? )920  
當(dāng)我們使用 mybatis-plus 時(shí),可能會(huì)遇到SQL 不能直接執(zhí)行,調(diào)試也不方便的情況,那么,如何打印完整 SQL(帶參數(shù))呢?本篇文章將介紹 3 種實(shí)現(xiàn)方式,并對(duì)比它們的優(yōu)缺點(diǎn),需要的朋友可以參考下

為什么 MyBatis Plus 默認(rèn) SQL 日志沒(méi)有參數(shù)?

當(dāng)你使用 mybatis-plus 時(shí),可能會(huì)遇到這樣的情況:

Preparing: SELECT id, name, `desc` FROM author WHERE name = ?
Parameters: 劉禹錫(String)

這導(dǎo)致 SQL 不能直接執(zhí)行,調(diào)試也不方便。那么,如何打印完整 SQL(帶參數(shù))呢?本篇文章將介紹 3 種實(shí)現(xiàn)方式,并對(duì)比它們的優(yōu)缺點(diǎn)。

方案 1:使用 SqlLogInterceptor(推薦)

從 MyBatis Plus 3.5.3 版本 開(kāi)始,官方提供了 SqlLogInterceptor,可以自動(dòng)替換 SQL 語(yǔ)句中的 ? 為實(shí)際參數(shù)。

配置方式:

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.SqlLogInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new SqlLogInterceptor()); // ? 讓 SQL 帶參數(shù)
        return interceptor;
    }
}

效果:

Executing SQL: SELECT id, name, `desc` FROM author WHERE name = '劉禹錫'

優(yōu)點(diǎn):

  • 官方支持,無(wú)侵入,簡(jiǎn)單易用
  • 低性能開(kāi)銷(xiāo),僅影響日志輸出
  • 適用于 MyBatis Plus

缺點(diǎn):

  • 只適用于 MyBatis Plus(普通 MyBatis 需要用方案 2)

方案 2:自定義 MyBatis Interceptor

如果你使用的是 原生 MyBatis,或者想要更靈活的日志格式,可以 自定義 Interceptor

編寫(xiě) Interceptor:

@Intercepts({
    @Signature(type = Executor.class, method = "query", args = {
        MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
    @Signature(type = Executor.class, method = "update", args = {
        MappedStatement.class, Object.class})
})
@Slf4j
public class SqlInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object proceed = invocation.proceed();
        long endTime = System.currentTimeMillis();

        String sql = generateSql(invocation);
        log.info("\n 執(zhí)行SQL耗時(shí):{}ms \n 執(zhí)行SQL:{}", endTime - startTime, sql);
        return proceed;
    }

    private static String generateSql(Invocation invocation) {
        MappedStatement statement = (MappedStatement) invocation.getArgs()[0];
        Object parameter = invocation.getArgs().length > 1 ? invocation.getArgs()[1] : null;
        BoundSql boundSql = statement.getBoundSql(parameter);

        String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
        for (ParameterMapping param : boundSql.getParameterMappings()) {
            Object value = boundSql.getAdditionalParameter(param.getProperty());
            sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(value)));
        }
        return sql;
    }

    private static String getParameterValue(Object object) {
        return object instanceof String ? "'" + object + "'" : String.valueOf(object);
    }

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

優(yōu)點(diǎn):

  • 適用于 原生 MyBatis 和 MyBatis Plus
  • 可自定義日志格式,控制輸出內(nèi)容

缺點(diǎn):

  • 需要手動(dòng)編寫(xiě),稍微復(fù)雜一點(diǎn)
  • 性能開(kāi)銷(xiāo)略大(需要解析 SQL 并替換參數(shù))

方案 3:開(kāi)啟 MyBatis 日志(手動(dòng)拼接 SQL)

如果只是 臨時(shí)調(diào)試,可以在 application.yml 配置 MyBatis 日志:

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

然后,手動(dòng)拼接 SQL 進(jìn)行調(diào)試。

優(yōu)點(diǎn):

  • 無(wú)代碼改動(dòng),適合臨時(shí)調(diào)試

缺點(diǎn):

  • 仍然是 Preparing: xxx 和 Parameters: xxx 的分離格式
  • 不能直接復(fù)制執(zhí)行

最佳方案對(duì)比與選擇

方案適用場(chǎng)景侵入性性能開(kāi)銷(xiāo)適用框架
SqlLogInterceptorMyBatis Plus無(wú)MyBatis Plus
自定義 Interceptor需要特殊格式中等MyBatis & MyBatis Plus
MyBatis 日志臨時(shí)調(diào)試無(wú)MyBatis & MyBatis Plus

結(jié)論:哪種方式適合你?

  • 推薦:使用 SqlLogInterceptor,簡(jiǎn)單、無(wú)侵入,適用于 MyBatis Plus
  • 進(jìn)階:自定義 Interceptor,適用于 MyBatis,可自定義日志格式。
  • 臨時(shí)調(diào)試:開(kāi)啟 MyBatis 日志,但不自動(dòng)替換 ?。

到此這篇關(guān)于MyBatis-Plus輸出完整SQL(帶參數(shù))的三種方案的文章就介紹到這了,更多相關(guān)MyBatis-Plus輸出完整SQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot入門(mén)篇HelloWorld(圖文教程)

    springboot入門(mén)篇HelloWorld(圖文教程)

    springboot?springboot是一個(gè)全新的框架,它設(shè)計(jì)的目的簡(jiǎn)化spring項(xiàng)目的初始環(huán)境的搭建和開(kāi)發(fā),下面這篇文章主要給大家介紹了關(guān)于springboot入門(mén)篇HelloWorld的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Spring容器刷新prepareRefresh第一步

    Spring容器刷新prepareRefresh第一步

    這篇文章主要為大家介紹了Spring容器刷新prepareRefresh第一步示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Java Kafka實(shí)現(xiàn)延遲隊(duì)列的示例代碼

    Java Kafka實(shí)現(xiàn)延遲隊(duì)列的示例代碼

    kafka作為一個(gè)使用廣泛的消息隊(duì)列,很多人都不會(huì)陌生。本文將利用Kafka實(shí)現(xiàn)延遲隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-08-08
  • Java 線(xiàn)程池全面總結(jié)與詳解

    Java 線(xiàn)程池全面總結(jié)與詳解

    在一個(gè)應(yīng)用程序中,我們需要多次使用線(xiàn)程,也就意味著,我們需要多次創(chuàng)建并銷(xiāo)毀線(xiàn)程。而創(chuàng)建并銷(xiāo)毀線(xiàn)程的過(guò)程勢(shì)必會(huì)消耗內(nèi)存。而在Java中,內(nèi)存資源是及其寶貴的,所以,我們就提出了線(xiàn)程池的概念
    2021-10-10
  • Spring?Cloud?Alibaba微服務(wù)組件Sentinel實(shí)現(xiàn)熔斷限流

    Spring?Cloud?Alibaba微服務(wù)組件Sentinel實(shí)現(xiàn)熔斷限流

    這篇文章主要為大家介紹了Spring?Cloud?Alibaba微服務(wù)組件Sentinel實(shí)現(xiàn)熔斷限流過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • java讀取XML文件的四種方法總結(jié)(必看篇)

    java讀取XML文件的四種方法總結(jié)(必看篇)

    下面小編就為大家?guī)?lái)一篇java讀取XML文件的四種方法總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • MyBatis?與?Spring?Data?JPA?核心對(duì)比總結(jié)(選型指南與最佳實(shí)踐)

    MyBatis?與?Spring?Data?JPA?核心對(duì)比總結(jié)(選型指南與最佳實(shí)踐)

    MyBatis和Spring?Data?JPA是Java兩大主流持久層框架,分別代表SQL可控性與面向?qū)ο箝_(kāi)發(fā)效率的兩種設(shè)計(jì)哲學(xué),本文給大家介紹MyBatis與Spring?Data?JPA核心對(duì)比總結(jié),感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Mybatis?Mapper中多參數(shù)方法不使用@param注解報(bào)錯(cuò)的解決

    Mybatis?Mapper中多參數(shù)方法不使用@param注解報(bào)錯(cuò)的解決

    這篇文章主要介紹了Mybatis?Mapper中多參數(shù)方法不使用@param注解報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • JAVA自定義異常使用方法實(shí)例詳解

    JAVA自定義異常使用方法實(shí)例詳解

    這篇文章主要介紹了JAVA自定義異常使用方法實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java JDK與cglib動(dòng)態(tài)代理有什么區(qū)別

    Java JDK與cglib動(dòng)態(tài)代理有什么區(qū)別

    這篇文章主要介紹了Java JDK動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理的區(qū)別文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-03-03

最新評(píng)論

商水县| 娄底市| 图木舒克市| 德阳市| 孝感市| 毕节市| 玉树县| 农安县| 湖州市| 新昌县| 大同市| 新河县| 阿拉尔市| 临泉县| 光泽县| 东阿县| 慈利县| 中卫市| 潞西市| 南宁市| 巴南区| 格尔木市| 彝良县| 石嘴山市| 青神县| 汾西县| 泸西县| 额济纳旗| 伽师县| 潜江市| 石景山区| 攀枝花市| 芜湖县| 宜君县| 武夷山市| 晋中市| 南召县| 金山区| 旬阳县| 抚远县| 随州市|