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);
}
};
}
}