2

❤️大三的时候,看了这些Java面试题【附答案】,我进华为了![建议收藏]❤️

 3 years ago
source link: https://blog.csdn.net/mengchuan6666/article/details/119771358
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

❤️大三的时候,看了这些Java面试题【附答案】,我进华为了![建议收藏]❤️

专栏收录该内容
62 篇文章 45 订阅

如果要进大厂,算法、底层、项目经验都要刷,猛哥以后会给大家更新各种面试题……

如果要进大厂,项目经验、底层算法、网络、数据机构等都要狂刷……

原来我进大厂之前就是这么干的,刷项目,刷题。

孟哥以后会给大家更新各种面试资料,走起!

前面,我们已经整理Spring、设计模式、数据结构和算法、mysql等的面试题:

1,❤️爆肝!整理了一周的Spring面试大全【含答案】,吊打Java面试官【建议收藏】!❤️

2,❤️肝完了,一天掌握数据结构和算法面试题,吊打面试官,建议收藏❤️

3,❤️集合很简单?开什么玩笑?肝了一周,全是精华,万字讲解!面试再不怕集合问题了!!!❤️

4,肝完了,总结了SpringBoot与缓存的知识点,快速掌握

5,Mysql面试大全,看完可以吊打面试官!!!

6,入计算机专业的师弟师妹,别再迷茫了,我整理一份CS的学习路线大全!帮你超越大部分的同学!

昨天小伙伴给我说看了面试题,拿到了京东的offer,大家继续努力呀。

如果你想进大厂,一定要有非常明确的信念:

我必须进去!一定进去!

别犹豫犹豫的,整天自我否定,总有人要赢,赢得人为什么不是我呢???

我非常欣赏衡水中学的教学模式,我们普通人没有别的逆袭方式,就是努力,就是干!!!!

废话不多说!

今天猛哥给大家整理一波Mybatis、SprigMvc、Spring DataJpa的面试题:

目录

Mybatis的面试题:

Q1:Mybatis 的优缺点?

Q2:Mybatis 的 XML ⽂件有哪些标签属性?

Q3:Mybatis 的⼀级缓存是什么?

Q4:Mybatis 的⼆级缓存是什么?

Q5:Mybatis  #{}和${}的区别?

Q6、MyBatis实现一对多有几种方式,怎么操作的?

Spring Data JPA ⾯试题:

Q1:ORM 是什么?

Q2:JPA 如何使⽤?

Q3:JPA 实体类相关注解有哪些?

Q4:对象导航查询是什么?

Spring MVC面试题:

Q1:Spring MVC 的处理流程?

Q2:Spring MVC 有哪些组件?

Q3:Spring MVC 的相关注解?

Spring的面试:

Q1:AOP 是什么?

Q2:AOP 的相关注解有哪些?

Q3:AOP 的相关术语有什么?

Q4:AOP 的过程?

Mybatis的面试题:

Q1:Mybatis 的优缺点?

优点:

相⽐ JDBC 减少了⼤量代码量,减少冗余代码。

使⽤灵活,SQL 语句写在 XML ⾥,从程序代码中彻底分离,降低了耦合度,便于管理。提供 XML 标签,⽀持编写动态 SQL 语句。

提供映射标签,⽀持对象与数据库的 ORM 字段映射关系。

缺点:

SQL 语句编写⼯作量较⼤,尤其是字段和关联表多时。

SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

Q2:Mybatis 的 XML ⽂件有哪些标签属性?

select 、 insert 、 update 、 delete 标签分别对应查询、添加、更新、删除操作。

parameterType属性表示参数的数据类型,包括基本数据类型和对应的包装类型、String 和 JavaBean 类型,当有多个参数时可以使⽤#的形式表示第 n 个参数。除了基本数据类型都要以全限定类名的形式指定参数类型。

resultType表示返回的结果类型,包括基本数据类型和对应的包装类型、String 和 Java Bean 类型。

还可以使⽤把返回结果封装为复杂类型的resultMap。

Q3:Mybatis 的⼀级缓存是什么?

⼀级缓存是 SqlSession 级别,默认开启且不能关闭。

