Mybatis常见面试题

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-02-09 09:23 被阅读0次

    上一篇 <<<Springboot整合Mybatis二级缓存
    下一篇 >>>Spring IOC的初始化原理


    1.XMLConfigBuilder、Configuration、mapperRegistry的作用

    XMLConfigBuilder—配置文件的具体解析类
    Configuration—配置文件解析后的bean信息,全局唯一
    mapperRegistry---接口配置和具体实现的关系类,存放所有的接口信息

    2.MapperProxy、MapperProxyFactory 分别的作用是什么

    MapperProxyFactory是工厂类,可以实例化MapperProxy。
    MapperProxy是具体的代理类,使用了JDK的代理模式,继承了InvocationHandler方法,调用invoke方法执行目标对象的方法。

    3.Map<Class<?>, MapperProxyFactory<?>> knownMappers的key和value分别存放的作用是什么

    key存放的是接口类- com.jarye.mapper.UserMapper
    value存放的是可以接口代理类的工厂,后续可以实例化接口的代理类并具有缓存功能。

    4.Executor执行接口有那些类,作用分别是?

    1、SimpleExecutor: 默认的 Executor,每个 SQL 执行时都会创建新的 Statement
    2、ResuseExecutor: 相同的 SQL 会复用 Statement
    3、BatchExecutor: 用于批处理的 Executor
    4、CachingExecutor: 可缓存数据的 Executor,用代理模式包装了其它类型的 Executor
    CachingExecutor为二级缓存执行器,BaseExecutor为一级缓存执行器。
    默认情况下使用缓存的CachingExecutor

    5.一级缓存与二级缓存的区别?

    ①、一级缓存SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(sqlHashMap)是互相不影响的。
    ②、二级缓存mapper级别的缓存,多个SqlSession去操作同一个Mapper的语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
    注意:sqlSession缓存底层存在线程安全问题。
    一级缓存是绝对有的,二级缓存(硬盘、Redis、EHCache)是可以没有的(表示没用使用,配置存储介质,就不会缓存,相当于空壳的)。

    6.StatementHandler接口下有那些类,作用分别是什么

    StatementHandler接口的实现大致有四个,其中三个实现类都是和JDBC中的Statement响对应的:
    SimpleStatementHandler,这个很简单了,就是对应我们JDBC中常用的Statement接口,用于简单SQL的处理; 存在sql注入攻击问题
    PreparedStatementHandler,这个对应JDBC中的PreparedStatement,预编译SQL的接口;
    防止sql注入
    CallableStatementHandler,这个对应JDBC中CallableStatement,用于执行存储过程相关的接口;
    RoutingStatementHandler,这个接口是以上三个接口的路由,没有实际操作,只是负责上面三个StatementHandler的创建及调用。


    7.MyBatis中使用到了哪些设计模式

    Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
    工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
    单例模式,例如ErrorContext和LogFactory;
    代理模式,Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
    组合模式,例如SqlNode和各个子类ChooseSqlNode等;
    模板方法模式,例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;
    适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
    装饰者模式,例如Cache包中的cache.decorators子包中等各个装饰者的实现;
    迭代器模式,例如迭代器模式PropertyTokenizer;


    推荐阅读:
    <<<Mybatis的整体执行原理图解
    <<<SqlSessionFactory的创建过程原理
    <<<SqlSession的创建过程
    <<<sqlSession如何获得具体的Mapper接口信息
    <<<userMapper.getUser(1);底层实现原理
    <<<sqlSession.selectOne底层实现原理
    <<<Mybatis一级缓存知识汇总
    <<<Mybatis二级缓存知识汇总
    <<<Springboot整合Mybatis二级缓存

    相关文章

      网友评论

        本文标题:Mybatis常见面试题

        本文链接:https://www.haomeiwen.com/subject/vhfktltx.html