java框架知识点

文章目录

1、JDBC

1.1 JDBC访问数据库的基本步骤是什么?

1)加载(注册)数据库驱动(到JVM)。
2)建立(获取)数据库连接。
3)创建(获取)数据库操作对象。
4)定义操作的SQL语句。
5)执行数据库操作。
6)获取并操作结果集。
7)关闭对象,回收数据库资源(关闭结果集-->关闭数据库操作对象-->关闭连接)。

1.2 preparedStatement和Statement的区别

Statement执行不带参数的简单SQL语句,并返回它所生成结果的对象,每次执行SQL语句时,数据库都要编译该sql语句
PreparedStatement用来执行带参数的预编译的SQL语句
PreparedStatement的优点:

①效率高.
使用PreparedStatement执行SQL命令时,命令会被数据库编译和解析,并放到命令缓冲区.以后每当执行同一个PreparedStatement对象时,预编译的命令就可以重复使用

②代码可读性和可维护性好

③安全性好.
使用PreparedStatement可以防止SQL注入.

SQL注入如:
select * from user where name = ‘aa’ and password = ‘bb’ or 1=1

1.3 说说事务的概念,在JDBC编程中处理事务的步骤。

**事务:**是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);

事务的四大特性:

1 、原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

步骤
conn.setAutoComit(false);设置提交方式为手工提交 开启事务
conn.execute(sql) 执行sql
conn.commit() 提交事务
出现异常,回滚 conn.rollback();

1.4 数据库连接池的原理。为什么要使用连接池。

数据库连接资源宝贵,容易耗尽,连接池可以重用链接而不用每次创建。
原理:

  • 创建一个连接池,放进去一定数量连接
  • 每次使用数据库连接时就从池中取一个,用完再放进去
  • 连接的创建、销毁均有连接池管理

1.5. JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?

对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
读已提交、可重复读、串行化均能避免脏读

1.5 什么是幻读,哪种隔离级别可以防止幻读?

对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
串行化可以避免幻读

1.6 JDBC的DriverManager是用来做什么的?

提供数据库统一接口,数据库厂商提供驱动

1.7 execute,executeQuery,executeUpdate的区别是什么?

  • boolean execute(String sql): 允许执行查询语句、更新语句、DDL语句。
  • int executeUpdate(String sql):该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句
  • ResultSet executeQuery(String sql): 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。

1.8 SQL查询出来的结果分页展示一般怎么做?

计算Result Set指针位置实现分页显示

1.9 JDBC的ResultSet是什么?

最基本的ResultSet
这个ResultSet的作用就是完成了查询结果的存储功能,并且只能读取一次,不能够来回滚动进行读取操作,如图;
可滚动的ResultSet
这个类型支持前后滚动取得记录的next()向下读取以一行,和previous()向上读取以一行,同时还支持absolute(int row)读取指定的一行,以及relative(int rows)移动到相对于当前行的指定行("-“号和”+")

2、Spring

2.1 使用Spring框架的好处是什么?

1、轻量: Spring 是轻量的,基本的版本大约2MB。
2、控制反转: Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
3、面向切面的编程(AOP): Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
4、容器: Spring 包含并管理应用中对象的生命周期和配置。
5、MVC框架: Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
6、事务管理: Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
7、异常处理: Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。

2.2 ApplicationContext通常的实现是什么?

spring为ApplicationContext提供的3种实现分别是:
ClassPathXmlApplicationContext, FileSystemXmlApplicationContext,XmlWebApplicationContext,

  new FileSystemXmlApplicationContext("bean.xml"); //加载单个配置文件  
 
  new FileSystemXmlApplicationContext("D:roject/bean.xml");//根据具体路径加载文件  
  
  new ClassPathXmlApplicationContext("bean.xml");  

2.3 什么是Spring的依赖注入?有哪些方法进行依赖注入

依赖注入方式:

  1. Set注入 标签
  2. 构造器注入 标签
  3. 接口注入

https://www.cnblogs.com/peke/p/7894685.html

2.4 Spring支持的事务管理类型有哪些?

  • 编程式事务管理,在代码中显式调用开启事务、提交事务、回滚事务的相关方法
  • 声明式事务管理,底层是建立在 AOP 的基础之上。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