操作数据库时需要创建 SqlSession 对象,对象中有⼀个 HashMap 存储缓存数据,不同 SqlSession 之间缓存数据区域互不影响。

⼀级缓存的作⽤域是 SqlSession 范围的,在同⼀个 SqlSession 中执⾏两次相同的 SQL 语句时,第⼀次执⾏完毕会将结果保存在缓存中,第⼆次查询直接从缓存中获取。

如果 SqlSession 执行了 DML 操作(insert、update、delete),Mybatis 必须将缓存清空保证数据有效性。

一级缓存的工作原理如下所示:

Q4:Mybatis 的⼆级缓存是什么?

⼆级缓存是Mapper 级别,默认关闭。

使⽤二级缓存时多个 SqlSession 使⽤同⼀个 Mapper 的 SQL 语句操作数据库,得到的数据会存在⼆级缓存区,同样使⽤ HashMap 进行数据存储,相⽐于⼀级缓存,⼆级缓存范围更⼤,多个 SqlSession 可以共⽤⼆级缓存,作⽤域是 Mapper 的同⼀个 namespace,不同 SqlSession 两次执⾏相同的namespace 下的 SQL 语句,参数也相等,则第⼀次执行成功后会将数据保存在⼆级缓存中,第⼆次可直接从⼆级缓存中取出数据。

要使⽤⼆级缓存,需要在全局配置⽂件中配置<setting name="cacheEnabled" value="true"/>,再在对应的映射⽂件中配置⼀个<cache/>标签。

二级缓存的工作原理是:

Q5:Mybatis  #{}和${}的区别?

使⽤${}相当于使⽤字符串拼接,存在 SQL 注⼊的⻛险。

使⽤#{}相当于使用占位符,可以防⽌ SQL 注入,不⽀持使⽤占位符的地⽅就只能使⽤${},典型情况就是动态参数。

${}是字符串替换,相当于直接显示数据,#{}是预编译处理,相当于对数据加上双引号,即#是将传入的值当做字符串的形式,先替换为?号,然后调用PreparedStatement的set方法来赋值,而$是将传入的数据直接显示生成sql语句

--Mybatis在处理#{}时

Q6、MyBatis实现一对多有几种方式,怎么操作的?

A.联合查询:几个表联合查询,只查询一次,通过在resultMap里面配置collection节点配置一对多的类就可以完成。

B.嵌套查询:是先查一个表,根据这个表里面的结果的外键id去另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。

Spring Data JPA 试题:

Q1:ORM 是什么?

ORM 即 Object-Relational Mapping ,表示对象关系映射,映射的不只是对象的值还有对象之间的关系,通过 ORM 就可以把对象映射到关系型数据库中。操作实体类就相当于操作数据库表,可以不再重点关注 SQL 语句。

Q2:JPA 如何使用?

只需要持久层接⼝继承 JpaRepository 即可,泛型参数列表中第⼀个参数是实体类类型,第⼆个参数是主键类型。

运⾏时通过JDKDynamicAopProxy的invoke方法创建了⼀个动态代理对象。

SimpleJpaRepository , SimpleJpaRepository中封装了JPA的操作,通过 hibernate (封装了

JDBC)完成数据库操作。

Q3:JPA 实体类相关注解有哪些?

@Entity :表明当前类是⼀个实体类。

@Table:关联实体类和数据库表。

@Column:关联实体类属性和数据库表中字段。

@Id:声明当前属性为数据库表主键对应的属性。

@GeneratedValue : 配置主键⽣成策略。

@OneToMany:配置⼀对多关系,mappedBy 属性值为主表实体类在从表实体类中对应的属性名。

@ManyToOne:配置多对⼀关系,targetEntity 属性值为主表对应实体类的字节码。

@JoinColumn :配置外键关系,name 属性值为外键名称,referencedColumnName 属性值为主表主键名称。

Q4:对象导航查询是什么?

通过 get 方法查询⼀个对象的同时,通过此对象可以查询它的关联对象。

对象导航查询⼀到多默认使⽤延迟加载的形式,关联对象是集合,因此使⽤⽴即加载可能浪费资源。对象导航查询多到⼀默认使⽤⽴即加载的形式, 关联对象是⼀个对象,因此使⽤⽴即加载。

