# IPersistence **Repository Path**: mydxd/ipersistence ## Basic Information - **Project Name**: IPersistence - **Description**: 自定义简单的mybatis实现 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-25 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IPersistence #### 介绍 自定义简单的mybatis实现 #### 软件架构 软件架构说明 一、简答题 1、Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理? 在复杂的查询下,动态的根据属性值,来拼接成不同的SQL语句 在构建SqlSessionFactory时会调用 build方法,此方法会调用mapperElement方法,通过XMLMapperBuilder的parse方法,再调用configurationElement方法,再调用buildStatementFromContext方法, 再调用parseStatementNode方法,根据里面的langDriver.createSqlSource方法,再通过XMLScriptBuilder这个类的parseScriptNode方法调用到了parseDynamicTags方法,根据不同的hander解析不同的动态标签, 再返回一个sqlSource,执行动态查询时,执行到BaseExecutor类中query方法时,会执行其中的getBoundSql方法,其中调用了SqlSource接口中的getBoundSql方法,得到一个BoundSql类,其中封装了解析好的SQL语句 2、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么? 支持延迟加载,需要手动配置lazyLoadingEnabled为true 运用动态代理,当调用一个配置了延迟加载的方法的时候,动态代理操作被触发,拦截到指定方法进行数据加载 3、Mybatis都有哪些Executor执行器?它们之间的区别是什么? BaseExecutor:执行器通用类,提供所有执行器的通用操作 BatchExecutor:批量操作的执行器 CachingExecutor:操作缓存的执行器 ReuseExecutor:预处理执行器 SimpleExecutor:默认的执行器 4、简述下Mybatis的一级、二级缓存(分别从存储结构、范围、失效场景。三个方面来作答)? mybatis一级缓存是sqlSession级别的缓存,底层数据结构为hashMap,两次查询之间有数据的更新或插入操作则缓存失效 二级缓存是namespace级别的缓存,底层结构默认是HashMap,用户可以自定义存储介质,两次查询之间有数据的更新或插入后失效,也可以自定义失效场景 5、简述Mybatis的插件运行原理,以及如何编写一个插件? 对于MyBatis来说,插件就是拦截器。增强功能本质上是借助动态代理来实现的,在mybatis四大对象创建的时候,每个创建出来的对象不是直接返回的,而是通过责任链模式返回一个代理对象, 代理对象是其原先核心对象的包装,在代理对象中,我们可以对原先对象的功能进行增强。 1)自定义一个类实现Interceptor 接口 2)类上使用@Intercepts和@Signature注解,表示拦截哪个核心对象的哪个方法,以及方法参数是哪些 3)增强被拦截的方法功能,设置属性,以及将当前的拦截器加入到拦截器链中 4)在SqlMapConfig.xml中增加配置