1、关于插件
1.1、插件机制
MyBatis 允许你在已映射语句执⾏过程中的某⼀点进⾏拦截调⽤。默认情况下,MyBatis 允许使⽤插件来拦截的⽅法调⽤包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
我们看到了可以拦截Executor接⼝的部分⽅法,⽐如update,query,commit,rollback等⽅法,还有其他接⼝的⼀些⽅法等。总体概括为:
- 拦截执⾏器的⽅法
- 拦截参数的处理
- 拦截结果集的处理
- 拦截Sql语法构建的处理
拦截器示例:
package com.blnp.net.plugin;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import java.util.Properties;
/**
* <p></p>
*
* @author lyb [email protected]
* @version 1.0
* @since 2024/8/27 14:17
*/
@Intercepts(
@Signature(
type = Executor.class,
method = "update",
args = {MappedStatement.class,Object.class}
)
)
public class MyInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
/**
* 拦截方法,具体业务逻辑编写的位置
**/
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
//创建target对象的代理对象,目的是将当前拦截器加入到该对象中
return Plugin.wrap(target,this);
}
@Override
public void setProperties(Properties properties) {
//属性设置
}
}
注入到Spring容器中:
/**
* ⾃定义拦截器
*/
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
或者通过xml配置,mybatis-config.xml:
<?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>
<plugins>
<plugin interceptor="com.blnp.net.plugin.MyInterceptor"></plugin>
</plugins>
</configuration>
1.2、性能分析插件
1.2.1、旧版本分析方法
老版本的性能分析插件是使用以下方式来进行分析的,但是该插件比较影响性能。并且官方在3.2.0版本以上已经移除了,但这里还是记录下具体的使用方法:
步骤一:在MP配置类中配置该插件,并且只适用于DEV环境
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
/*
*性能分析插件
*/
@Bean
@Profile({"dev"}) // 指定环境为dev生效
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
// 设置sql语句的最大执行时间
performanceInterceptor.setMaxTime(100);
// 设置sql是否格式化显示
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
}
步骤二:设置环境为dev,可以在yml如下配置,或者直接测试类中也是可以设置的,如图。
spring:
profiles:
active: dev
1.2.2、推荐方式
步骤一:引入p6spy的maven依赖
<!--SQL 分析打印-->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.8.2</version>
</dependency>
步骤二:更改yml连接数据库配置,主要修改driver-class-name、url中jdbc后需要加上p6spy
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://127.0.0.1:3360/test?userSSL=false
username: root
password: 123456
profiles:
active: dev
步骤三:新增spy.properties文件,内容如下,可以根据需求相对应的修改文件。
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台,解开注释就行了
# appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 指定输出文件位置
logfile=sql.log
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,batch,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
步骤四:输出文件格式内容如下
Consume Time:63 ms 2024-08-27 17:15:22
Execute SQL:SELECT id,name,age,email FROM user WHERE (age <= '23')
拓展:关于 p6spy
. P6Spy是一个开源的Java应用程序,它可以拦截和记录JDBC(Java数据库连接)调用,以便开发人员可以更方便地进行数据库调试和性能优化。P6Spy可以通过提供数据库调试信息和SQL执行时间等方面的信息来帮助开发人员诊断慢查询和其他数据库问题。主要包括以下几个方面:
- 监视和记录JDBC调用:P6Spy可以拦截JDBC驱动程序发送到数据库的SQL语句,并记录它们以供后期分析。
- 统计查询性能:P6Spy