拿捏八股文

AOP五种方式

AOP(‌面向切面编程)‌提供了五种主要的增强方式,‌它们分别是:‌

前置增强(‌Before Advice)‌‌:‌在目标方法执行之前执行,‌常用于权限验证、‌日志记录等场景。‌

后置增强(‌After Advice)‌‌:‌在目标方法执行之后执行,‌无论方法是否成功执行或抛出异常。‌

环绕增强(‌Around Advice)‌‌:‌在目标方法执行前后都执行,‌可以控制目标方法的执行,‌甚至决定是否执行目标方法。‌

返回增强(‌After Returning Advice)‌‌:‌在目标方法成功执行并返回结果后执行,‌常用于对返回结果进行加工处理。‌

异常增强(‌After Throwing Advice)‌‌:‌在目标方法抛出异常后执行,‌常用于异常处理和日志记录。‌

这些增强方式使得开发者能够在不修改原有业务代码的情况下,‌增加额外的功能,‌提高了代码的复用性和可维护性。

Redis缓存的面试问题

缓存穿透:

查询一个不存在的数据,由于缓存中没有该数据,导致每次请求都会去数据库查询,数据库压力增大。

缓存击穿:

本来缓存中有对应的数据,但是缓存的数据 因为到期,需要去数据库中再次查询数据

缓存雪崩:

当大量缓存数据同时过期或被删除时,大量请求会直接访问数据库,导致数据库压力骤增。### 缓存倾斜:

某个热点数据被大量请求访问,导致该数据所在的Redis节点压力过大,甚至可能引发宕机。

什么是反射?

就是在运行时才知道要操作的类是什么,‌并且能够动态地操作这个类的属性和方法。‌

JDK动态代理和CGLIB动态代理的区别

JDK动态代理 底层的实现原理是反射,所以启动快,执行效率低,只能代理实现接口的对象

Cglib动态代理 底层是通过生成字节码文件,从而实现了子类继承父类的方式完成了代理,所以启动较慢,执行快

区别: 1.JDK只能代理具有接口的对象,而Cglib无此限制 2.启动速度JDK动态代理较快,Cglib生成字节码文件,启动较慢 3,执行效率JDK动态代理通过反射生成接口的实现类较慢,Cglib执行字节码文件较快

Mysql中的char和varchar区别

1.‌存储方式‌:‌

  • CHAR是一个固定长度的类型

  • VARCHAR是一个可变长度的类型,‌它只存储字符串实际需要的字符数

  • 如果你的数据表中的列经常存储接近固定长度的字符串,‌使用CHAR类型可能更节省空间,‌因为MySQL不需要为每个值存储额外的长度信息。‌

  • 如果列中的字符串长度差异很大,‌使用VARCHAR类型会更节省空间,‌因为它只存储实际需要的字符数。‌

3.‌性能‌:‌

  • 对于CHAR类型,‌由于每个值的长度都是固定的,‌所以MySQL可以更快地处理这些值,‌特别是在进行排序和比较操作时。‌
  • VARCHAR类型的处理可能会稍微慢一些,‌因为MySQL需要首先确定每个值的实际长度。‌

4.‌使用场景‌:‌

  • CHAR类型适合存储长度几乎总是相同的字符串,‌如MD5哈希值、‌国家代码、‌电话号码等。‌
  • VARCHAR类型适合存储长度可能变化的字符串,‌如用户名、‌电子邮件地址、‌文章标题等。‌

5.‌最大长度‌:‌

  • CHAR类型的最大长度是255个字符。‌

  • VARCHAR类型的最大长度取决于MySQL的版本和存储引擎,‌但通常可以达到65,535个字符(‌在某些情况下可能更少)‌。‌

Mysql中limit分页查询后两数代表什么

第一个数字(‌offset)‌:‌表示要跳过的记录数量。‌‌ 它用于指定从结果集的哪一条记录开始获取数据,‌默认值为0,‌表示从第一条记录开始。‌

第二个数字(‌rows)‌:‌表示要获取的记录数量。‌‌ 它指定了从offset指定的位置开始,‌要获取多少条记录。‌

UNION和UNIONALL有啥区别

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结 果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不 是来自 TABLE1 就是来自 TABLE2。

主要三大范式

第一范式(‌1NF)‌‌:‌要求数据库表的每一列都是不可分割的基本数据项,‌即每个字段都是原子性的,‌不可再分。‌

