1.Mybatis都有哪些Executor执行器?它们之间的区别是什么?
Mybatis有三种基本的Executor执行器,SimpleExecutor
、ReuseExecutor
、BatchExecutor
。
SimpleExecutor
:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor
:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor
:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内
2.MyBatis中接口绑定有几种实现方式?
1.通过注解,在接口上面加上@select,@Update 注解加上sql绑定
2.通过xml写sql来绑定,指定xml映射文件里面的namespace作为接口的全路径名
3.Mybatis 是如何进行分页的?
ybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页,先把数据都查出来,然后再做分页。
可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页
4.分页插件的基本原理是什么?
分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql(SQL 拼接 limit),根据 dialect 方言,添加对应的物理分页语句和物理分页参数,用到了技术 JDK 动态代理,用到了责任链设计模式。
5.简述Mybatis的插件运行原理
Mybatis仅可以编写针对 ParameterHandler
、ResultSetHandler
、StatementHandler
、Executor
这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler
的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。