Mybatis 动态 SQL 通过XML 映射文件内,添加条件判断标签,达到动态拼接 SQL 的功能。动态sql 有 <if> 标签 <where>标签 <foreach> 标签
Mybatis 通过底层java 动态代理实现对 xml中的<insert> 、<select>等标签中的sqlText 进行 加载 、解析、最后通过Executor 执行器执行。
2: Mybatis仅支持association(一对一)关联对象和collection(一对多)关联集合对象的延迟加载。在Mybatis配置文件中,通过在sqlconfig.xml配置文件中使用<setting>标签启用延迟加载。需要将lazyLoadingEnabled属性设置为true 它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法。
3:Mybatis中的Executor 执行器有:SimpleExecutor,ReuseExecutor、BatchExecutor。
simpleExecutor 每执行一次update 或者 select 操作 就开启一个statement 对象 用完后立刻关闭。ReuseExecutor执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。BatchExecutor执行update 操作将所有的sql通过addBatch 添加到 批处理中等待统一执行。执行范围在Sqlsesstion内
4:Mybatis 的一级二级缓存都是通过Map 数据结构进行存储 一级缓存作用范围为一个SqlSesstion 二级缓是可以跨SqlSesstion 。如果有update 操作 一级二级缓存都会失效 当再次select 操作时会重新查询数据库然后将查询到的数据放入到缓存中。
5:Mybatis通过实现Intercepter 接口 调用pluginAll方法起底层通过动态代理对Executor 、StatementHandler、ParamterHandler、ResultSetHandler 四大对象进行拦截。起到一个方法增强。自定义插件分两步走:
第一步:1 自定义一个插件类并实现Interceptor 接口与此同时实现该接口中的方法
2:通过@Interceptors注解设置当前的拦截器需要拦截哪一个核心对象中的哪一个方法
第二步:将我们自定义的插件类在sqlMapConfig.xml 文件中通过使用<plugins>标签下的子标签<plugin>进行配置