第二范式(‌2NF)‌‌:‌在第一范式的基础上,‌要求数据库表中的非主键字段必须完全依赖于主键,‌而不能依赖于主键的一部分。‌

第三范式(‌3NF)‌‌:‌在第二范式的基础上,‌要求数据库表中的非主键字段之间不能存在传递依赖关系,‌即每个非主键字段必须直接依赖于主键。‌

遵循这三大范式可以有效地规范化数据库的结构,‌减少数据冗余和数据更新异常,‌提高数据的一致性和查询效率‌12。‌

事务特性 ACID

  • 原子性(‌Atomicity)‌‌:‌指整个数据库事务是不可分割的工作单位。‌只有使事务中所有的数据库操作都执行成功,‌整个事务的执行才算成功。‌

  • 一致性(‌Consistency)‌‌:‌指事务将数据库从一种状态转变为另一种一致的状态。‌在事务开始之前和事务结束以后,‌数据库的完整性约束没有被破坏。‌

  • 隔离性(‌Isolation)‌‌:‌要求每个读写事务的对象与其他事务的操作对象能相互分离,‌即该事务提交前对其他事务都不可见。‌

  • 持久性(‌Durability)‌‌:‌指事务一旦提交,‌其结果就是永久性的,‌即使发生宕机等故障,‌数据库也能将数据恢复。‌‌

mysql中索引类型

  • 普通索引‌:‌最基本的索引,‌没有任何约束作用,‌主要用于提高查询效率。‌
  • 唯一索引‌:‌在普通索引的基础上增加了数据唯一性的约束,‌允许有空值。‌
  • 主键索引‌:‌一种特殊的唯一索引,‌不允许有空值,‌且一个表中只能有一个主键索引。‌
  • 全文索引‌:‌用于查找文本中的关键字,‌一般很少用到。‌
  • 空间索引‌:‌对空间数据类型的字段建立的索引。‌

此外,‌按照物理实现方式,‌索引还可以分为聚簇索引和非聚簇索引;‌按照作用字段个数,‌可以分为单列索引和组合索引(‌或称为联合索引)‌。‌不同的存储引擎支持的索引类型也有所不同‌

mysql隔离级别

  • 读未提交(‌READ UNCOMMITTED)‌‌:‌事务可以读取其他未提交事务的数据,‌可能导致脏读。‌这种隔离级别性能较高,‌但数据一致性差,‌很少用于实际应用。‌

  • 读已提交(‌READ COMMITTED)‌‌:‌事务只能读取已经提交的数据,‌防止了脏读,‌但可能出现不可重复读。‌这是大多数数据库系统的默认隔离级别,‌但不是MySQL的默认隔离级别。‌

  • 可重复读(‌REPEATABLE READ)‌‌:‌MySQL的默认隔离级别。‌它确保同一事务的多个实例在并发读取数据时,‌会看到同样的数据行,‌防止了脏读和不可重复读,‌但可能出现幻读。‌

  • 可串行化(‌SERIALIZABLE)‌‌:‌最高的隔离级别,‌通过强制事务排序,‌解决幻读问题,‌但可能导致大量的超时现象和锁竞争‌

B+数是什么结构

B+树是一种‌优化的树数据结构‌,‌通常用于数据库和操作系统的文件系统中。‌以下是关于B+树结构的详细解释:‌

  • 节点构成‌:‌B+树是一个n叉排序树,‌每个节点通常有多个孩子。‌一棵B+树包含根节点、‌内部节点和叶子节点。‌根节点可能是一个叶子节点,‌也可能是一个包含两个或两个以上孩子节点的节点。‌

  • 数据分布‌:‌B+树保证所有数据都在叶子节点,‌且叶子节点间有链接,‌便于数据检索。‌这种结构特点使得B+树在插入与修改时拥有较稳定的对数时间复杂度,‌能够保持数据稳定有序。‌

  • 应用优势‌:‌B+树通过将数据分布在节点中,‌减少磁盘IO操作,‌提高查询速度。‌因此,‌它特别适用于数据库索引

HashMap底层原理

​ HashMap是Java集合框架中常用的映射表实现,‌底层基于‌数组+链表(‌或红黑树)‌‌实现。‌在JDK1.8之前,‌HashMap主要采用数组+链表的方式存储数据,‌通过计算Hash值将元素放到数组的指定位置上,‌出现Hash碰撞时形成单向链表,‌并使用头插法插入新元素。‌而从JDK1.8开始,‌当链表的长度超过8且数组长度大于64时,‌链表会转换为红黑树以提高查找效率。‌HashMap通过散列函数将键映射到数组中,‌采用链表或红黑树解决哈希冲突。‌扩容机制是当元素数量超过数组大小乘以加载因子(‌默认0.75)‌时,‌数组容量翻倍。‌‌

如何实现线程安全 关于 HashTable 加锁

​ 实现线程安全的一种方法是使用‌HashTable‌,‌它通过给整个集合加锁来保证线程安全。‌这意味着,‌无论进行读操作还是写操作,‌都会给整个HashTable加锁,‌导致同一时间的其他操作必须等待,‌从而保证了线程安全。‌然而,‌这种方法的一个主要问题是性能较低,‌因为多个线程无法同时访问HashTable,‌导致并发性能较差。‌‌

​ 另一种实现线程安全的方法是使用‌ConcurrentHashMap‌,‌它采用了分段锁的技术。‌ConcurrentHashMap将数据分成多个Segment,‌每个Segment都是一个独立的HashMap,‌并且每个Segment都有一个锁。‌这样,‌不同的线程可以同时访问不同的Segment,‌而不会发生冲突,‌从而提高了并发性能。‌同时,‌由于每个Segment都是独立的,‌所以也保证了线程安全。‌‌

最左匹配原则

最左匹配原则是MySQL中索引使用的一个重要原则。‌它指的是在使用联合索引时,‌查询条件必须从索引的最左列开始匹配,‌‌任何连续的索引列都能匹配上,‌但遇到范围查询就会停止匹配‌。‌

这一原则的产生与MySQL的索引结构有关。‌自MySQL5.5版本起,‌主流的索引结构转为B+树。‌B+树的节点存储索引顺序是从左向右存储,‌在检索匹配的时候也要满足自左向右匹配。‌因此,‌如果查询条件不包含索引的最左列,‌那么索引将不会被使用。‌

了解最左匹配原则对于优化数据库查询性能非常重要,‌它可以帮助我们更好地利用索引,‌提高查询效率‌

事务注解为啥用在业务层

  • 解耦业务逻辑和事务管理‌:‌将事务管理的责任从业务逻辑中剥离出来,‌使业务逻辑更加专注于业务本身,‌提高代码的可维护性和灵活性‌。‌

  • 统一事务管理‌:‌在业务层中进行统一的事务管理,‌确保一组相关的数据库操作要么全部成功,‌要么全部回滚,‌保证数据的一致性和完整性‌。‌

  • 控制事务粒度‌:‌通过声明式方式在业务方法上控制事务的粒度,‌根据实际需求调整事务边界,‌实现更精细的事务控制‌。‌

  • 事务特性发挥‌:‌在业务层使用事务注解可以充分发挥事务的ACID特性,‌特别是在处理多个数据库操作时,‌能够确保事务的一致性和隔离性‌。

什么情况下会导致事务失效

  • 事务方法不是public‌:‌Spring中,‌@Transactional注解只能用于public方法,‌否则事务不会生效‌。‌

  • 数据库引擎不支持事务‌:‌如MySQL的MyISAM引擎不支持事务,‌需使用InnoDB引擎‌。‌

  • 异常处理不当‌:‌如捕获异常后未重新抛出,‌或抛出的是非运行时异常且未在@Transactional中指定回滚‌。‌

  • 配置错误‌:‌如事务管理器配置错误,‌或Spring和Spring MVC配置文件中重复扫描service层‌。‌

  • 自调用问题‌:‌同一个类中的方法互相调用时,‌事务可能不生效‌。‌

  • 事务传播行为不当‌:‌如使用了不支持事务的传播机制‌。

关于事务回滚

​ 它指的是在事务执行过程中,‌如果遇到错误或异常情况导致事务无法继续执行时,‌系统会将事务中已经执行的所有操作全部撤销,‌使数据库恢复到事务开始前的状态。‌这样可以保证数据的一致性和完整性,‌避免因为部分操作成功而部分失败导致的数据不一致问题。‌

在Spring框架中,‌事务回滚通常是通过@Transactional注解来控制的,‌可以指定哪些异常会触发事务回滚,‌以及事务的传播行为等属性。‌

