1、 Mybatis的工作流程
- 1、读取配置文件,根据XML配置文件创建Conifuration
- 2、根据配置信息 创建SqlSessionFactory,SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡
- 3、SqlSessionFactory 创建 SqlSession,SqlSession是过程级,一个方法开始时建立,方法结束应该关闭
- 4、获取mapper接口的代理对象(DefaultSqlSession.getMapper()拿到Mapper接口对应的MapperProxy)
- 5、执行增删改查方法
5.1 调用DefaultSqlSession的增删改查(Executor);
5.2 会创建一个StatementHandler对象(同时也会创建出ParameterHandler和ResultSetHandler);
5.3 调用StatementHandler预编译参数以及设置参数值(使用ParameterHandler来给sql设置参数);
5.4 调用StatementHandler的增删改查方法;
5.5 ResultSetHandler封装结果;
2、Mybatis 核心对象
- Configuration: MyBatis所有的配置信息都维持在Configuration对象之中
- SqlSession: 负责和数据库进行交互,实现完成常对数据操作的增删改查功能
- Executor: Mybatis执行器,调度的核心,负责SQL语句的生成和维护
- StatementHandler :封装并操作Jdbc statement,例如设置参数,将statement结果集转化为List集合
- ParameterHandler: 负责将用户传递的参数转换为Jdbc statement所需要的参数进行传递
- ResultSetHandler: 负责将Jdbc返回的ResultSet结果集对象转换为List类型的集合
- TypeHandler: 负责将java数据类型和Jdbc数据类型之间的转换和映射
- MappedStatement: MappedStatement维护了一条mapper.xml文件里面 select 、update、delete、insert节点的封装
- BoundSql: 表示动态生成的SQL语句以及相应的参数信息
3、Mybatis拦截器
在很多业务场景下我们需要去拦截sql,达到不入侵原有代码业务处理一些东西,比如:分页操作,数据权限过滤操作,SQL执行时间性能监控等等,Mybatis拦截器设计的思路是为了供用户灵活的实现自己的逻辑,而不动mybatis固有的逻辑。通过Mybatis拦截器我们能拦截某些方法的调用,我们可以选择在这些被拦截方法执行前后加上我们自己的逻辑,达到丰富方法的效果;也可以在执行这些方法的时候拦截住,转而实现自己设计的方法,而最后不执行被拦截的方法。
在mybatis中可被拦截的类型有四种(按照拦截顺序):
- Executor:拦截执行器的方法;
- ParameterHandler:拦截参数的处理;
- ResultHandler:拦截结果集的处理;
- StatementHandler:拦截Sql语法构建的处理;
拦截器一般在业务处理中用于:
- 1、分页查询
- 2、多租户添加条件过滤,即数据权限过滤操作
- 3、对返回结果,过滤掉审计字段,敏感字段(比如手机号)
- 4、对返回结果中的加密数据进行解密
- 5、对新增数据自动添加创建人,创建时间,更新时间,更新人 ,对更新数据自动新增更新时间,更新人
- 6、打印SQL执行日志、执行时间
3.1 分页拦截器
mybatisplus 分页拦截器 PaginationInnerInterceptor
// 使用
Page producePage = new Page<>(1,1);
Page page = produceService.selectList(producePage);
拦截器的核心如下图,当我们的select方法的入参 属于(instanceof) IPage时(如上面的 producePage ),
才会执行分页;或者是当入参为Map时,查询map中是否存在属于(instanceof) IPage 的对象。
优点:通过Page<>泛型,使用简单,性能好;
缺点:如果项目中有很多以Map作为入参的查询方法,就算不是分页接口,每次都会被拦截过滤,影响性能,由于是对于高并发接口。
对于在Mapper 入参中使用 @Param 的查询方法,也会被拦截到,这会导致性能问题。
github分页拦截器 PageInterceptor
Page