admin管理员组文章数量:1794759
java SSM及Springboot框架面试点整合
目录
Mybatis
1.什么是Mybatis?
2.为什么要用Mybatis?
3.Mybatis 的三种执行?
4.数据库三大范式是什么?
5.什么是游标?
6.MySQL存储引擎MyISAM与InnoDB区别?
7.InnoDB引擎的4大特性?
8.什么是索引?
9.哪些情况下索引会失效?
9.事物的四大特性(ACID)介绍一下?
10.什么是脏读?幻读?不可重复读?
11.什么是事务的隔离级别?MySQL的默认隔离级别是什么?
12.数据库的乐观锁和悲观锁是什么?怎么实现的?
13.什么是存储过程?
14.什么是触发器?
15.mysql中 in 和 exists 区别?
16.drop、delete与truncate的区别?
17.SQL优化?
18.大表数据查询,怎么优化
19.sql语句里面的choose when的使用?
20.常用函数?
21.防止sql注入
Spring
1.简单说一下spring?
2.IOC了解一哈?
3.AOP了解一哈?
SpringMVC
1.什么是Spring MVC?
2.请描述Spring MVC的工作流程?
3.Spring MVC常用的注解有哪些?
4.Spring MVC与Struts2区别?
5.重定向和转发的区别?
6.如何解决POST请求中文乱码问题,GET的又如何处理呢?
Springboot
1.SpringBoot配置devtools实现热部署?
2.什么是 Spring Boot?
3.Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
4.什么是 javaConfig?
5.Spring Boot 自动配置原理是什么?
6.比较一下 Spring Security 和 Shiro 各自的优缺点 ?
7.Spring Boot中的监视器是什么?
8.什么是YAML?
9.什么是 Spring Boot Stater?
10.springboot常用的starter有哪些?
11.Spring Boot Starter的工作原理?
12.RequestMapping 和 GetMapping 的不同之处在哪里?
14.Spring Boot 有哪几种读取配置的方式?
15.Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
17.Spring MVC/Boot 统一异常处理最佳实践?
Mybatis 1.什么是Mybatis?
- Mybatis是一款优秀的持久层框架
- 他支持定制化sql,存储过程以及高级映射
- 他几乎避免了所有的JDBC代码,手动设置参数以及获取结果集。
- 帮助程序员将数据存入到数据库中;
- 传统的JDBC太复杂,简化了其操作,方便,简单,易上手;
- 灵活,sql和代码的分离,提高了可维护性;
- 提供xml标签,支持编写动态sql;
- 使用的人多;
- SIMPLE: 默认的执行器, 对每条sql进行预编译->设置参数->执行等操作
- BATCH: 批量执行器, 对相同sql进行一次预编译, 然后设置参数, 最后统一执行操作
- REUSE: REUSE 执行器会重用预处理语句(prepared statements
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录并赋给主变量,交由主语言进一步处理。
6.MySQL存储引擎MyISAM与InnoDB区别?MySQL中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。
- Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
- MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。
- MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。
区别:
-
插入缓冲(insert buffer)
-
二次写(double write)
-
自适应哈希索引(ahi)
-
预读(read ahead)
是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。
索引的优点:
- 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
- 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点:
- 时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;
- 空间方面:索引需要占物理空间。
索引的基本原理:(就是把无序的数据变成有序的查询)
把创建了索引的列的内容进行排序
对排序结果生成倒排表
在倒排表内容上拼上数据地址链
在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
- 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
- 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
- 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
Mysql 默认采用的 REPEATABLE_READ隔离级别;Oracle 默认采用的 READ_COMMITTED隔离级别
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制(一般多写的场景下用悲观锁就比较合适)
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式来进行锁定。实现方式:乐一般会使用版本号机制或CAS算法实现。(乐观锁适用于写比较少的情况下(多读场景))
13.什么是存储过程?存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
14.什么是触发器?触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。触发器是指一段代码,当触发某个事件时,自动执行这些代码。在MySQL数据库中有如下六种触发器:
- Before Insert
- After Insert
- Before Update
- After Update
- Before Delete
- After Delete
mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。
SQL性能优化的目标:至少要达到 range 级别,要求是ref级别,如果可以是consts最好.
对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,MySQL提供了explain命令来查看语句的执行计划。对于查询语句,最重要的优化方式就是使用索引。 而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信等。
18.大表数据查询,怎么优化简而言之,SQL注入意味着通过用户输入的数据在查询中注入/插入SQL代码。
SQL注入的四种类型:
- 基于布尔SQL注入
- 基于联合SQL注入
- 基于时间SQL注入
- 基于错误SQL注入
在这种变体中,攻击者试图从数据库中获取信,例如错误代码和消。 攻击者注入SQL在语法上是不正确的,因此数据库服务器将返回错误代码和消,这些错误代码和消可用于获取数据库和系统信。
解决方案:
- 使用PreparedStatement而不是Statement来执行查询,从请求接收的用户名和密码的值仅被视为数据,因此不会发生SQL注入。
- 通过正则表达式等在查询中使用数据之前,请先对其进行验证。
- 不要使用常用词作为表名或列名。 例如,许多应用程序使用tbluser或tblaccount来存储用户数据。 电子邮件,名,姓是常用的列名。
- 不要直接串联数据(作为用户输入接收)来创建SQL查询。
- 通过权限和授予限制应用程序对数据库的访问。
- 不要将敏感的错误代码和消返回给最终用户。
注:mybatis底层其实就是使用了PreparedStatement,在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。使用#即输入参数在SQL中拼接的部分,传入参数后,打印出执行的SQL语句,会看到SQL是这样的:【 select id, username, password, role from user where username=? and password=? 】不管输入什么参数,打印出的SQL都是这样的。这是因为MyBatis启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。
Spring 1.简单说一下spring?spring是轻量级的开源的javaEE框架,他可以解决企业应用开发的复杂性。spring有俩个核心部分,AOP面向切面编程及IOC控制反转。他的特点为:方便解耦,简化开发;支持AOP编程;方便程序测试;方便进行事务操作;方便与其他框架整合;
2.IOC了解一哈?IOC是spring的俩大核心概念之一,IOC提供了一个bean容器,这个容器会帮助我们去创建对象,而不需要我们手动的去创建对象。IOC容器有一个非常强大的功能DI,依赖注入。我们可以通过写java代码和基于xml的自动装配的方式,把我们想要注入对象所依赖的一些其他的bean自动的注入进去。正是因为依赖注入,使得IOC有了非常强大的功能解耦。比如JDBCTemplate,将它注入到容器中,是需要一个数据源的。如果JDBCTemplate和德鲁伊的数据源强耦合在一起,会导致我们要想使用JDBCTemplate,必须使用德鲁伊的数据源。而通过依赖注入,我们只需要在注入的时候将他依赖一个datasource接口,不需要去依赖具体的实现,这样的好处是将来我们注入一个德鲁伊的数据源,它会自动帮我们将其注入到JDBCTemplate,如果我们注入其他的数据源,其他的数据源,也是一样的。这样JDBCTemplate和我们的数据源就已经完全的解耦和了。它不强依赖于任何一个数据源。同时程序在启动的时候,就会把所有的bean帮我们全部创建好,程序运行的时候就不需要再创建bean,提高的程序的运行速度。IOC中帮我们管理着很多的bean,像service,mapper,controller在我们的容器中只有一份,用的时候直接注入就行了,不需要我们再为了这些类去独立的写单例,节省了我们的时间。
- IOC底层原理:(xml解析,工厂模式,反射)
- IOC接口:(IOC思想基于IOC容器来完成,IOC容器底层就是对象工厂)
AOP是面向切面编程,在日常工作当中,会遇到很多重复性的代码,比如说事物,比如说日志。我们需要在很多类里边,同时把这些代码全部写进去,这样的话是非常非常麻烦的,就比如说事务,我们需要在所有的service层里边去开启事务,提交回滚,这些事情我们都要写,但是能不能不写。当然可以,spring的AOP就给我们提供这些方式。我们可以把这些共有的代码抽象出来,然后切入到我们想要切入的类里面,这样使各部分之间的耦合度降低,提高了代码的可重用性,同时提高了开发效率。AOP的实现是依靠动态代理来完成的,如果我们将来要代理的这个对象,他有接口,那我们就使用JDK动态代理来创建接口实现类代理对象,增强类的方法。如果他没有实现任何的借口,他会采用CGLib动态代理创建子类的代理对象,增强类的方法。
SpringMVC 1.什么是Spring MVC?Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。优点:
(1)可以支持各种视图技术,而不仅仅局限于JSP;
(2)与Spring框架集成(如IoC容器、AOP等);
(3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
(4) 支持各种请求资源的映射策略。
2.请描述Spring MVC的工作流程?- @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
- @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
- @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
-
@Controller:标记一个类是Controller。
@PathVariable和@RequestParam的区别:@PathVariable主要用于接收host:port/path/{参数值}数据。@RequestParam主要用于接收host:port/path?参数名=参数值数据,这里后面也可以不跟参数值。
4.Spring MVC与Struts2区别?相同点:
- 都是基于mvc的表现层框架,都用于web项目的开发。
不同点:
- 1.前端控制器不一样。Spring MVC的前端控制器是servlet:DispatcherServlet。struts2的前端控制器是filter:StrutsPreparedAndExcutorFilter。
- 2.请求参数的接收方式不一样。Spring MVC是使用方法的形参接收请求的参数,基于方法的开发,线程安全,可以设计为单例或者多例的开发,推荐使用单例模式的开发(执行效率更高),默认就是单例开发模式。struts2是通过类的成员变量接收请求的参数,是基于类的开发,线程不安全,只能设计为多例的开发。
- 3.Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,Spring MVC通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
- 4.与spring整合不一样。Spring MVC是spring框架的一部分,不需要整合。在企业项目中,Spring MVC使用更多一些。
解决post请求乱码问题:
- 在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;
get请求中文参数出现乱码解决方法有两个:
- ①修改tomcat配置文件添加编码与工程编码一致
- ②另外一种方法对参数进行重新编码:(String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”);ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。)
wwwblogs/liu2-/p/9118393.html
spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。
devtools的原理:深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
注意:在application.properties中配置spring.devtools.restart.enabled=false,此时restart类加载器还会初始化,但不会监视文件更新。在SprintApplication.run之前调用System.setProperty(“spring.devtools.restart.enabled”, “false”);可以完全关闭重启支持。
2.什么是 Spring Boot?Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,约定大于配置,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
- 容易上手,提升开发效率,为 Spring 开发提供一个更快、更广泛的入门体验。
- 开箱即用,远离繁琐的配置。
- 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、监控、高速缓存等。
- 没有代码生成,也不需要XML配置。
- 避免大量的 Maven 导入和各种版本冲突
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,标注这个类是一个springboot的应用。主要组合包含了以下 3 个注解:
- @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
- @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
- @ComponentScan:Spring组件扫描。
Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:
- (1)面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。
- (2)减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfig 与 XML 混合匹配是理想的。
- (3)类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性进行自动配置功能,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。
6.比较一下 Spring Security 和 Shiro 各自的优缺点 ?Spring boot actuator是spring启动框架中的重要功能之一。Spring boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。
8.什么是YAML?YAML是一种人类可读的数据序列化语言。它通常用于配置文件。 与properties相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。
9.什么是 Spring Boot Stater?Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。
10.springboot常用的starter有哪些?- spring-boot-starter-web :提bai供 Spring MVC + 嵌入式的 Tomcat 。web开发du一整套
- mybatis-spring-boot-starter :提供 MyBatis持久层操作数据库zhi
- spring-boot-starter-test:提供完备的测试功能
- spring-boot-starter-thymeleaf:提供Thymeleaf模板dao视图整合
- spring-boot-starter-actuator:提供生产级监控
- spring-boot-starter-security :使用 SpringSecurity 进行身份验证和授权
- spring-boot-starter-data-redis`:提供 Redis整合能力
- Spring Boot 在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR ;
- 根据spring.factories配置加载AutoConfigure类 ;
- 根据 @Conditional注解的条件,进行自动配置并将Bean注入Spring Context 。
-
RequestMapping 具有类属性的,可以进行 GET,POST,PUT 或者其它的注释中具有的请求方法。
-
GetMapping 是 GET 请求方法中的一个特例。它只是 ResquestMapping 的一个延伸,目的是为了提高清晰度。
Spring Boot 可以通过 @Value, @ConfigurationProperties 来绑定变量。【@Value("${info.address}");@ConfigurationProperties(prefix = "info")】
15.Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架,Spring Boot都支持配置将日志输出到控制台或者文件中。
17.Spring MVC/Boot 统一异常处理最佳实践?www.zhaojun.im/springboot-exception/
本文标签: 试点框架javaSSMSpringBoot
版权声明:本文标题:java SSM及Springboot框架面试点整合 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686829049a107724.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论