该栏目会系统的介绍 MyBatis Plus 的知识体系,共分为简介、常用API、SQL注入器、代码生成器等模块
插件机制
1、概述
- :MyBatis Plus 允许你在已映射语句执行过程中的某一点进行拦截调用
2、拦截时机
拦截时机 | 相关方法 |
---|---|
拦截执行器(Executor )的方法 | update、query、flushStatements、commit、rollback、getTransaction、close、isClosed |
拦截参数的处理(ParameterHandler ) | getParameterObject、setParameters |
拦截结果集的处理(ResultSetHandler ) | handleResultSets、handleOutputParameters |
拦截 SQL 语法构建的处理(StatementHandler ) | prepare、parameterize、batch、update、query |
3、自定义插件
拦截器类
@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) {
// 属性设置
}
}
注入拦截器
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
执行分析插件
1、概述
- :该插件能对 SQL 执行时进行分析,可用作阻断全表更新、删除的操作,但该插件仅适用于开发环境,不适用于生产环境
2、使用
@Bean //SQL分析插件
public SqlExplainInterceptor sqlExplainInterceptor(){
SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
List<ISqlParser> list = new ArrayList<>();
list.add(new BlockAttackSqlParser()); // 全表更新、删除的阻断器
sqlExplainInterceptor.setSqlParserList(list);
return sqlExplainInterceptor;
}
性能分析插件
1、概述
- :性能分析拦截器,用于输出每条 SQL 语句及其执行时间,可以设置最大执行时间,超过时间会抛出异常
2、使用
// 配置性能分析对象
@Bean
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor interceptor = new PerformanceInterceptor();
// 最大的执行时间,单位为毫秒
interceptor.setMaxTime(100);
// 对输出的SQL做格式化,默认为false
interceptor.setFormat(true);
return interceptor;
}
乐观锁插件
- 取出记录时,获取当前 version
- 更新时,带上这个 version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果 version 不对,就更新失败
// 在实体中加入 version 字段,并使用 @Version 注解
@Version
private Integer version;
// 配置乐观锁对象
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}