首页 专题 文章 代码 归档
MybatisPlus的插件
2020.02.10 12:34 2020.02.10 12:34

1. 插件

1.1. mybatis的插件

关于mybatis的插件,我想大家也都用过,就比如最常用的逆向工程,根据表结构生成model,dao,xml文件,还有分页插件,那这些插件的工作原理是怎么样的呢,就比如分页插件,它为什么能改变我们在xml文件中写的sql语句,本文将带大家一起来了解mybatis的插件机制。

1.2. 自定义一个插件

package com.misiai.mybatisplus.plugins;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;

import java.util.Properties;

@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) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {

    }
}

加入容器:

@Bean
public MyInterceptor myInterceptor() {
    return new MyInterceptor();
}

断点测试,成功被执行:

截图-1581304409

2. 执行分析插件

加入容器

@Bean//sql分析插件
public SqlExplainInterceptor sqlExplainInterceptor() {
    SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
    List<ISqlParser> iSqlParsers = new ArrayList<>();
    iSqlParsers.add(new BlockAttackSqlParser());//全表更新删除阻断器
    sqlExplainInterceptor.setSqlParserList(iSqlParsers);
    return sqlExplainInterceptor;
}

测试,成功被阻断:

@Test
public void testUpdate() {
    User u = new User();
    u.setAge(31);
    boolean update = u.update(null);// null代表全表操作
    System.out.println("update = " + update);
}

截图-1581304906

起到防止误操作作用。

3. 性能分析插件

该功能依赖 p6spy 组件,完美的输出打印 SQL 及执行时长 3.1.0 以上版本

Maven:

<!--性能分析-->
<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.8.7</version>
</dependency>

application.yml 配置:

spring:
  datasource:
    url: jdbc:p6spy:mysql://localhost:3306/mp_test?useSSL=false
#    url: jdbc:mysql://localhost:3306/mp_test?useSSL=false
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver

注意:

url格式变了,是jdbc:p6spy:开头。

spy.properties 配置:

#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 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,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

注意:

  • driver-class-name 为 p6spy 提供的驱动类
  • url 前缀为 jdbc:p6spy 跟着冒号为对应数据库连接地址
  • 打印出sql为null,在excludecategories增加commit
  • 批量操作不打印sql,去除excludecategories中的batch
  • 批量操作打印重复的问题请使用MybatisPlusLogFactory (3.2.1新增)
  • 该插件有性能损耗,不建议生产环境使用。

效果:

截图-1581305571

本节阅读完毕!
二维码图片 扫描关注我们哟