SSM框架
第一部分:Spring
1.简述什么是Spring框架
Spring 框架是一个主流的 Java Web 开发框架:
-
基于POJO的轻量级和最小侵入性编程;
-
通过依赖注入和面向接口实现松耦合;
-
基于切面和惯例进行声明式编程;
-
通过切面和模板减少样板式代码。
3.Spring中bean的作用域
Bean的作用域是指spring容器从创建Bean到销毁的整个过程
-
singleton,每个Bean的实例只创建一次
-
prototype,每次获取Bean实例时都会新创建一个实例对象。
-
request,对于每次HTTP请求,Spring容器都会创建一个Bean实例,整个请求过程使用相同的bean实例。不同的请求创建新的实例
-
session,对于HTTP Session,每次会创建一个Session作用域的Bean
-
globalsession,每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例
4.Spring框架中的Bean是线程安全的么?
Spring框架中的单例bean不是线程安全的
非线程安全:Singleton(默认): Spring容器只存在一个共享的bean实例。
线程安全: Prototype: 每次对bean的请求都会创建一个新的bean实例。
5.@Autowired和@Resource的区别
-
@Autowired是Spring的,@Resource是javax包下的
-
@Autowired默认按类型匹配,@Resource默认按名称匹配
6.Spring中bean的生命周期
bean的生命周期描述的是Spring中的一个bean的创建过程和销毁过程中所经历的步骤。
-
BeanDefinition对象的创建(bean定义)
-
构造方法的推断:(选出一个构造方法)
-
实例化:(构造方法通过反射得到对象)
-
属性填充:给属性进行自动赋值
-
初始化对其他属性赋值,校验
-
初始化后:AOP生成代理对象
7.Spring的事务传播机制
-
REQUIRED(Spring默认的事务传播类型): 如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务。
-
SUPPORTS: 如果当前存在事务,则加入当前事务,如果当前不存在事务,则以非事务方法执行。
-
MANDATORY: 如果当前存在事务,则加入当前事务,如果当前不存在事务,则抛出异常。
-
REQUIRES_NEW: 创建一个新事务,如果当前存在事务,则挂起该事务。
-
NOT_SUPPORTED: 以非事务方式执行,如果当前存在事务,则挂起该事务。
-
NEVER: 不使用事务,如果当前存在事务,则抛出异常。
-
NESTED: 如果当前存在事务,则在嵌套事务内执行,如果当前不存在事务,则新建一个事务。
8.Spring中的事务隔离级别
-
DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别
-
未提交读(read uncommited):脏读,不可重复读,虚读都有可能发生
-
已提交读(read commite):避免脏读。但是不可重复读和虚读有可能发生
-
可重复读(repeatable read):避免脏读和不可重复读.但是虚读有可能发生
-
串行化的(serializable):避免以上所有读问题
第二部分:SpringMVC
1.什么是MVC,以及简述Springmvc。
MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写(编程模式),将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间.
SpringMVC是一个基于MVC编程模式的Web框架,也是Spring的子模块
2.SpringMVC的执行流程?
-
用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获
-
DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
-
DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)
-
提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作: HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
-
Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
-
根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
-
ViewResolver 结合Model和View,来渲染视图
-
将渲染结果返回给客户端。
3.什么是重定向和转发,在SpringMVC如何实现重定向和转发?
转发是服务器行为, 重定向是客户端行为,如果请求是跳转页面,重定向和转发都可以做到,但如果需要回传消息的时候只有转发能做到:
-
转发使用的是request对象,等待处理完成之后继续跳转一次页面,因为request是一个作用域,故可以将信息携带到指定的参数到指定的页面中去
-
重定向就是我们客户端服务器发出请求,请求直接返回了另一个请求地址,然后浏览器会自动再次用返回的地址来向服务器发出返回的的请求。这里我们可以发现重定向的过程,因为URL变成了请求B。
4.@RestController和 @Controller区别是什么?
@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
5.SpringMVC中拦截器如何实现?
-
用户发送请求,经过前端控制器Dispacherservlet(Controller的核心)将url交给处理器映射器HandlerMapping处理
-
处理器映射器HandlerMapping处理url,返回HandlerExecutionChain(可能包含拦截器,一定包含自定义的Controller(handler))
-
前端控制器将Controller交给处理器适配器HandlerAdapter处理,处理完成后,返回MV对象(ModelAndView)
-
前端控制器将MV交给视图解析器处理ViewResolver,处理的过程:将MV拆分成Model和view两个对象,并且将model渲染到view视图上,并且将view返回给前端控制器。
-
最后,前端控制器将视图响应给用户.
6.拦截器和过滤器的区别?
-
拦截器(Interceptor)只对action请求起作用 即对外访问路径 而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件
-
拦截器(Interceptor)是在Servlet和Controller控制器之间执行 而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行
7.什么是RESTFUL?
restful 就是一个资源定位及资源操作的风格。不是标准也不是协议,相当于freestyle。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
第三部分:MyBatis
1.什么是MyBatis?
-
MyBatis 是一款优秀的持久层框架
-
它支持自定义 SQL、存储过程以及高级映射
-
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录
2. #{} 和 ${} 的区别?
-
#{}是预编译处理,是占位符,${}是字符串替换,是拼接符
-
Mybatis在处理#{}的时候会将sql中的#{}替换成?号,调用PreparedStatement来赋值
-
Mybatis在处理${}的时候就是把${}替换成变量的值,调用Statement来赋值\
-
#{}的变量替换是在DBMS中、变量替换后,#{}对应的变量自动加上单引号
-
${}的变量替换是在DBMS外、变量替换后,${}对应的变量不会加上单引号
-
使用#{}可以有效的防止sql注入,提高系统的安全性
3.简述MyBatis一级和二级缓存?
-
一级缓存作用域是sqlsession级别的,同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,第二次从一级缓存中取。一级缓存是基于 PerpetualCache 的 HashMap 本地缓存,默认打开一级缓存。
-
它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。
4.如何获取自增的主键?
-
通过JDBC2.0提供的insertRow()方式
-
通过JDBC3.0提供的getGeneratedKeys()方式
-
通过SQL select LAST_INSERT_ID()函数
-
通过SQL @@IDENTITY 变量
5. resultType 和 resultMap的区别?
-
resultType直接表示返回类型,包括基础数据类型和复杂数据类型
-
resultMap是对外部resultMap定义的引用,对应外部resultMap的id,表示返回结果到哪一个resultMap上。
-
MyBatis的每个查询映射的返回类型都是 resultMap,只是当我们提供的返回类型属性是resultType 的时候,MyBatis 会自动把对应的值赋给resultType所指定对象的属性;而当我们提供的返回类型属性是 resultMap 的时候,因为 Map不能很好地表示领域模型,就需要通过进一步的定义把它转化为对应的实体对象
6.当实体类属性名和表中字段名不一致时如何处理?
-
通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类
的属性名一致.
-
通过<resultMap>来映射字段名和实体类属性名的一一对应的关系
7.Mybatis接口中传递多个参数时如何处理?
-
接口中传多个参数,在 xml 中使用 #{param0}、#{param1}...
-
使用 @param 注解指定名称,在 xml 中使用 #{名称}
-
、多个参数封装到 Java bean 中
-
多个参数指定 key,put 到 Map 中
8.写出你知道的动态sql标签?
-
if标签(逻辑判断)
-
where标签(SQL判断)
-
choose,when,otherwise(Java中的switch)
-
set (sql修改)
-
trim(截断 添加)
-
bind(模糊查询)
-
foreach(循环)
-
sql (复用)