mybatis-plus 分页插件 执行分析插件 性能分析插件 乐观锁插件的基本实现原理

分页插件PaginationInterceptor

其原理与mybatis插件的创建没有区别。

1. PaginationInterceptor,implements Interceptor

2. 使用@Intercepts注解完成插件签名

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})

拦截的是4大对象中的StatementHandler中的prepare方法,参数有两个

 

3. 将插件注册到全局配置文件中

<!--注册分页插件-->

<bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor">

</bean>

 

其执行过程就是创建StatementHandler对象的时候,执行plugin方法,生成代理对象。当执行prepare方法的时候,先执行intercept方法

DialectModel model = DialectFactory.buildPaginationSql(page, buildSql, dbType, dialectClazz);

针对不同的dbType,生成不同的分页sql

public class MySqlDialect implements IDialect {



    @Override

    public DialectModel buildPaginationSql(String originalSql, long offset, long limit) {

        String sql = originalSql + " LIMIT " + FIRST_MARK + StringPool.COMMA + SECOND_MARK;

        return new DialectModel(sql, offset, limit).setConsumerChain();

    }

}

其sql为:SELECT  id,last_name,email,gender,age  FROM tbl_employee LIMIT ?,?

于是,通过拦截器修改了要执行的sql语句,从而实现了分页

执行分析插件SqlExplainInterceptor

SQL执行分析拦截器,只支持MySQL5.6.3以上版本

该插件的作用是分析DELETE UPDATE语句,防止小白或者恶意进行DELETE UPDATE全表操作

只建议在开发环境中使用,不建议在生产环境使用

 

之前的版本是这样做的:

在插件的底层通过SQL语句分析命令:Explain 分析当前的SQL语句,根据结果集中的Extra列来断定当前是否全表操作

 

现在的版本:更新/删除的时候,判断update/delete子句是否有where子句,如果没有where子句,那么就prohibit掉;否则,如通过UpdateWrapper构造出这样的sql:DELETE FROM tbl_employee  WHERE id <> 0,还是会全表删除掉的

 

public abstract class AbstractSqlParserHandler类中

 

private List<ISqlParser> sqlParserList;

private ISqlParserFilter sqlParserFilter;

如何给AbstractSqlParserHandler中的sqlParserList赋值呢?

在applicationContext.xml中

<!--SQL执行分析插件-->

<bean name="sqlExplainInterceptor" class="com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor">

    <property name="sqlParserList" ref="blockAttackSqlParser" />

</bean>

 

效果:

Caused by: org.apache.ibatis.exceptions.PersistenceException:

### Error updating database.  Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of full table deletion

性能分析插件PerformanceInterceptor

// 计算执行 SQL 耗时

long start = SystemClock.now();

Object result = invocation.proceed();

long timing = SystemClock.now() - start;

 

如果超过maxTime,会提示:

### Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException:  The SQL execution time is too large, please optimize !

乐观锁插件OptimisticLockerInterceptor

乐观锁的实现原理:

取出记录时,获取当前version 2

更新时,带上这个version 2

执行更新时,set version = yourVersion+1 where version = yourVersion

如果version不对,就更新失败

@Version 用于注解实体字段,必须要有。

表中也要有这个字段

执行的sql:

 

Mybatis-plus是一个基于Mybatis的增强工具,它提供了一些常用的插件来增加开发效率和功能。其中,Mybatis-plus-join是一个用于解决Mybatis-plus在多表连接查询方面的不足的工具。它能够对Mybatis-plus进行功能升级,使其能够进行多表连接查询,从而摆脱了传统的XML模式多表连接的限制。使用Mybatis-plus-join可以提高开发效率,而且使用方法与Mybatis-plus一样,学习成本较低。另外,Mybatis-plus还提供了其他常用的插件,如自动分页插件、防止全表更新与删除插件乐观锁插件等,可以根据需要进行配置和使用。如果想要使用Mybatis-plus插件,需要在配置类或启动类中进行相应的配置,比如配置分页插件,可以通过添加PaginationInnerInterceptor来实现。具体的配置方法可以参考相关文档或示例代码。 #### 引用[.reference_title] - *1* [Mybatis-plus做连接查询的插件Mybatis-plus-join](https://blog.csdn.net/m0_67400973/article/details/126463252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MyBatis-Plus 常用插件](https://blog.csdn.net/m0_53067943/article/details/126112463)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值