Java编程语言爱好者Java服务器端编程

Mybatis常见面试题

2021-02-09  本文已影响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二级缓存

上一篇下一篇

猜你喜欢

热点阅读