在这里记录一下我面试甲方和外包遇到的SSM相关的面试题。
SpringMVC面试题:
1、说一下MVC的执行流程(请求流程或者一个request要经过哪些类)?(高频)
用户发起请求到前端控制器(DispatchServlet);
前端控制器接到请求后会调用HandlerMapping处理映射器;
HandlerMapping根据url,查找该url对应方法的反射对象(具体的处理器),生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet;
DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter;
适配器执行handler,通过反射调用controller中的业务方法(处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作);
handler执行完成后返回一个ModelandView对象给前端控制器;
前端控制器将modelanview传给viewReslover视图解析器;
视图解析器解析后返回具体的view;
前端控制器根据view进行视图的渲染(将模型数据填充到视图中);
DispatcherServlet响应用户;
2、说一说SSM常用的注解?
3、说一说一个客户请求,从前端到后台的整个流程(一个http请求的会经过哪些流程)?
Spring面试题点击此处。
Mybatis面试题:
1、Mybatis中#{},${}的区别?
#{}会被预编译成占位符,可以防止SQL注入问题,不需要数据类型的手动转换,一个参数时可以使用任意的参数名接收参数。
${}非预编译,直接SQL拼接,不可以防止SQL注入,需要关注数据类型的转换(如字符串类型’ ${id} '),一个参数时默认必须是value接收。
2、怎么防止SQL注入?
代码层防止SQL注入攻击方式的最佳方案就是SQL预编译(原始使用preparement,mybatis使用#{})。
确认每种数据的类型,比如是数字,数据库则必须使用int类型来存储。
规定数据长度,能在一定程度上防止SQL注入。
严格限制数据库权限,能最大程度减少SQL注入的危害。
避免直接响应一些SQL异常信息,SQL发生异常后,自定义异常进行响应。
过滤参数中含有的一些数据库关键词(前后端都可以进行,正则表达式。)
3、Mybatis的动态SQL,常用的动态标签?
动态sql,常见标签
choose(when,otherwise), trim(where,set),foreach,sql片段。
4、Mybatis的优缺点?
Mybatis的优缺点
5、说一下Mybatis的一级缓存和二级缓存?
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
缓存的使用顺序(二级缓存需要手动开启,使用二级缓存可能引起脏读问题,这个出现的原因是因为不同的Mapper查询隔离分别使用不同的存储空间,那么当两个Mapper操作同一张表时就出现脏读的问题,解决方案使缓存区共享):
当mybatis执行一个查询的时候,会先去二级缓存中查询数据。有就直接返回。
如果二级缓存中没有数据,再到一级缓存中获取,有就直接返回。
如果二级,一级都没有要查的数据,则发sql语句到数据库查询。
查到结果后会马上放到一级缓存中。
当SqlSession关闭的时候,会把一级缓存中的数据同步到二级缓存中。
6、mybatis和mybatis-plus的区别?
Mybatis-Plus是一个Mybatis的增强工具,它在Mybatis的基础上做了增强,却不做改变。我们在使用Mybatis-Plus之后既可以使用Mybatis-Plus的特有功能,又能够正常使用Mybatis的原生功能。Mybatis-Plus简称MP是为简化开发、提高开发效率而生,但它也提供了一些很有意思的插件,比如SQL性能监控、乐观锁、执行分析等。
专注和简单一直是我的秘诀之一。简单可能比复杂更难做到:你必须努力思路理清,从而使其变得简单。但最终这是值得的,因为一旦你做到了,便可以创造奇迹。