实际应用

  • 基于 和 命名空间的声明式事务管理是目前推荐的方式,其最大特点是与 Spring AOP 结合紧密,可以充分利用切点表达式的强大支持,使得管理事务更加灵活。
  • 基于 @Transactional 的方式将声明式事务管理简化到了极致。开发人员只需在配置文件中加上一行启用相关后处理 Bean 的配置,然后在需要实施事务管理的方法或者类上使用 @Transactional 指定事务规则即可实现事务管理,而且功能也不必其他方式逊色。

2.5 Spring框架的事务管理有哪些优点?

  • 它为不同的事务API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了统一的编程模型。
  • 它为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA).
  • 它支持声明式事务管理。
  • 它可以和Spring 的多种数据访问技术很好的融合。

2.6 Spring的事务管理机制实现的原理

就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的。

2.7 Spring事务管理器

在这里插入图片描述
Spring提供基础类 DataSourceTransactionManager,各大api继承自它
据底层所使用的不同的持久化 API 或框架,使用如下:

DataSourceTransactionManager:适用于使用JDBC和iBatis进行数据持久化操作的情况,在定义时需要提供底层的数据源作为其属性,也就是 DataSource。
HibernateTransactionManager:适用于使用Hibernate进行数据持久化操作的情况,与 HibernateTransactionManager 对应的是 SessionFactory。
JpaTransactionManager:适用于使用JPA进行数据持久化操作的情况,与 JpaTransactionManager 对应的是 EntityManagerFactory。

2.8 Spring事务传播级别

传播属性说明
required如果当前存在事务则加入该事务,如果没有则新建一个事务
supports如果当前存在事务则加入该事务,如果没有则以非事务的方式运行。
mandatory强制加入当前的事务。如果当前没有事务,就抛出异常。
requires_new新建事务。如果当前存在事务,把当前事务挂起。
not_supported不支持事务。如果当前存在事务,就把当前事务挂起,然后以非事务方式执行。
never以非事务方式执行,如果当前存在事务,则抛出异常。
nested如果当前存在事务,则嵌套执行(相当于指定了回滚点SavePoint)。如果当前没有事务,则新建事务。

nested 时,如果嵌套事务发生异常回滚,如果父事务捕获了异常,则父事务是不会回滚的,因为它只会回滚到指定的回滚点。

2.9 为什么很多Exception异常必须配置在rollback-for中才有用

,Exception异常如果不在rollback-for属性当中指定,即使出现了Exception异常也不会发生事务回滚。

这是因为spring事务处理时,只对RuntimeException和Error异常进行了处理,而Exception没有在其中。

2.10 Spring事务实现原理

调用一个需要事务的组件的时候,管理器首先判断当前调用(即当前线程)有没有一个事务,如果没有事务则启动一个事务,并把事务与当前线程绑定。Spring使TransactionSynchronizationManager的bindResource方法将当前线程与一个事务绑定,采用的方式就是ThreadLocal,这可以从TransactionSynchronizationManager类的代码看出。

2.11 Spring Bean 作用域之间的区别?

Spring 容器中的 bean 可以分为 5 个范围。所有范围的名称都是自说明的,但是为了避免混淆,
还是让我们来解释一下:
1.singleton: 这种 bean 范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只
有一个 bean 的实例,单例的模式由 bean factory 自身来维护。
2.prototype: 原形范围与单例范围相反,为每一个 bean 请求提供一个实例。
3.request: 在请求 bean 范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以
后,bean 会失效并被垃圾回收器回收。
4.Session: 与请求范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,
bean 会随之失效。
5.global: global-session 和 Portlet 应用相关。当你的应用部署在 Portlet 容器中工
作时,它包含很多 portlet。如果你想要声明让所有的 portlet 共用全局的存储变量的话,那么
这全局变量需要存储在 global-session 中。
全局作用域与 Servlet 中的 session 作用域效果相同。

Spring面试题博客

2.12、请解释各种自动装配模式的区别?

在 Spring 框架中共有 5 种自动装配,让我们逐一分析。
1.no:这是 Spring 框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在 bean
定义中用标签明确的设置依赖关系。
2.byName:该选项可以根据 bean 名称设置依赖关系。当向一个 bean 中自动装配一个属性时,
容器将根据 bean 的名称自动在在配置文件中查询一个匹配的 bean。如果找到的话,就装配这
个属性,如果没找到的话就报错。
3.byType:该选项可以根据 bean 类型设置依赖关系。当向一个 bean 中自动装配一个属性时,
容器将根据 bean 的类型自动在在配置文件中查询一个匹配的 bean。如果找到的话,就装配这
个属性,如果没找到的话就报错。
4.constructor:造器的自动装配和 byType 模式类似,但是仅仅适用于与有构造器相同参数的
bean,如果在容器中没有找到与构造器参数类型一致的 bean,那么将会抛出异常。
5.autodetect:该模式自动探测使用构造器自动装配或者 byType 自动装配。首先,首先会尝试
找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在 bean 内部没有找到相
应的构造器或者是无参构造器,容器就会自动选择 byTpe 的自动装配方式。

2.13、在 Spring 中可以注入 null 或空字符串吗?

完全可以。

https://www.cnblogs.com/songanwei/p/9367183.html

2.14、Spring 框架中有哪些不同类型的事件?

Spring 的 ApplicationContext 提供了支持事件和代码中监听器的功能。
我们可以创建 bean 用来监听在 ApplicationContext 中发布的事件。ApplicationEvent 类和
在 ApplicationContext 接口中处理的事件,如果一个 bean 实现了 ApplicationListener 接口,
当一个 ApplicationEvent 被发布以后,bean 会自动被通知。

Spring 提供了以下 5 种标准的事件:
1.上下文更新事件(ContextRefreshedEvent):该事件会在 ApplicationContext 被初始化或
者更新时发布。也可以在调用 ConfigurableApplicationContext 接口中的 refresh()方法时被
触发。
2.上下文开始事件(ContextStartedEvent):当容器调用 ConfigurableApplicationContext
的 Start()方法开始/重新开始容器时触发该事件。
3.上下文停止事件(ContextStoppedEvent):当容器调用 ConfigurableApplicationContext
的 Stop()方法停止容器时触发该事件。
4.上下文关闭事件(ContextClosedEvent):当 ApplicationContext 被关闭时触发该事件。
容器被关闭时,其管理的所有单例 Bean 都被销毁。
5.请求处理事件(RequestHandledEvent):在 Web 应用中,当一个 http 请求(request)
结束触发该事件。
除了上面介绍的事件以外,还可以通过扩展 ApplicationEvent 类来开发自定义的事件。

2.15 Spring 框架中都用到了哪些设计模式?

1、代理模式—在 AOP 和 remoting 中被用的比较多。
2、单例模式:在 spring 配置文件中定义的 bean 默认为单例模式。
3、模板模式:用来解决代码重复的问题。 比如. RestTemplate, JmsTemplate, JpaTemplate。
4、委派模式:Spring 提供了 DispatcherServlet 来对请求进行分发。
5、工厂模式:BeanFactory 用来创建对象的实例,贯穿于 BeanFactory / ApplicationContext
接口的核心理念。
6、代理模式:AOP 思想的底层实现技术,Spring 中采用 JDK Proxy 和 CgLib 类库。

3 Mybatis

3.1 MyBatis中使用#和$书写占位符有什么区别?

#将传入的数据都当成一个字符串,会对传入的数据自动加上引号; 将 传 入 的 数 据 直 接 显 示 生 成 在 S Q L 中 。 注 意 : 使 用 将传入的数据直接显示生成在SQL中。注意:使用 SQL使占位符可能会导致SQL注射攻击,能用#的地方就不要使用 , 写 o r d e r b y 子 句 的 时 候 应 该 用 ,写order by子句的时候应该用 orderby而不是#

4、数据库原理

4.1 数据库设计三大范式

1、第一范式*(确保每列保持原子性)
2、第二范式(确保表中的每列都和主键相关)
3、第三范式(确保每列都和主键列直接相关,而不是间接相关)
https://www.cnblogs.com/1906859953Lucas/p/8299959.html

https://blog.csdn.net/Pure_Eyes/article/details/100077566

5、redis

参考资料:
https://www.cnblogs.com/jasontec/p/9699242.html
https://msd.misuland.com/pd/3065794831805580868

5.1 redis事务

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。 multi
  • 命令入队。 xxx
  • 执行事务。 exec

相关命令

