日常笔记and面试题

目录

目录

笔记

1.前端循环中  key的作用

面试题

1.什么是乐观锁,悲观锁 。乐观锁的使用场景

2.sql优化

3.Spring事务的原理

4.事务失效的场景

5.事务注解的参数

6.JDBC执行流程

7.MyBatis执行流程

8.MyBatis的四种拦截器

9.拦截时使用反射

10.MyBatis拦截器的执行流程


笔记

1.前端循环中  key的作用

当数据发生变化时  只需要重新渲染变化的数据,否则需要重新渲染全部数据。

面试题

1.什么是乐观锁,悲观锁 。乐观锁的使用场景

乐观锁是一种并发控制机制,它假设在修改数据时不会发生冲突,只在提交修改时检查是否有冲突

乐观锁使用场景,用于处理多线程或多用户环境下的数据更新问题:例如在进行库存管理时,当并发量比较大的情况下,会出现两个或多个用户同时操作一个库存表,在没有加锁的情况下, 后操作的用户会把前操作的用户的操作覆盖,最后更新的是最后一位用户的操作。 

方法:版本号机制:每次数据被修改时,版本号都会增加。当一个事务开始更新数据时,不仅会根据当前版本号来更新数据,还会将版本号+1。提交事务前,会再次检查版本号是否仍然与最初读取时一致,如果一致则提交更新,否则表示有其他事务在此期间修改过数据,因此当前事务回滚,重新尝试获取最新的数据后再执行更新操作。

悲观锁则是一种预防性的锁定机制,它在数据处理前就对数据进行加锁

2.sql优化

索引失效:

(1)查询条件包含or,可能导致索引失效

(2)如何字段类型是字符串,where时一定用引号括起来,否则索引失效

(3)like查询以%开头(当满足覆盖索引的条件下,不会失效)

(4)联合索引,需要符合最佳左前缀原则,查询时的条件列不是联合索引中的第一个列,索引失           效。并且不能跳过联合索引中的任何一个。

(5)在索引列上使用mysql的内置函数,索引失效。

(6)对索引列运算(如,+、-、*、/),索引失效。

(7)索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。

(8)索引字段上使用is null, is not null,可能导致索引失效。

(9)左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。

(10)mysql估计使用全表扫描要比使用索引快,则不使用索引

3.Spring事务的原理

        主要是基于AOP(面向切面编程)实现的。

        Spring事务通过AOP技术,在方法执行的前后插入事务相关的操作。

        通常通过代理模式实现,及在方法执行完成后提交或回滚事务。

4.事务失效的场景
  1. 非public修饰的方法
  2. 类内部访问
  3. 数据库不支持事务
  4. 异常类型不匹配
  5. 传播属性设置问题
  6. 捕获异常未抛出
  7. Bean没有纳入Spring IOC容器管理
  8. 事务方法内启动新线程进行异步操作
5.事务注解的参数

REQUIRED  默认,如果存在事务,则支持当前事务;不存在则开启一个新事务

REQUIRES_NEW  不管存在不存在,都开启一个新事务

NESTED  如果不存在事务,则开启一个事务运行;如果存在事务,则运行一个嵌套事务

NEVER  非事务方式执行,如果存在事务,则抛异常

NOT_SUPPORTED  不管存不存在,都以非事务方式执行,当存在事务时,挂起事务

SUPPORTS  如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行

6.JDBC执行流程
  1. 注册驱动
  2. 建立数据库连接
  3. 创建Statement对象
  4. 执行SQL查询或更新
  5. 处理结果集
  6. 关闭资源
7.MyBatis执行流程
  1. 读取MyBatis配置文件
  2. 加载映射文件
  3. 构造会话工厂
  4. 创建会话对象
  5. Execute执行器
  6. MappedStatement对象
  7. 输入参数映射ParameterHandle
  8. 输出结果映射ResultHandle
8.MyBatis的四种拦截器
  1. Executor (执行器拦截器): 拦截MyBatis执行器方法的执行
  2. StatementHandler(语句拦截器): 拦截SQL语句的执行
  3. ParameterHandler(参数拦截器): 拦截SQL语句的参数设置
  4. ResultHandler(结果拦截器): 拦截从SQL语句返回的结果集的处理
9.拦截时使用反射

遇到的使用场景:在使用MyBatis参数拦截器处理参数时,使用Hutoll工具中的ReflectUtil的getField(参数对象的class类,要拦截处理的参数名)方法获得要处理的参数的值

先进行非空判断,然后使用工具类中的setFieldValue对获得的对象进行处理

10.MyBatis拦截器的执行流程
  1. 创建自定义拦截器类:实现ibatis下的Intercepter接口,重写intercepter()方法
  2. 使用@Intercepters注解指定拦截目标,同时设置其参数@Signature()指定要拦截的方法签名
  3. 将当前类注入IOC容器中,使用@Component注解
  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值