@RequestBody与@ResponseBody区别

@RequestBody的作用是将前端传来的json格式的数据转为自己定义好的javabean对象

@ResponseBody的作用是将后端以return返回的javabean类型数据转为json类型数据

@JSON Format 与 @DateTime Format区别

@JSONFormat`

  • 主要用于JSON序列化和反序列化过程中,‌控制Java对象中的日期时间格式化为JSON输出或从JSON输入反序列化为Java对象时的格式12。‌
  • 通常用于实体类中的日期字段上,‌确保在前端和后端之间传输的JSON数据中日期时间格式的一致性

@DateTimeFormat`

  • 主要用于Spring MVC中,‌处理表单提交或请求参数中的日期时间字符串,‌将其转换为Java的日期时间对象,‌或将Java的日期时间对象格式化为特定格式的字符串。‌

  • 通常与@RequestParam、‌@PathVariable等注解一起使用,‌在控制器层的方法参数或返回值上指定日期时间格式

@Autowird和@Resource区别

  • @Autowired只能注入Bean对象,‌包括Spring容器中的Bean对象以及自定义的Bean对象。‌

  • ​ 在注入时需要依赖Spring的容器,‌不支持直接指定注入的名称或类型(‌除非结合@Qualifier使用)‌

  • @Resource可以注入任何属性,‌包括基本类型和字符串,‌尽管在Spring环境下通常用于注入Bean对象 ;可以通过nametype属性直接指定注入的名称或类型

使用@AutoWird如何区分一个接口实现多个对象

首先,‌你需要确保你的Spring配置(‌无论是XML配置还是Java配置)‌已经正确地声明了这些bean,‌并且它们都被标记为Spring管理的组件(‌例如,‌使用@Component、‌@Service等注解)‌。‌

然后,‌在你的代码中,‌当你想要注入这个接口的一个特定实现时,‌你可以使用@Autowired@Qualifier注解来指定你想要注入的实现。‌
在这里插入图片描述
在这里插入图片描述

Spring中如何解决循环依赖

A->B->C->A 不产生循环 独立出来

Maven的作用 除了jar包依赖管理 如何用Maven打包项目

在这里插入图片描述
在命令行中输入以下命令,‌并按回车键
在这里插入图片描述

常用git命令 代码发生冲突如何解决

手动解决冲突‌:‌

  • 使用git status命令查看冲突的文件。‌
  • 打开冲突文件,‌查找由<<<<<<<、‌=======、‌>>>>>>>标记的冲突部分。‌
  • 手动编辑冲突文件,‌删除或修改冲突标记和代码,‌保留需要的代码。‌
  • 保存文件,‌并使用git add命令将文件标记为已解决冲突。‌
  • 使用git commit命令提交修改。‌

使用Git可视化工具‌:‌

  • 利用如SourceTree、‌GitKraken等工具图形化地显示和解决冲突。‌

使用Git命令行合并工具‌:‌

  • 使用git mergetool命令打开合并工具,‌如vimdiff、‌meld等,‌进行冲突解决。‌

​ 无论哪种方法,‌解决冲突后都需要使用git commit提交,‌然后可以git push到远程仓库。‌‌

实现多个参数 在dao层

  • 使用 @Param 注解来标识方法中的多个参数,以便在 SQL 语句中引用。

  • 在 XML 映射文件中,直接使用 #{parameterName} 来引用方法参数。

实现动态sql用到哪些标签

  1. <if>:用于在满足特定条件时包含 SQL 片段。
  2. <choose>:结合 <when><otherwise> 用于多条件选择。
  3. <trim>:用于去除多余的 SQL 片段,如多余的逗号或空格。
  4. <foreach>:用于遍历集合或数组,并生成 SQL 片段。
  5. <set>:用于在 UPDATE 语句中动态设置字段。
    的多个参数,以便在 SQL 语句中引用。
  • 在 XML 映射文件中,直接使用 #{parameterName} 来引用方法参数。

实现动态sql用到哪些标签

  1. <if>:用于在满足特定条件时包含 SQL 片段。
  2. <choose>:结合 <when><otherwise> 用于多条件选择。
  3. <trim>:用于去除多余的 SQL 片段,如多余的逗号或空格。
  4. <foreach>:用于遍历集合或数组,并生成 SQL 片段。
  5. <set>:用于在 UPDATE 语句中动态设置字段。
  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值