DISCARD取消事务,放弃执行事务块内的所有命令。
EXEC执行所有事务块内的命令。
MULTI标记一个事务块的开始。
UNWATCH取消 WATCH 命令对所有 key 的监视
WATCH key [key …]监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

带有以下三个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

就算有命令失败,队列中的其他命令也会被执行。

5.2 redis 结构

String、List、Set、Sorted Set、Hash
个String类型的value最大可以存储512M
集合可以存储232-1个元素
每个 hash 可以存储 232 - 1 键值对(40多亿)。

底层数据结构:跳跃表、字典、压缩列表、链表、整数集合

6、springboot

参考资料:
https://blog.csdn.net/zl1zl2zl3/article/details/83715633
https://blog.csdn.net/qq_33399857/article/details/82495201

6.1 Spring boot相对Spring MVC的优点

Spring Boot的优点:

  • Spring Boot应用程序与其Spring生态系统(如Spring JDBC,Spring ORM,Spring Data,Spring Security等)集成非常容易。
  • 它遵循“自用默认配置”方法,以减少开发工作量。
  • 它提供嵌入式HTTP服务器,如Tomcat,Jetty等,以开发和测试Web应用程序非常容易。
  • 它提供了许多插件来开发和测试Spring启动应用程序非常容易使用构建工具,如Maven和Gradle。
  • 它提供了许多插件,以便与嵌入式和内存数据库工作非常容易。

7 AOP

7.1 AOP 实现

Spring AOP 、 Aspectj两种方式生成代理类

7.2 AOP 五大通知

  1. before 前置通知
  2. after 后置通知,在方法执行之后执行(无论是否发生异常)还不能访问目标方法执行的结果
  3. around 环绕通知
  4. afterThrowing 异常通知
  5. afterReturning 返回通知

7.3 AOP术语

  1. Aspect :切面,切入系统的一个切面。比如事务管理是一个切面,权限管理也是一个切面;通知和切入点的结合
  2. Join point :连接点,也就是可以进行横向切入的位置;
  3. Advice :通知,切面在某个连接点执行的操作(分为五大通知: Before advice , After returning advice , After throwing advice , After (finally) advice , Around advice );
  4. Pointcut :切点,符合切点表达式的连接点,也就是真正被切入的地方;目标类的切点(例如各个方法),切点来筛选连接点
  5. .织入: 把切面应用到目标对象来创建新的代理对象的过程

7.4 AOP代理方式

动态代理:

  1. JDK Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 目标类实现InvocationHandler 接口
public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}
  1. cglib动态代理: 目标类不需要修改 ,代理类实现MethodInterceptor 接口,Enhancer 类生成代理类

默认情况下 若目标类实现jdk接口,spring会使用jdk代理,其他情况则使用cglib代理
静态代理:

8、linux

8.1 常用网络命令

ping、telnet、traceroute、ifconfig、wget、curl、netstat、ftp、ssh、nslookup

9 分布式事务

9.1 CAP理论

CAP定理是由加州大学伯克利分校Eric Brewer教授提出来的,他指出WEB服务无法同时满足一下3个属性:

  • 一致性(Consistency) : 客户端知道一系列的操作都会同时发生(生效)
  • 可用性(Availability) : 每个操作都必须以可预期的响应结束
  • 分区容错性(Partition tolerance) : 即使出现单个组件无法可用,操作依然可以完成

9.2 XA协议两段式提交

其中,XA 是一个两阶段提交协议,该协议分为以下两个阶段:

第一阶段:事务协调器要求每个涉及到事务的数据库预提交(precommit)此操作,并反映是否可以提交.
第二阶段:事务协调器要求每个数据库提交数据。

其中,如果有任何一个数据库否决此次提交,那么所有数据库都会被要求回滚它们在此事务中的那部分信息。这样做的缺陷是什么呢? 咋看之下我们可以在数据库分区之间获得一致性。

9.3 补偿事务(TCC)

TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。它分为三个阶段:

  • Try 阶段主要是对业务系统做检测及资源预留

  • Confirm 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。

  • Cancel 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。

参考博客
https://www.cnblogs.com/songanwei/p/9388061.html
https://www.cnblogs.com/Jansens520/p/8624708.html
https://blog.csdn.net/zl1zl2zl3/article/details/81868173
https://blog.csdn.net/zl1zl2zl3/article/details/81868173

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值