如果要改变加载方式,在实体类注解配置加上 fetch 属性即可,LAZY 表示延迟加载,EAGER 表示⽴即加载。

Spring MVC面试题:

Q1:Spring MVC 的处理流程?

Web 容器启动时会通知 Spring 初始化容器,加载 Bean 的定义信息并初始化所有单例 Bean,然后遍历容器中的 Bean,获取每⼀个 Controller 中的所有⽅法访问的 URL,将 URL 和对应的 Controller 保存 到⼀个 Map 集合中。

所有的请求会转发给 DispatcherServlet 前端处理器处理,DispatcherServlet 会请求 HandlerMapping找出容器中被@Controler注解修饰的 Bean 以及被@RequestMapping

修饰的⽅法和类,⽣成Handler 和 HandlerInterceptor 并以⼀个 HandlerExcutionChain 处理器执⾏链的形式返回。

之后 DispatcherServlet 使⽤ Handler 找到对应的 HandlerApapter,通过 HandlerApapter 调⽤Handler 的⽅法,将请求参数绑定到⽅法的形参上,执⾏⽅法处理请求并得到 ModelAndView。最后 DispatcherServlet 根据使⽤ ViewResolver 试图解析器对得到的 ModelAndView 逻辑视图进⾏解析得到 View 物理视图,然后对视图渲染,将数据填充到视图中并返回给客户端。

Q2:Spring MVC 有哪些组件?

DispatcherServlet :SpringMVC 中的前端控制器,是整个流程控制的核⼼,负责接收请求并转发给对应的处理组件。

Handler :处理器,完成具体业务逻辑,相当于 Servlet 或 Action。

HandlerMapping :完成 URL 到 Controller 映射,DispatcherServlet 通过 HandlerMapping 将不同请求映射到不同 Handler。

HandlerInterceptor :处理器拦截器,是⼀个接口,如果需要完成⼀些拦截处理,可以实现该接口。

HandlerExecutionChain :处理器执行链,包括两部分内容:Handler 和 HandlerInterceptor。

HandlerAdapter :处理器适配器,Handler执行业务方法前需要进⾏⼀系列操作,包括表单数据验证、数据类型转换、将表单数据封装到JavaBean等,这些操作都由 HandlerAdapter 完成。 DispatcherServlet 通过 HandlerAdapter 来执⾏不同的 Handler。

ModelAndView :装载模型数据和视图信息,作为 Handler 处理结果返回给 DispatcherServlet。

ViewResolver :视图解析器,DispatcherServlet 通过它将逻辑视图解析为物理视图,最终将渲染的结果响应给客户端。

Q3:Spring MVC 的相关注解?

@Controller :在类定义处添加,将类交给IoC容器管理。

@RequtestMapping :将URL请求和业务方法映射起来,在类和⽅法定义上都可以添加该注

解。 value 属性指定URL请求的实际地址,是默认值。 method 属性限制请求的⽅法类型,包括GET、POST、PUT、DELETE等。如果没有使⽤指定的请求⽅法请求URL,会报405 Method Not Allowed 错误。 params 属性限制必须提供的参数,如果没有会报错。

@RequestParam :如果 Controller 方法的形参和 URL 参数名⼀致可以不添加注解,如果不⼀致可以使用该注解绑定。value属性表示HTTP请求中的参数名。required 属性设置参数是否必要,默认false。 defaultValue 属性指定没有给参数赋值时的默认值。

@PathVariable :Spring MVC ⽀持 RESTful风格 URL,通过的绑定。

Spring的面试:

Q1:AOP 是什么?

AOP 即⾯向切⾯编程,简单地说就是将代码中重复的部分抽取出来,在需要执⾏的时候使⽤动态代理技术,在不修改源码的基础上对方法进⾏增强。

Spring 根据类是否实现接⼝来判断动态代理⽅式,如果实现接⼝会使⽤ JDK 的动态代理,核⼼是 InvocationHandler 接⼝和 Proxy 类,如果没有实现接⼝会使⽤ CGLib 动态代理,CGLib 是在运⾏时动态⽣成某个类的子类,如果某个类被标记为 final,不能使⽤ CGLib 。

