Java面试题—框架篇

Mybatis介绍

Mybatis作为一个持久层框架,对jdbc操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花精力去处理例如注册驱动、创建connection、创建statement、设置参数、结果集检索等jdbc繁杂的代码过程。Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatement、CallableStatement)配置起来,并通过Java对象和statement中的sql进行映射生成最终执行的sql语句,最后由Mybatis框架执行sql并将结果映射成Java对象返回。

Mybatis解决jdbc编程的问题:

  1. 数据库频繁的连接创建、释放造成资源浪费;在SqlMapConfig.xml中配置数据库连接池进行管理
  2. SQL语句写在Java代码中不易维护;将SQL语句配置在XXXmapper.xml文件中,实现代码分离
  3. sql传参麻烦;Mybatis自动将java对象映射至SQL语句,通过statement中的parameterType定义输入参数的类型
  4. 对象解析麻烦;Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型

Mybatis参数传递#{} 和 ${} 参考
#{}和${}最大的区别就是#{}会在使用的时候被加上 '' 引号,${}直接传值不做任何处理
select * from info where name= #{name} #传递得到的结果是:...where name = '博客园'
select * from info where name= ${name} #传递得到的结果是:...where name = 博客园
#{}最大的好处就是可以很大程度上防止SQL注入,#{}会对传入的参数做预编译处理,也就是会当做字符串来处理。${}则会把值直接传递给sql,如name = xxx and 1=1这种情况就会导致恶意注入sql获取信息或其他恶意操作,很危险。


Mybatis和Hibernate

  • 相同点:
    Hibernate与Mybatis都可以是通过SessionFactoryBuilder由XML配置文件生成SessionFactory,然后由SessionFactory生成Session,最后由Session来开启执行事务和SQL语句。
  • 不同点:
    1. 对象管理的对比:Hibernate是ORM解决方案,采用面向对象的视角来持久化Java应用中的数据,移植性更好,Mybatis需要自行写SQL管理。
    2. sql优化方面:Hibernate的查询会把表中所有字段查询出来,存在性能损耗。Mybatis的sql是手动编写的,按需查找。
    3. 开发速度对比:考虑两者的特性及性能,还有实际项目需求;如果只是简单的CRUD选Hibernate,对于大型项目涉及到复杂sql选Mybatis。

Hibernate缓存
Hibernate一级缓存是Session缓存,对Session的生命周期进行管理。
Hibernate二级缓存是SessionFactory缓存,被所有Session共享,除了以内存作为存储介质外还可以选用硬盘等外部存储设备。


Spring和SpringMVC

Spring是一个一站式的框架,提供了表现层(SpringMVC)到业务层(Spring)再到数据层(Springdata)的全套解决方案,Spring的两大核心IOC(控制反转)和AOP(面向切面编程)。Spring IOC和AOP 原理

  • IOC:控制反转,传统过程中当一个对象依赖于另一个对象时,会由该对象去创建另一个对象,有了IOC后将创建过程交给IOC,又Spring创建bean,从而只需要给该对象注入即可。Spring IOC原理
  • AOP:面向切面编程,将公共服务封装到一个可重用模块,比如权限认证、日志管理、事务处理等。Spring AOP简单Demo实现

SpringMVC执行

  1. 用户请求匹配DispatcherServlet(前端控制器)的请求映射路径(在web.xml中指定),Web容器将该请求转交给DispatcherServlet处理
  2. DispatcherServlet接收到请求后,将根据请求信息交给HandlerMapping(处理器映射器)
  3. HandlerMapping根据用户的url请求查询匹配该url的Handler(处理器),并返回一个执行链
  4. DispatcherServlet在请求HandlerAdapter(处理器适配器)调用相应的Handler进行处理并返回ModelAndView(数据和视图)给DispatcherServlet
  5. DispatcherServlet将ModelAndView请求ViewReslover(视图解析器),返回具体View
  6. DispatcherServlet将View(视图)进行渲染视图(即 将模型数据填充至视图中)
  7. DispatcherServlet将页面响应给用户

组件说明

  • DispatcherServlet
    首先看下web.xml配置文件:
<servlet>
 <servlet-name>dispatcherServlet</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 </servlet>
<servlet-mapping>
 <servlet-name>dispatcherServlet</servlet-name>
 <url-pattern>/</url-pattern>
</servlet-mapping>

这里就是Servlet的配置,只不过这个Servlet是系统已经实现好的前端控制器:DispatcherServlet,相当于mvc模式中的c,是整个流程控制的中心,调用其他组件来处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。

  • HandlerMapping
public interface HandlerMapping {
 @Nullable
 HandlerExecutionChain getHandler(HttpServletRequest var1) throws Exception;
}

HandlerMapping是一个接口,DispatcherServlet调用HandlerMapping根据请求url找到需要执行的处理器(这里实际返回的是执行链),springmvc提供了不同的映射器实现不同的映射方式,如:配置文件方式,实现接口方式,注解方式等。该接口里面只有一个方法:getHandler,该方法可以通过传入的参数请求对象HTTPServletRequest,得到HandlerExecutionChain(里面包含了处理器对象和拦截器)。可以简单的理解为该方法通过request请求对象获得要执行的处理器(每种HandlerMapping实现类返回的处理器不一定相同,有可能是处理器中的方法,也有可能是处理器本身)。
BeanNameURLHandlerMapping是默认的HandlerMapping实现类,它的getHandler方法返回的是处理器类。常用的HandlerMapping实现类有:

@Controller
public class HelloController {
    @RequestMapping("/sayHello")
    public String sayHello(){
        System.out.println("hello");
        return "success";
    }
}

RequestMappingHandlerMapping:该类采用注解方式进行映射,使用最广泛,也最简单,只需要在类或方法上加上@RequestMapping()的注解就可以了,它的getHandler方法返回的是处理器类中的方法。
SimpleURLHandlerMapping:采用配置文件的方式进行映射,适用性最强,需要在配置文件里面配置,它的getHandler方法返回的是处理器类。

  • Handler
    Handler是继DispatcherServlet的后端处理器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况下需要程序员根据业务需求开发Handler。

  • HandlerAdapter
    DispatcherServlet通过HandlerAdapter调用处理器,因为不同的HandlerMapping实现类返回的处理器格式不是固定的,所以处理请求时需要HandlerAdapter做适配。

public interface HandlerAdapter {
//判断该适配器是否支持传入的handler(处理器)
 boolean supports(Object handler);
//使用给定的handler处理请求,也就是执行handler
 @Nullable
 ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object handler) throws Exception;
 
 long getLastModified(HttpServletRequest var1, Object var2);
}

HandlerAdapter也是一个接口,它里面有两个重要的方法:
boolean supports(Object handler);这个方法可以判断该适配器是否支持传入的handler
ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object handler)throws Exception;这个方法使用给定的handler处理请求,也就是执行handler。
常用的HandlerAdapter实现类就是RequestMappingHandlerAdapter,它是和RequestMappingHandlerMapping配合使用的。
在spring mvc的核心配置文件中加上:<mvc:annotation-driven />就会自动帮我们注册RequestMappingHanlderMapping和RequestMappingHandlerAdapter

<!-- 配置spring创建容器时要扫描的包 -->
<context:component-scan   base-package="cn.xh"></context:component-scan>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

<mvc:annotation-driven />
  • ModelAndView
    执行处理器,返回ModelAndView给DispatcherServlet,这里ModelAndView类指的是执行完处理器以后需要在视图显示的数据和视图,执行处理器后,将数据保存在ModelAndView的Model属性中,将要显示的视图(通常为逻辑视图名)保存在View属性中,然后返回。ModelAndView类可以将处理器和视图渲染之间的紧密联系解耦合。
@RequestMapping("/findModelAndView")
public ModelAndView findModelAndView(){
    System.out.println("modelAndView");
    ModelAndView md = new ModelAndView();
    User u1 = new User();
    u1.setUid(1);
    u1.setName("zhangsan");
    u1.setAge(23);
    md.addObject("user",u1);
    md.setViewName("aa");
    return md;
}
  • ViewReslover
    ViewReslover根据处理器返回的ModelAndView中的逻辑视图名为中央控制器返回一个可用的View实例。
public interface ViewResolver {
 @Nullable
 View resolveViewName(String viewName, Locale var2) throws Exception;
}

接口ViewReslover里面有一个方法:resolveViewName,负责将处理结果生成View视图。
ViewReslover首先根据逻辑视图名解析成物理视图名(即具体的页面地址),再生成View对象。

  • View
public interface View {
 void render(@Nullable Map<String, ?> model, HttpServletRequest var2, HttpServletResponse var3) throws Exception;
}

springmvc框架提供了很多的View视图类型的支持,包括:jstlView,freemarkerView、pdfView等。我们最常用的视图就是jsp。
View接口里面有一个方法render,可以将数据model渲染到视图。DispatcherServlet根据View渲染视图(数据model已填充至视图)响应给用户。


Spring boot和Spring区别

  • Spring boot相比于Spring:
    1. Spring Boot可以建立独立的Spring应用程序
    2. 内嵌了如Tomcat,Jetty等容器,可以直接跑起来,不用再做部署工作了
    3. 无需再像Spring那样搞一堆繁琐的xml配置文件
    4. 可以自动配置Spring
    5. 提供了一些现有的功能,如亮度工具、表单验证以及一些外部配置等第三方功能
    6. 提供的pom可以简化maven的配置

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 一、SpringMVC简介 1.1 SpringMVC为什么出现 很多应用程序的问题在于处理业务数据和显示业务数据...
    这一刻_776b阅读 221评论 0 1
  • SpringMVC的工作原理图: SpringMVC的工作原理图: SpringMVC流程 1、 用户发送请求至前...
    我不饿我不想吃东西阅读 839评论 0 1
  • 1.JVM 堆内存和非堆内存 堆和非堆内存按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据...
    yanzhu728阅读 896评论 0 0
  • delete from后面可以写条件,truncate不可以。delete from记录是一条条删的,所删除的每行...
    载zai阅读 245评论 0 0
  • 第一章 再归遇知心 绿意盎然的季节又到了,地面又开始长出稚嫩招人悯小草,伸展脆弱的而有韧劲的身姿,尽情的吸...
    天上地下阅读 288评论 0 1