springboot+mybatis面试题

目录

1.MyBatis工作流程

2.${} 和 #{}的区别?

3.mybatis多表关联查询如何实现一对一关联、一对多关联?怎么设置关联对象的类型?

4.Mybatis的好处?mybatis的缓存机制,一级,二级介绍一下

5.mybatis给我们提供了哪些标签来生成动态SQL?

[6.Mybatis中resultType 和 resultMap 的区别?](#6.Mybatis中resultType 和 resultMap 的区别?)

[7.Spring IOC、DI、AOP是什么?](#7.Spring IOC、DI、AOP是什么?)

8.Spring中配置的单例bean默认什么时候初始化?如何实现懒加载?

9.Springboot日志级别有哪些?如何更改日志级别

10.Springboot自动配置的原理。

[11. Springboot添加Interceptor拦截器时,拦截器中preHandle、postHandle、afterCompletion方法含义?](#11. Springboot添加Interceptor拦截器时,拦截器中preHandle、postHandle、afterCompletion方法含义?)

12.@ConditionalOnClass、@ConditionalOnMissingClass分别是什么含义

13.我们要写一个过滤器需要哪些步骤?

14.SpringMVC拦截器和Servlet中的过滤器有什么区别?

15.springmvc接收参数的几种形式?

16.SpringMVC的工作流程?

[17.Spring 中事务的传播行为和隔离级别分别代表什么含义?并分别列举几个常用的传播行为和隔离级别](#17.Spring 中事务的传播行为和隔离级别分别代表什么含义?并分别列举几个常用的传播行为和隔离级别)

18.SpringMvc的作用及你对springmvc的理解?


1.MyBatis工作流程

1.加载配置文件

2.生成SqlSessionFactory

3.建立SqlSession

4.调用Mybatis提供的API

5.查询Mapper配置文件

6.返回结果

7.关闭session

2.${} 和 #{}的区别?

{}:简单字符串替换,把{}直接替换成变量的值,不做任何转换,这种是取值以后再去编译SQL语句,底层采用Statement语句,不能防止sql注入攻击。

• #{}:预编译处理,sql中的#{}替换成?,补全预编译语句,有效的防止Sql语句注入,这种取值是编译好SQL语句再取值。

3.mybatis多表关联查询如何实现一对一关联、一对多关联?怎么设置关联对象的类型?

一对一关联和一对多关联都需要自定义标签 Assocication Collection。

一对一通过标签定义,通过javaType指定关联对象的类型

一对多通过标签定义,通过ofType指定关联对象的类型

4.Mybatis的好处?mybatis的缓存机制,一级,二级介绍一下

把Sql语句从Java中独立出来。

• 封装了底层的JDBC,API的调用,并且能够将结果集自动转换成JavaBean对象,简化了Java数据库编程的重复工作。

• 自己编写Sql语句,更加的灵活。

• 入参无需用对象封装(或者map封装),使用@Param注解

mybatis提供了缓存机制减轻数据库压力,提高数据库性能

mybatis的缓存分为两级:一级缓存、二级缓存

一级缓存是SqlSession级别的缓存,缓存的数据只在SqlSession内有效

二级缓存是mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的

5.mybatis给我们提供了哪些标签来生成动态SQL?

if标签: 判断标签,当参数符合判断条件拼接SQL语句。

where标签: 替代where关键字。

foreach标签: 向SQL传递数组或list,MyBatis使用foreach解析。

sql标签: 将实现的动态SQL判断代码块抽取出来,组成一个SQL片段,其它的statement中就通过`<include>`标签就可以引用SQL片段,方便程序员进行开发。

set标签:替代set关键字。

choose、when、otherwise标签:用于实现类似于编程语言中的 switch 语句的逻辑判断功能。

6.Mybatis中resultType 和 resultMap 的区别?

resultType:自动映射,如果数据库结果集中的列名和要封装实体的属性名完全一致的话用 resultType 属性。

resultMap:手动映射,如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属性,通过 resultMap标签手动建立对象关系映射。

7.Spring IOC、DI、AOP是什么?

IOC:控制反转,将创建对象的权力转交给Spring,由 Spring 负责创建对象,管理对象,装配对象,并且管理这些对象的整个生命周期。

DI:我们在使用Spring 容器的时候,容器通过调用set 方法或者是构造器来建立对象之间的依赖关系。

AOP:面向切面编程,通过在不修改原有代码的情况下,将横切关注点(如事务管理、日志记录等)从核心业务逻辑中解耦出来,并在需要的地方进行统一的切面逻辑处理。

8.Spring中配置的单例bean默认什么时候初始化?如何实现懒加载?

Spring中配置的单例bean默认在容器启动时就初始化。

懒加载:通过给添加lazy-init="true"属性就可以将bean初始化的时机延迟到使用时

懒加载只要单例模式下有效

9.Springboot日志级别有哪些?如何更改日志级别

日志级别:error、warn、info、debug、trace

更改日志级别:application.yml中配置:

logging:

level:

com:

lanou: debug

10.Springboot自动配置的原理。

1.当启动项目时,会执行@SpringbootApplication

2.该注解会启动其下的@EnableAutoConfiguration(自动装配)

3.自动装配的注解就是从 组件自动装配选择器(AutoConfigurationImportSelector)中读取组件列表

4.组件列表(META-INF/spring.factories)中就列举了众多需要进行整合的组件

5.就会找到对一个的组件类(xxxAutoConfiguration)

6.在组件类的上方就会判断当前项目是否需要与此组件整合 (@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class}))

7.如果判断当前项目没有此类,则不会进行该组件的加载

8.如果判断当前项目有此类,则会读取与该组件整合的配置文件 (@EnableConfigurationProperties({DataSourceProperties.class}))

9.如果读取失败,则装配失败,项目报错

10,如果读取成功,则装配成功,springboot与该技术即整合成功

总结:整合什么技术 -- 导入该技术的jar包(场景包) -- 设置相关的属性 -- 整合成功

结论:

SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration;

每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。

xxxxProperties里面拿。

xxxProperties和配置文件进行了绑定;

生效的配置类就会给容器中装配很多组件;

只要容器中有这些组件,相当于这些功能就有了;

11. Springboot添加Interceptor拦截器时,拦截器中preHandle、postHandle、afterCompletion方法含义?

perHandle:在controller的方法调用前调用执行。

postHandle:在controller的方法执行之后,返回给前端数据之前调用执行。

afterCompletion:在整个执行流程结束之后调用执行。

12.@ConditionalOnClass、@ConditionalOnMissingClass分别是什么含义

@ConditionalOnClass:判断项目中是否有对应的类,有:创建bean对象,没有:不创建bean对象。

@ConditionalOnMissingClass:判断项目中是否有对应的类,有:不创建bean对象,没有:创建bean对象。

13.我们要写一个过滤器需要哪些步骤?

  1. 创建一个普通Java类

  2. 实现Filter接口,重写doFilter、init(FilterConfig config)、destroy

  3. 通过在web.xml中配置、或者通过@WebFilter注解注册到容器中

14.SpringMVC拦截器和Servlet中的过滤器有什么区别?

拦截器是SpringMVC框架中封装的一个组件,拦截的是让不让一个请求执行对应的Handler,过滤器是Servlet标准中的组件,拦截的是让不让一个请求访问Servlet或者页面。

1.拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。

2.拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。

3.拦截器只能拦截控制器,过滤器可以拦截所有的资源:Servlet,JSP,HTML。

4.拦截器在控制器的生命周期中,可以多次被调用,过滤器在所有请求调用之前。

5.拦截器可以访问控制器上下文、值栈里的对象,而过滤器不能访问。

15.springmvc接收参数的几种形式?

方式一、原生 HttpServletRequest 接收数据

方式二:通过参数名称接收 要求 url后传递的参数名和方法的形参名保持一致

方式三、参数名称不一致时 @RequestParam(name = "username") 参数映射

1、限制是否允许为空 @RequestParam 默认不允许为空

@RequestParam(required = false)

required = false 是否允许为空

2、是否给默认值 @RequestParam(defaultValue = "12345")

方式四、通过对象接收数据 (当前端传递的参数名和对象的属性名保持一致时)

方法五、restful风格接收(@PathVariable 地址栏传参)

16.SpringMVC的工作流程?

17.Spring 中事务的传播行为和隔离级别分别代表什么含义?并分别列举几个常用的传播行为和隔离级别

事务的传播行为说的是事务与事务之间的嵌套关系。比如B事务如果嵌套在A事务中时,是复用A事务,还是各用各的事务,还是将A事务挂起,仅在B事务中运行,亦或是不在事务中运行。

常用的传播行为:

传播行为 含义
REQUIRED(默认) 当前有事务则加入,没有则新建事务。
REQUIRES_NEW 总是新建事务,并挂起当前事务(如果存在)。
SUPPORTS 当前有事务则加入,没有则以非事务方式运行。
NOT_SUPPORTED 以非事务方式运行,并挂起当前事务(如果存在)。
MANDATORY 必须在事务中调用,否则抛出异常。
NEVER 必须在非事务中调用,否则抛出异常。
NESTED 如果当前有事务,则在嵌套事务中执行(子事务回滚不影响父事务)。

事务的隔离级别说的是事务与事务之间的可见性关系。比如A事务在提交到数据库之前,B事务能否读取到A事务操作的数据。

常用的隔离级别:

隔离级别 含义 存在的问题
READ_UNCOMMITTED 最低级别,可能读到其他事务未提交的数据(脏读)。 脏读、不可重复读、幻读。
READ_COMMITTED 只能读到其他事务已提交的数据(解决脏读)。 不可重复读、幻读。
REPEATABLE_READ 同一事务内多次读取结果一致(解决脏读、不可重复读)。 幻读(MySQL 通过 MVCC 部分解决)。
SERIALIZABLE 最高级别,完全串行化执行(解决所有并发问题,但性能最差)。 无并发问题,但性能低。

18.SpringMvc的作用及你对springmvc的理解?

作用:

spring MVC是一个分层的java web开发框架,MVC模式提供了一个分层的体系结构,其中每一层对其它层进行了抽象,具体如下:

1.模型(Model):应用程序所使用的特定域信息的表现形式

2.视图(View):域模型的表现形式(通过使用诸如输入元素和按钮之类的用户界面元素,而这些元素与模型进行交互)。

3.控制器(Controller):主要负责解释用户的输入并转换为模型,然后将转换后的结果显示给用户。

优点:

让我们能非常简单的设计出干净的Web层,进行更简洁的Web层的开发

天生与Spring框架集成(如IoC容器、AOP等)

提供强大的约定大于配置的契约式编程支持

非常灵活的数据验证、格式化和数据绑定机制

支持Restful风格

相关推荐
David爱编程2 分钟前
Java 守护线程 vs 用户线程:一文彻底讲透区别与应用
java·后端
小奏技术19 分钟前
国内APP的隐私进步,从一个“营销授权”弹窗说起
后端·产品
小研说技术38 分钟前
Spring AI存储向量数据
后端
苏三的开发日记38 分钟前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台处于同一台服务器)
后端
苏三的开发日记39 分钟前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台不在同一服务器)
后端
陈三一44 分钟前
MyBatis OGNL 表达式避坑指南
后端·mybatis
whitepure1 小时前
万字详解JVM
java·jvm·后端
我崽不熬夜1 小时前
Java的条件语句与循环语句:如何高效编写你的程序逻辑?
java·后端·java ee
我崽不熬夜1 小时前
Java中的String、StringBuilder、StringBuffer:究竟该选哪个?
java·后端·java ee
我崽不熬夜2 小时前
Java中的基本数据类型和包装类:你了解它们的区别吗?
java·后端·java ee