JDK 动态代理主要通过重组字节码实现,首先获得被代理对象的引⽤和所有接口,⽣成新的类必须实现被代理类的所有接⼝,动态生成Java 代码后编译新⽣成的   ⽂件并重新加载到 JVM 运⾏。JDK代理直接写 Class 字节码,CGLib 是采⽤ ASM 框架写字节码,生成代理类的效率低。但是 CGLib 调⽤⽅法的效率⾼,因为 JDK 使⽤反射调用方法,CGLib 使⽤ FastClass 机制为代理类和被代理类各生成⼀个类,这个类会为代理类或被代理类的⽅法⽣成⼀个 index,这个 index 可以作为参数直接定位要调⽤的⽅法。

常⽤场景包括权限认证、⾃动缓存、错误处理、日志、调试和事务等。

Q2:AOP 的相关注解有哪些?

@Aspect :声明被注解的类是⼀个切⾯ Bean。

@Before :前置通知,指在某个连接点之前执行的通知。

@After :后置通知,指某个连接点退出时执⾏的通知(不论正常返回还是异常退出)。

@AfterReturning :返回后通知,指某连接点正常完成之后执行的通知,返回值使⽤returning属性接收。

@AfterThrowing :异常通知,指⽅法抛出异常导致退出时执行的通知,和 @AfterReturning 只会有⼀个执⾏,异常使用throwing属性接收。

Q3:AOP 的相关术语有什么?

Aspect :切⾯,⼀个关注点的模块化,这个关注点可能会横切多个对象。

Joinpoint :连接点,程序执执过程中的某⼀行为,即业务层中的所有方法。。

Advice  :通知,指切⾯对于某个连接点所产生的动作,包括前置通知、后置通知、返回后通知、异常通知和环绕通知。

Pointcut :切入点,指被拦截的连接点,切⼊点⼀定是连接点,但连接点不⼀定是切⼊点。

Proxy :代理,Spring AOP 中有 JDK 动态代理和 CGLib 代理,目标对象实现了接口时采⽤ JDK 动态代理,反之采用CGLib 代理。

Target :代理的目标对象,指⼀个或多个切⾯所通知的对象。

Weaving:织入,指把增强应⽤到目标对象来创建代理对象的过程。

Q4:AOP 的过程?

Spring AOP 由 BeanPostProcessor 后置处理器开始,后置处理器可以监听容器触发的 Bean 生命周期事件,向容器注册后置处理器以后,容器中管理的 Bean 就具备了接收 IoC 容器回调事件的能力。BeanPostProcessor 的调用发⽣在 Spring IoC 容器完成 Bean 实例对象的创建和属性的依赖注入后,为 Bean 对象添加后置处理器的入口是initializeBean方法。

Spring 中 JDK 动态代理通过 JdkDynamicAopProxy 调⽤ Proxy 的newInstance方法来⽣成代理类,

JdkDynamicAopProxy 也实现了 InvocationHandler 接⼝, invoke ⽅法的具体逻辑是先获取应⽤到此⽅法上的拦截器链,如果有拦截器则创建 MethodInvocation 并调⽤其调⽤目标proceed方法。因此 Spring AOP 对目标对象的增强是通过拦截器实现的。

前面,我们已经整理Spring、设计模式、数据结构和算法、mysql等的面试题:

1,❤️爆肝!整理了一周的Spring面试大全【含答案】,吊打Java面试官【建议收藏】!❤️

2,❤️肝完了,一天掌握数据结构和算法面试题,吊打面试官,建议收藏❤️

3,❤️集合很简单?开什么玩笑?肝了一周,全是精华,万字讲解!面试再不怕集合问题了!!!❤️

4,肝完了,总结了SpringBoot与缓存的知识点,快速掌握

5,Mysql面试大全,看完可以吊打面试官!!!

6,入计算机专业的师弟师妹,别再迷茫了,我整理一份CS的学习路线大全!帮你超越大部分的同学!

好了,Java面试整理结束,小伙伴们点赞、收藏、评论,一键三连走起呀,下期见~~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK