【无标题】

 常见的ORM框架都有哪些呢?

1)什么是ORM框架?

所谓的ORM框架,就是对象关系映射框架,就是让JAVA程序中的类里面的属性直接映射到我的数据库中的表里面的列,我们在Java中操作这个类的时候,就相当于直接操作数据库中的表和字段,运用OOP思想;

1)Mybatis是⼀种典型的半自动化的ORM 框架,所谓的半自动,因为还需要⼿动的写 SQL 语句在XML文件里面再由框架根据SQL以及传入数据来进行组装成要执行的SQL

优点:灵活

缺点:数据库更换麻烦

【无标题】_第1张图片

3)Hibernate是⼀种典型的全⾃动 ORM 框架,所谓的全⾃动,是 SQL 语句都不⽤在编写,基于框架的 API,可以将对象⾃动的组装为要执⾏的 SQL 语句,简单的SQL连SQL语句都不用编写,底层会提供一个Insert方法,我们只需要将对象的属性设置进去将这个对象放到方法的参数里面,就可以进行使用了最终调用save方法

优点:

1)全⾃动 ORM 框架,调用固定的方法,⾃动的组装为 SQL 语句,单表查询比较简单;

2)可以跨数据库,底层框架提供了多套主流数据库的 SQL ⽣成规则,数据库从MYSQL转变成SQLServer基本上不需要改一行代码,因为你的是HQL语法,是中间语法,相当于是门面模式;

缺点:

1)学习⻔槛更⾼,要学习框架 API 与 SQL 之间的转换关系,况且如果实现一个简单的增删改查是非常简单的,但是说如果写一些复杂的SQL调用API就会很麻烦,Hibernate提供了一些自己复杂的语法进行复杂SQL查询,提供的HQL语法是一个中间语法,况且最终生成的SQL也不知道,Hibernate提供一些特殊的API来实现更复杂的SQL语句,使用精通非常难;

2)对数据库模型依赖⾮常⼤,在软件需求变更频繁的系统中,会导致⾮常难以调整及维护。可能数据库中随便改⼀个表或字段的定义,Java代码中要修改⼏⼗处。

3)很难定位问题,也很难进⾏性能优化,需要精通框架,对数据库模型设计也⾮常熟悉

SpringBoot自动装配原理,SpringBoot自动化配置的理解

1)springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理

2)SpringBoot再进行自动配置的时候,尤其是我再进行Bean加载的时候,启动的时候,我是根据@SpringBootApplication注解来进行启动的,是一个组合注解

3)启动类的@SpringBootApplication注解由@SpringBootConfiguration,

@EnableAutoConfiguration@ComponentScan三个注解组成,三个注解共同完成自动装配;

1)@SpringBootConfiguration,注解标记启动类为配置类
2)@ComponentScan,注解实现启动时扫描启动类所在的包以及子包下所有标记为bean的类由IOC容器注册为bean,也就是包扫描;

3)@EnableAutoConfiguration是开启自动导入装配

3.1)通过@Import(AutoConigurationPackages.Registrar.class)来实现自动装配配置包下面的所有Bean定义和注册

3.2)其中这里面的@import注解,他会把所有满足条件的Bean全部加载到SpringBoot里面,什么是满足条件的Bean呢?

在SpringBoot里面有一个jar包,也就是在@Import(AutoConfigurationImportSelector.class)注解下面叫做:Maven:org.springframework.boot:spring-boot:2.5.11里面有一个MEAT-INF目录,里面有一个文件叫做spring.factories,里面就记录了所有可以加载和支配启动加载的Bean,里面有PropertySourceLoader,配置信息;

在我们的MyBatis中,我们为什么可以将Mapper接口直接进行注入使用?

我们为什么只在UserService里面写了一个@Resource就可以把标记了@Mapper的接口直接注入使用?

表面上是一个接口,但实际上咱们的程序时不会进行new这个接口的,而是我们使用代理的方式来进行实现的(调用动态代理子类)

Synchronized常见面试题:

1)synchronized在JVM从JDK1.6是有锁升级的一个过程的,况且是靠监视器锁来实现的,在方法进入之前加上一个moniterenter,离开监视器锁是moniterexit,监视器就类似于是一个房间,只能由同一个线程进去,无锁,偏向锁,轻量级锁,重量级锁

2)锁在在对象头里面有一个标识,用来标识当前有没有锁,是属于哪一个线程里面的,当有线程尝试获取这把锁的时候,会进行判断线程ID和我们对象头中的线程ID是不是一致的,如果是一致的,那么代表我是可以重入的,你已经拥有这把锁了,我就可以重新获取到这把锁,说明我是可重入的;

3)如果ID不同,当前锁已经被其他线程占有了,就会一直尝试获取锁使用自旋锁,这是自适应的;

你可能感兴趣的:(oracle,数据库)