1.Mybatis动态sql是做什么的?都有哪些动态sql,简单描述一下动态sql的执行原理?
Mybatis动态sql是 指在映射文件xml中可以通过标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
有9种动态sql标签:trim/where/set/foeach/if/choose/when/otherwise/bind。
执行原理为使用OGNL从sql参数对象种计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。
2.Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载
association指的就是一对一,collection指的就是一对多查询。
在mybatis中可以配置是否启用延迟加载lazyLoadingEnabled=true|false
3.Mybatis都有哪些Executor执行器?它们之间的区别是什么?
SimpleExecutor:每执行一次update或者select就开启一个statement对象,用完立刻关闭statement。
ReuseExecutor:执行update或者select以sql作为key查找statement对象,存在就是用,不存在就创建一个新的。
使用完毕以后不关闭statement对象而是将他存放到Map<String,Statement>中供下一次使用,简言之就是重复使用statement。
BatchExecutor:执行update将所有sql都添加到批处理中(addBatch()),等待统一执行executeBatch(),它缓存了多个statement对象,
每个statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理的。
4.简单描述一下Mybatis的一级,二级缓存(分别从存储结构,范围,失效场景。三个方面进行作答)?
Mybatis的缓存分为一级缓存和二级缓存:
一级缓存:存放在session里面,默认开启,只在单个sqlsession中有效。
二级缓存:存放在namespace里面,默认开启,在整个namespace中有效。
5.简单描述一下Mybatis的插件运行原理,以及如何编写一个插件?
Mybatis插件的本质是拦截器Interceptor,Mybatis使用的是JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能。
每当执行插件时就会进入拦截方法,具体就是InvocationHandler的invoke()方法。
实现Mybatis的Interceptor接口并重写intercept()方法,然后给插件编写注解。