1、Mybatis源码中用了哪些设计模式?为什么要用这些设计模式?

2、MyBatis打开调试模式之后,能打印sql语句等信息,这是怎么实现的?实现过程中使用了什么设计模式?

3、请详细描述从数据库连接池中获取一个连接资源的过程?

4、MyBatis是如何为二级缓存动态添加日志、同步控制、阻塞、缓存淘汰策略等附加能力的?用了什么设计模式?

5、请描述从数据库连接池获取一个数据连接的过程;

6、结合源码说说什么是缓存雪崩?如何解决?

7、mybatis的优点有哪些?MyBatis框架的缺点有哪些?

答案:优点:基于SQL语句编程,非常的灵活,不会对应用程序或者是数据库的现有设计造成影响,SQL写在XML里面,解除sql和程序代码的耦合,有助于统一管理;提供XML标签,支持编写动态SQL语句,并可重用;和JDBC比较起来,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要去手动开关连接;可以很好的和各种数据库兼容;可以很好的和Spring集成;提供映射标签,支持对象和数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
缺点:编写工作量大,SQL语句依赖于数据库,数据库移植性差,不可以随意的去更换数据库。
推荐阅读:mybatis优缺点是什么?有哪些优点和缺点?

8、MyBatis和Hibernate的区别有哪些?

答案:不完全是一个ORM框架;Mybatis直接编写原生态sql,能够严格控制sql执行性能,灵活度高,但是,假如要实现支持多种数据库的软件,那么就要自定义多套sql映射文件,工作量比较大;Hibernate对象和关系映射能力强,数据库无关性好,对于关系模型要求高的软件,假如要用hibernate开发,能够节省很多的代码,提高效率。

9、#{}和${}的有什么区别?

答案:#{}是预编译处理,${}是字符串替换;Mybatis在处理#{}的时候,会把sql当中的#{}替换成为?号,调用PreparedStatement的set方法来赋值;Mybatis在处理${}的时候,会将${}替换成变量的值;使用#{}能够有效的防止SQL注入,提高系统安全性

10 一级缓存 二级缓存