大三的时候,看了这些Java面试题

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

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 必须将缓存清空保证数据有效性。


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


微信图片_20221010175552.png


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


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


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


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


二级缓存的工作原理是:


微信图片_20221010175558.png

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


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


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


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


--Mybatis在处理#{}时


select id,name,age from teacher where id =#{id}
当前端把id值1传入到后台的时候,就相当于:
select id,name,age from teacher where id ='1'
--Mybatis在处理${}时
select id,name,age from teacher where id =${id}
当前端把id值1传入到后台的时候,就相当于:
select id,name,age from teacher where id = 1

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 物理视图,然后对视图渲染,将数据填充到视图中并返回给客户端。


微信图片_20221010175605.jpg


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方法。


微信图片_20221010175613.png


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


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

目录
相关文章
|
15天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
45 2
|
3天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
26 14
|
20天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
25天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
21天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
43 4
|
22天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
75 4
|
2月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
100 1
Java面试题之Java集合面试题 50道(带答案)
|
2月前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
55 5
|
2月前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
23 1
|
2月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
30 3