1、mybatis插件机制
插件
MyBatis所述的插件功能,其实就是一个拦截器功能。
概述
1、在四大对象创建的时候,每个创建出来的对象不是直接返回的,而是通过interceptorChain.pluginAll(parameterHandler)返回的。
2、pluginAll获取到所有的Interceptor(拦截器)(插件需要实现的接口),调用Interceptor.pluginAll(target),返回target被包装后的对象。
3、插件机制:我们可以使用插件为目标对象创建一个代理对象:AOP(面向切面)
我们的插件可以为四大对象创建出代理对象,代理对象就可以拦截四大对象的每一个执行(方法)。
public Object pluginAll(Object target) {
for (Interceptor interceptor : interceptors) {
target = interceptor.plugin(target);
}
return target;
}
插件机制的实现主要分为以下几步:
Configuration初始化期间解析Plugins标签加入拦截链InterceptorChain
执行SQL过程中在Executor,ParameterHandler初始化的时候调用pluginAll()方法生成相应的代理类;
执行Executor,ParameterHandler等类的方法时候会执行相应的代理类的方法;
在调用pluginAll()方法生成代理类的时候会遍历拦截链列表中所有的拦截器,层层嵌套生成代理类;配置文件中越靠下的插件配置,越在嵌套代理类的外层;
层层代理会影响系统性能,因此要减少没有必要的代理;
2、mybatis主键和其它索引的数据结构有什么区别?
普通索引:最基本的索引,没有任何限制
唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它 是一种特殊的唯一索引,不允许有空值。
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
InnoDB的数据文件本身就是索引文件。InnoDB的辅助索引data域存储相应记录主键的值而不是地址。
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
数据结构不取决于索引。。取决于引擎。。现在大部分都是B-Tree和B+Tree。
3、mybatis的原理?
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情:
1. 封装JDBC操作
2. 利用反射打通Java类与SQL语句之间的相互转换
MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。
Mybatis 的运行过程:
1. 读取配置文件创建 Configuration 对象, 用以创建 SqlSessionFactroy.
2. SQLSession 的执行过程.