当前位置: 首页 > news >正文

Spring-Mybatis框架常见面试题

1、介绍下什么是Spring框架的IOC和DI

IOC 控制反转,指将对象的创建权,反转到Spring容器;

DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入,不能单独存在,需要在IOC的基础上完成操作,通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。

2、Spring里面 bean的scope作用域有哪些

singleton:单例, 默认值,调用getBean方法返回是同一个对象,实例会被缓存起来,效率比较高,当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。

prototype: 多例,调用getBean方法创建不同的对象,会频繁的创建和销毁对象造成很大的开销。

request :每个Http请求都会创建一个新的bean。

session: 每个Http Session请求都会创建一个新的bean。

3、什么是AOP以及好处

AOP 面向切面编程, 在不改变原有逻辑上增加额外的功能。

AOP思想把功能分两个部分:核心关注点(业务的主要功能)和横切关注点(非核心、额外增加的功能)。

比如以用户下单为例子:核心关注点是创建订单,横切关注点:记录日志、控制事务。

AOP 面向切面编程的好处:解耦;减少代码重复,可以统一处理横切逻辑。

4、解释下AOP里面常见的概念,比如 横切、通知、连接点、切入点、切面 、目标、织入

横切关注点:对哪些方法进行拦截,拦截后怎么处理,比如 权限认证、日志、事物;

通知:在特定的切入点上执行的增强处理,有5种通知(什么时间点、做什么事情);

连接点:要用通知的地方,全部方法都可以是连接点;

切入点:不能全部方法都是连接点,通过通配、正则表达式过滤出特定的一组 JointPoint连接点来进行通知;

切面:通常是一个类,里面定义 切入点(定义在什么地方)+通知(什么时间点、做什么事情);

目标:目标类,真正的业务逻辑,可以在目标类不知情的条件下,增加新的功能到目标类的链路上;

织入:把切面应用到目标函数的过程称为织入。

5、说下JDBC连接数据库的步骤

(1)加载数据库驱动

(2)获取数据连接对象

(3)获取语句对象,会话对象有两种Statement和PreparedStatement执行语句,     PreparedStatement在执行之前会进行预编译,能够有效防止SQL注入;PreparedStatement支   持?占位符而不是直接拼接

(4)处理结果集

(5)关闭连接资源,关闭顺序:rs.close()、st.close()、conn.close() 

6、说下Mybatis加载的流程

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心,SqlSessionFactory 的实例是通过 SqlSessionFactoryBuilder 从 XML 配置文件来构建出来的,SqlSessionFactory可以创建 SqlSession,SqlSession提供了执行 SQL 的方法,接着Executor负责执行SQL 语句。

7、#{ } 和 ${}的区别是什么

#{ }是预编译处理,${}是字符串替换;

mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

mybatis在处理${}时,会把${}替换成变量的值。

使用#{}可以有效的防止SQL注入。

8、介绍下Mybatis一级缓存跟Mybatis二级缓存

(1)、一级缓存的作用域是SqlSession,同一个SqlSession中执行相同的SQL查询(相同的SQL和参数),第一次会去查询数据库并写在缓存中,第二次会直接从缓存中取,默认开启一级缓存

失效策略:当执行SQL时候两次查询中间发生了增删改的操作,即insert、update、delete等操作commit后会清空该SQLSession缓存; 比如sqlsession关闭,或者清空等。

(2)、二级缓存是namespace级别的,多个SqlSession去操作同一个namespace下的Mapper的sql语句,多个SqlSession可以共用二级缓存;默认是没有开启二级缓存,为了使用二级缓存,需要手动配置并在对应的 Mapper XML 文件中启用它。

操作流程:第一次调用某个namespace下的SQL去查询信息,查询到的信息会存放该mapper对应的二级缓存区域。第二次调用同个namespace下的mapper映射文件中,相同的sql去查询信息,会去对应的二级缓存内取结果。

失效策略:执行同个namespace下的mapepr映射文件中增删改sql,并执行了commit操作,会清空该二级缓存。

注意:

实现二级缓存的时候,MyBatis建议返回的POJO是可序列化的, 也就是建议实现Serializable接口。

若一级缓存和二级缓存同时启用,优先查询二级缓存->查询一级缓存->数据库。

相关文章:

  • 华为云 对象存储服务 OBS | 架构分析与应用场景
  • 夯实 kafka 系列|第二章:kafka 常用参数配置
  • 【leetcode hot 100 33】搜索旋转排序数组
  • 当汉堡遇上便当:TypeScript命名空间 vs JavaScript模块化
  • 机器学习-基于KNN算法手动实现kd树
  • qt中libusb热插拔检测示例代码
  • 【机器学习】什么是随机森林?
  • Linux第零节:Linux命令速查图表(按功能分类)
  • go的参数传递都是值传递,但切片需要注意
  • C++ 性能优化隐藏危机:忽视数据结构与内存细节,效率大打折扣
  • 【前端】在<el-form>里循环插入list内容
  • 百度富文本编辑器配置(vue3)
  • Ubuntu20.04 Qt5安装和卸载
  • uniapp处理流式请求
  • 【计算机网络】-计算机网络期末复习题复习资料
  • WebRTC协议全面教程:原理、应用与优化指南
  • 专访海鹏科技董事长秘书、服务总监赵静波:前瞻式智能化管理,为全球售后服务保驾护航
  • STM32基本GPIO控制
  • 【linux】ubuntu 用户管理
  • 5G NR PRACH 随机接入前导序列
  • 财政部:4月份中央收入增长1.6%,今年以来首月实现正增长
  • 中国预警机雷达有多强?可数百公里外看清足球轨迹
  • 俄方确认普京与特朗普将于今晚通话
  • 左手免费午餐右手花开岭,邓飞14年公益之路的中国贡献
  • 自媒体假扮官方蹭反间谍热度攫取利益,国安机关提醒
  • 从《缶翁的世界》看吴昌硕等湖州籍书画家对海派的影响