mybatis-plus拦截器原理

目录

背景

1.使用

1.1 配置插件

1.2 使用

1.3分页使用

1.4 java拦截原理类图

2.mybatis-plus 插件原理分析

2.1 mapper信息注册

2.2 拦截器插件初始化

2.3 查询请求拦截

2.4 数据权限拦截器


背景

      最近在公司做项目的时候,需要实现数据权限最终方案就是根据借助mybatis-plus的插件,拦截sql并解析规则拼接实现数据权限拦截,记录一下。

1.使用

1.1 配置插件

 @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        // 添加数据权限插件
        DataPermissionInterceptor dataPermissionInterceptor = new DataPermissionInterceptor();
        // 添加自定义的数据权限处理器
        dataPermissionInterceptor.setDataPermissionHandler(dataScopePermissionHandler);
        interceptor.addInnerInterceptor(dataPermissionInterceptor);

        //分页拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

1.2 使用

权限插件使用

public class DataScopePermissionHandler implements DataPermissionHandler {

    @Override
    public Expression getSqlSegment(Expression where, String mappedStatementId) {
        // 根据自己的业务拦截数据权限
        return where ;
    }

1.3分页使用

Page page = xxxapper.selectPage(new Page(query.getPageNo(), query.getPageSize()), queryWrapper);

1.4 java拦截原理类图

mybatis-plus拦截器原理_第1张图片

2.mybatis-plus 插件原理分析

2.1 mapper信息注册

2.1.1 @MapperScan扫描

org.mybatis.spring.annotation.MapperScannerRegistrar

mybatis-plus拦截器原理_第2张图片

2.1.2 MapperScannerRegistrar注册信息

注册基本的属性到MapperScannerConfigurer里面

mybatis-plus拦截器原理_第3张图片

2.1.3 MapperScannerConfigurer后置处理器PostProcessor

org.mybatis.spring.mapper.MapperScannerConfigure

mybatis-plus拦截器原理_第4张图片

2.1.4 ClassPathMapperScanner根据mapper路径注册bean定义信息

org.mybatis.spring.mapper.MapperScannerConfigure

mybatis-plus拦截器原理_第5张图片

2.1.5 MapperFactoryBean创建代理对象mapper

org.mybatis.spring.mapper.MapperFactoryBean#getObject

org.mybatis.spring.SqlSessionTemplate#getMapper

com.baomidou.mybatisplus.core.MybatisMapperRegistry#getMapper

mybatis-plus拦截器原理_第6张图片

com.baomidou.mybatisplus.core.override.MybatisMapperProxyFactory#newInstance()

mybatis-plus拦截器原理_第7张图片

2.2 拦截器插件初始化

2.2.1 MybatisPlusAutoConfiguration实例化

com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

mybatis-plus拦截器原理_第8张图片

将插件设置到SqlSessionFactory里面

org.apache.ibatis.session.SqlSessionFactory

SqlSessionFactory把plugs设置到MybatisSqlSessionFactoryBean里面

com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean#setPlugins

2.2.2 FactoryBean后置处理器

MybatisSqlSessionFactoryBean初始化后置处理器

MybatisSqlSessionFactoryBean#afterPropertiesSet

com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean#buildSqlSessionFactory

mybatis-plus拦截器原理_第9张图片

2.2.3 InterceptorChain拦截器链设置

org.apache.ibatis.session.Configuration#addInterceptor

org.apache.ibatis.plugin.InterceptorChain#addInterceptor

mybatis-plus拦截器原理_第10张图片

2.3 查询请求拦截

2.3.1 请求信息

Page page = xxxMapper.selectPage(new Page(query.getPageNo(), query.getPageSize()), queryWrapper);

2.3.2 代理对象请求

com.baomidou.mybatisplus.core.override.MybatisMapperProxy

com.baomidou.mybatisplus.core.override.MybatisMapperProxy#invoke

com.baomidou.mybatisplus.core.override.MybatisMapperMethod#execute

mybatis-plus拦截器原理_第11张图片

2.3.3 创建sqlsession执行查询

org.apache.ibatis.session.defaults.DefaultSqlSession#selectList()

org.mybatis.spring.SqlSessionUtils#getSqlSession()

org.mybatis.spring.SqlSessionTemplate.SqlSessionInterceptor#invoke

org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSession()

org.apache.ibatis.session.Configuration#newExecutor()

mybatis-plus拦截器原理_第12张图片

2.3.4 创建sqlsession里面的执行器,

org.apache.ibatis.session.Configuration#newExecutor()

mybatis-plus拦截器原理_第13张图片

2.3.5 创建sqlsession里面的执行器

com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor#plugin

org.apache.ibatis.plugin.Plugin#wrap

mybatis-plus拦截器原理_第14张图片

mybatis-plus拦截器原理_第15张图片

2.4 数据权限拦截器

2.4.1 MybatisPlusInterceptor拦截查询

com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept

mybatis-plus拦截器原理_第16张图片

2.4.2 DataPermissionInterceptor拦截查询

com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor

com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor#beforeQuery

com.baomidou.mybatisplus.extension.parser.JsqlParserSupport#parserSingle

com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor#processSelect

com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor#setWhere

mybatis-plus拦截器原理_第17张图片

2.4.3 DataPermissionHandler自定义执行器前置过滤

mybatis-plus拦截器原理_第18张图片

2.4.5 自定义拦截sql后,执行sql,处理完成

mybatis-plus拦截器原理_第19张图片

你可能感兴趣的:(mybatis,java,spring,mysql,后端)