type
status
date
slug
summary
tags
category
icon
password
背景
面试官:在saas系统里,如何保证商家不会越权访问其他商家的数据?
我:每次查询数据使用商家id和门店id作为筛选条件
面试官:如果开发者忘记传这个数据或者sql里忘记加这个筛选条件这么办呢?
我:在mapper做数据校验,如果商家id或者门店id为空报错(其实这种情况无法避免第二种情况)
面试官:可以使用mybatis插件进行拦截
mybatis插件
能做什么?
- sql重写:在sql语句发送到数据库之前,对语句进行修改或者重写,以满足业务需求
- 日志记录:在sql语句执行的过程中,打印参数,执行时间等,用于分析问题和性能分析
- 性能监控,统计sql语句的执行时间,次数指标,实时监控系统的数据库访问性能
- 事物处理管理器:在事物提交或者回滚之前,记录事物执行日志,状态
- 结果集处理:对查询结果进行后续处理,如数据格式化,数据脱敏等
如何做
mybatis插件的核心在于拦截下面核心组件的方法调用实现上面功能
- execcutor:执行器,负责执行sql语句的执行和事务管理
- StatementHandler:语句处理器,包括预编译和参数设置
- ParameterHandler:参数处理器,负责将用户输入的参数转换成jdbc可识别的参数
- ResultSetHandler:结果集处理器,负责将jdbc返回的结果集转换成用户所需要的对象或者集合
通过拦截这些方法,mybatis插件可以实现诸如SQL重写、日志记录、性能监控、事务管理增强等多种功能。
mybstis原理
mybstis插件的实现原理基于Java的动态代理机制。当mybstis检测到有插件配置时,他会为对象创建一个代理对象,代理对象包装了原始对象,可以执行自定义拦截逻辑