Springboot統合mybatisカスタムプラグイン開発

mybatisプラグインとは

mybatisプラグインは、特定のメソッドをインターセプトして拡張し、データベース操作を実行するときにいくつかの追加処理を実行する方法です。
myabtisプラグインの拡張された原理は、データベース操作の実行クラスをインターセプトできる動的エージェントの使用によって実現されます。mybatisのいくつかの操作データベースの実行クラスは次のとおりです。

Executor
StatementHandler 
ParameterHandler
ResultSetHandler

それらの中で:
Executorは一般的なexecutorであり、彼はマスターのようであり、他のexecutorを調整および管理するために使用されます。
StatementHandlerは、StatementまたはPreparedStatementの生成に使用されるエグゼキュータです。同時に、ParameterHandlerを呼び出してSQLステートメントのパラメータを設定します。値が設定された後、SQLを呼び出してStatementHandlerを介してデータベースで実行し、最後にResultSetHandlerを介して結果セットを返します。結果セットと対応するエンティティをマップしてデータを入力し、結果エンティティをStatementHandlerに返します。

したがって、StatementHandlerのインターセプト、つまりsql操作のインターセプトなど、これらのエグゼキューターをインターセプトします。以下は、このStatementHandlerのインターセプトの例です。

インスタンス

要求する

データベースのSQL実行時間が1ミリ秒を超えるすべてのメソッドをインターセプトし、SQLを記録します。

成し遂げる

プラグインクラス
@Intercepts({
        @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class MyPlugin implements Interceptor {

    private long time;


    //方法拦截
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //通过StatementHandler获取执行的sql
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        BoundSql boundSql = statementHandler.getBoundSql();
        String sql = boundSql.getSql();

        long start = System.currentTimeMillis();
        Object proceed = invocation.proceed();
        long end = System.currentTimeMillis();
        if ((end - start) > time) {
            System.out.println("本次数据库操作是慢查询,sql是:" + sql);
        }
        return proceed;
    }

    //获取到拦截的对象,底层也是通过代理实现的,实际上是拿到一个目标代理对象
    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    //获取设置的阈值等参数
    @Override
    public void setProperties(Properties properties) {
        this.time = Long.parseLong(properties.getProperty("time"));
    }
}

myabtisカスタムプラグインは、Interceptorインターフェイスを実装し、@ Interceptsと@Signatureに注釈を付けて、インターセプトする必要のあるオブジェクトを構成する必要があります。ここで、typeはインターセプトするオブジェクトクラス、methodはオブジェクトのメソッド、argsはメソッドパラメータータイプです。

プラグインをインターセプトチェーンに挿入します

注入する方法は2つあります

方法1:直接注入

@org.springframework.context.annotation.Configuration
@MapperScan({"com.springboot.demo.mapper"})
public class MapperConfig {

    //注册插件
    @Bean
    public MyPlugin myPlugin() {
        MyPlugin myPlugin = new MyPlugin();
        //设置参数,比如阈值等,可以在配置文件中配置,这里直接写死便于测试
        Properties properties = new Properties();
        //这里设置慢查询阈值为1毫秒,便于测试
        properties.setProperty("time", "1");
        myPlugin.setProperties(properties);
        return myPlugin;
    }
}

方法2:myabtis構成を介してインターセプトチェーンに追加する
@org.springframework.context.annotation.Configuration
@MapperScan({"com.springboot.demo.mapper"})
public class MapperConfig {
    //将插件加入到mybatis插件拦截链中
    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return new ConfigurationCustomizer() {
            @Override
            public void customize(Configuration configuration) {
                //插件拦截链采用了责任链模式,执行顺序和加入连接链的顺序有关
                MyPlugin myPlugin = new MyPlugin();
                //设置参数,比如阈值等,可以在配置文件中配置,这里直接写死便于测试
                Properties properties = new Properties();
                //这里设置慢查询阈值为1毫秒,便于测试
                properties.setProperty("time", "1");
                myPlugin.setProperties(properties);
                configuration.addInterceptor(myPlugin);
            }
        };
    }
}

テスト

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/qq_28822933/article/details/85224109