数据权限实现(Mybatis拦截器+JSqlParser)

2023-11-05

由于本人才疏学浅,刚刚入门。本文章是我在实现数据权限的过程中的学习体会。

总体思想


一、Mybatis拦截器

参考:

Mybatis中文官网

慕课网Mybatis方面视频

SQL解析

引用官网说明:

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

Executor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

ParameterHandler(getParameterObject, setParameters)

ResultSetHandler(handleResultSets, handleOutputParameters)

StatementHandler(prepare, parameterize, batch, update, query)

通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定了想要拦截的方法签名即可。

Mybatis所提供的功能是Plugin,虽然应译为插件,但是实质就是指的我们所需要使用的拦截器。

方法及参数解析:

1. Interceptor 接口

public interface Interceptor {

  Object intercept(Invocation invocation) throws Throwable;

  Object plugin(Object target);

  void setProperties(Properties properties);

}

实现 Interceptor 接口也就是实现intercept,plugin,setProperties这三个方法,其中

intercept方法是我们拦截到对象后所进行操作的位置,也就是我们之后编写逻辑代码的位置。

plugin方法,根据参数可以看出,该方法的作用是拦截我们需要拦截到的对象。

setProperties方法,我们可以通过配置文件中进行properties配置,然后在该方法中读取到配置。

这三个方法的执行顺序: setProperties--->plugin--->intercept

2.intercept方法中的Invocation类的属性

 private Object target;	//所拦截到的目标的代理
 private Method method;	//所拦截目标的具体方法
 private Object[] args;	//方法的参数


实现interceptor接口

