Skip to content

Latest commit

 

History

History
77 lines (49 loc) · 2.67 KB

QAS.md

File metadata and controls

77 lines (49 loc) · 2.67 KB
1.Mybaits动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理
答:动态sql是为了在xml里面能够逻辑编写sql,或者去除逗号问题等等,如使用<if>标签去判断是否为null
比如有if、where、trim、set、foreach等标签
调用XmlScriptBuilder.parseDynamicTags方法把动态SQl通过各个对应的NodeHandler解析成一个对应的sqlNode,
存储一个List<SqlNode>的泛型集合,然后封存成MixedSqlNode返回,最终通过MixedSqlNode以及Configuration
构建DynamicSqlSource,并且构建BoundSql
2.Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
支持,可以通过配置lazyLoadingEnabled=true或者false设置是否开启
<settings> 
        <setting name="lazyLoadingEnabled" value="true" />
 </settings> 
它的实现原理是:使用CGLiB

3.Mybatis都有哪些Executor执行器?它们之间的区别是什么?
Executor 接口
BaseExecutor: 通用实现类,下面这个执行器的抽象提取部分
SimpleExecutor :每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。
CachingExecutor:二级缓存的Executor
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。

4.简述下Mybaits的一级、二级缓存(分别从存储结构、范围、失效场景)三个方面来作答?
一级缓存:
	存储结构:基于PerpetualCache的HashMap(本地)
	范围:sqlSession级别
	失效场景:执行了增删改操作
	
二级缓存
  存储结构:基于PerpetualCache的HashMap(本地)
	范围:namespace级别或者说Mapper级别
	失效场景:执行了增删改事务性操作


5.简述Mybatis的插件运行原理,以及如何编写一个插件
1.实现Interceptor接口
	实现Intercept方法,插件逻辑在这里增强
	实现plugin方法,生成代理对象
	setProperties,插件需要的参数在这里设置
2.在该实现类顶上@Intercepts注解,以及@Signature注解集
3.在sqlMapConfig.xml里面配置
 
<plugins>
    <plugin interceptor="YourPlugin">
    </plugin>
</plugins>