@Intercepts({ @Signature(method = "prepare", type = StatementHandler.class, args = { Connection.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) {
	}

}

解释:

@intercepts声明该类为拦截器,@signature声明拦截对象。

Mybatis获取Statement是在statementHandler中,因为我们需要拦截的对象应该是Statement,StatementHandler类中有返回值为StatementPrepare方法,所以,这个类就是我们需要拦截的对象。

method为我们需要拦截的prepare方法,type为所要拦截的接口类,argsprepare方法的参数。




源码解析:

StatementHandler源码:

public interface StatementHandler {

  Statement prepare(Connection connection)
      throws SQLException;

  void parameterize(Statement statement)
      throws SQLException;

  void batch(Statement statement)
      throws SQLException;

  int update(Statement statement)
      throws SQLException;

  <E> List<E> query(Statement statement, ResultHandler resultHandler)
      throws SQLException;

  BoundSql getBoundSql();

  ParameterHandler getParameterHandler();

}

该源码中的prepare方法为我们需要的拦截的,它的实现为:


实际的实现方法在BaseStatementHandler中:

@Override
  public Statement prepare(Connection connection) throws SQLException {
    ErrorContext.instance().sql(boundSql.getSql());
    Statement statement = null;
    try {
      statement = instantiateStatement(connection);//<-----也就是这个方法
      setStatementTimeout(statement);
      setFetchSize(statement);
      return statement;
    } catch (SQLException e) {
      closeStatement(statement);
      throw e;
    } catch (Exception e) {
      closeStatement(statement);
      throw new ExecutorException("Error preparing statement.  Cause: " + e, e);
    }
  }
protected abstract Statement instantiateStatement(Connection connection) throws SQLException;
该方法为抽象方法,它的实现为


由于我们的是预编译的sql,所以就是PreparedStatementHandler类中的实现方法

 @Override
  protected Statement instantiateStatement(Connection connection) throws SQLException {
    String sql = boundSql.getSql();//<----这就是我们的sql语句
    if (mappedStatement.getKeyGenerator() instanceof Jdbc3KeyGenerator) {
      String[] keyColumnNames = mappedStatement.getKeyColumns();
      if (keyCol
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据权限实现(Mybatis拦截器+JSqlParser) 的相关文章

随机推荐

  • windows系统下通过优盘安装Ubuntu系统

    本文写的是ubuntu14 04 但其它升级版本如16 04等都是可以的 与通过软件 EasyBCD 安装方法相比 windos系统下通过EasyBCD安装ubuntu14 04 优盘安装更加简单 且安装优盘一旦制作好之后 可以多次使用 给
  • 深度医疗(2) - 基于深度学习乳腺癌诊断识别

    深度医疗是笔者基于深度学习的医学项目应用开发实践 经过整理输出了文档和本系列课程 希望通过分享可以和大家共同讨论 相互学习 探索更好的解决方案 笔者是一名普通的大数据和人工智能领域从业者 过程中如有错误和理解不到位的地方请广大同仁不吝赐教
  • 只需五步 集成新版 Elasticsearch7.9 中文搜索 到你的 Laravel7 项目

    只需五步骤 启动 集成ik中文分词插件的Elasticsearch7 9 Docker镜像 Laravel7 配置 Scout 配置 Model模型 导入数据 搜索 演示地址 https www ar414 com search query
  • ElasticSearch学习笔记

    ElasticSearch学习笔记 官网地址 https www elastic co products elasticsearch 官方中文文档地址 https www elastic co guide cn elasticsearch
  • ?101 Redraiment的走法【梅花桩】【最长上升子序列】

    题目描述 题目描述 Redraiment是走梅花桩的高手 Redraiment总是起点不限 从前到后 往高的桩子走 但走的步数最多 不知道为什么 你能替Redraiment研究他最多走的步数吗 样例输入 6 2 5 1 5 4 5 样例输出
  • UniApp组件封装

    什么是UniApp组件 UniApp是一个跨平台的开发框架 允许开发者使用Vue js编写一次代码 然后将其发布到多个平台 包括iOS Android和Web 在UniApp中 组件是构建用户界面的基本单元 它们可以重复使用 并且具有可配置
  • maven编译的时候报错 expected http 101 response but was 500

    暗示着在与某个服务器进行通信时出现了问题 HTTP 101 是一个协议状态码 表示服务器正在切换协议 而 HTTP 500 是服务器内部错误的状态码 表示服务器在处理请求时遇到了问题 这种情况下 有几种可能的原因和解决方法 网络连接问题 请
  • Java项目:企业人事管理系统(java+SSM+jsp+mysql+maven)

    源码获取 博客首页 资源 里下载 一 项目简述 功能介绍 员工管理 用户管理 部门管理 文档管理 职位管理等等 二 项目运行 环境配置 Jdk1 8 Tomcat8 5 mysql Eclispe IntelliJ IDEA Eclispe
  • Servlet过滤器实现网站访问计数器功能

    实现网站在线访问计数器功能 网站的初始值设置为1000 1 创建CountFilter的类 实现javax servlet Filter接口 是一个过滤器对象 通过过滤器实现统计网站人数功能 1 2 3 4 5 6
  • Java中的四种引用

    Java中存在四种引用 它们分别是 1 强引用 StrongReference 强引用是使用最普遍的引用 如果一个对象具有强引用 那垃圾回收器绝不会回收它 当内存空间不足 Java虚拟机宁愿抛出OutOfMemoryError错误 使程序异
  • Ubuntu临时和永久修改ip地址掩码和网关

    在终端修改指定网卡的ip地址 有临时修改和永久修改 查看网卡信息 终端输入 ifcofig 并回车 查看需要修改的网卡名称 临时修改 当重启电脑后 ip地址将恢复为原来的ip地址 此方法适合临时测试使用 1 修改ip和子网掩码 sudo i
  • 安装docker 17.03.2.ce教程

    系统 root master wayne cat etc redhat release CentOS Linux release 7 5 1804 Core 安装步骤 安装 yum config manager yum y install
  • 【Swagger2】标准写法及例子

    ApiModel 和 ApiModelProperty 含义 ApiModel description 用在 JavaBean 类上 说明 JavaBean 的 用途 ApiModelProperty value 用在 JavaBean 类
  • php保存tsv格式,PHP header发送各种类型文件及设置文件上载名

    PHP header发送各种类型文件及设置文件下载名 header Content type application image pjpeg 输出的类型 header Content Disposition attachment filen
  • Python类和对象

    什么是 Python 类 python 中的类是创建特定对象的蓝图 它使您可以以特定方式构建软件 问题来了 怎么办 类允许我们以一种易于重用的方式对我们的数据和函数进行逻辑分组 并在需要时进行构建 考虑下图 类变量是一个类的所有不同对象 实
  • iceberg对比hive优势

    1 事务性 从事务性上来说 iceberg具有更高的数据质量 因为iceberg本质是一种table format 屏蔽了底层的存储细节 写入数据时候需要严格按照schema写入 而hive可以先写入底层数据 然后使用load partit
  • 使用Pandas进行数据预处理 笔记3 任务 5.3 标准化数据

    文章目录 5 3 标准化数据 5 3 1 离差标准化数据 5 3 2 标准差标准化数据 代码 5 27 标准差标准化示例 5 3 3 小数定标标准化数据 代码 5 28 小数定标标准化示例 5 3 4 任务实现 代码 5 29 对订单详情表
  • 中国裁判文书网接口解密

    中国裁判文书网接口解密 前景提要 具体实现 数据解密 传参解密 结语 前景提要 最近有个采集中国裁判文书网的需求 做下来觉得接口加密方式还挺有意思的 分享一下解密过程 具体实现 数据解密 首先找到页面上对应数据来源于哪个接口 很明显是某种加
  • Android 获取视频(本地和网络)缩略图的解决方案

    在Android 开发视频的时候 通常都需要显示视频列表 而视频列表通常都有一张视频缩略图 那么它是怎么获取的呢 关于网络视频的缩略图的实现方案主要有两种 1 后台返回视频时顺便连缩略图的路径都返回给你了 这样前端压力轻松 2 后台是返回视
  • 数据权限实现(Mybatis拦截器+JSqlParser)

    由于本人才疏学浅 刚刚入门 本文章是我在实现数据权限的过程中的学习体会 总体思想 一 Mybatis拦截器 参考 Mybatis中文官网 慕课网Mybatis方面视频 SQL解析 引用官网说明 MyBatis 允许你在已映射语句执行过程中的