关于JAVA常用框架面试题

本文详细探讨了Spring框架的IOC和AOP特性,MyBatis的#{}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.Spring面试问题
1.Spring是什么?Spring有哪些优点?
*Spring是一个庞大的体系,里面包括Spring旗下的很多产品比如SpringBoot、SpringDate
SpringFramework,其中我们最多使用的是SpringFarmework中的IOC、AOP,IOC为控制反转,
也称为DI(依赖注入),依赖对象的创建和维护交给了spring容器来管理,应用程序本身不需
要负责依赖对象的创建和维护,简单理解就是把原本应该我们去new对象这个操作转到spring
容器中执行。
AOP面向切面编程,本质就是拦截器,比如项目中的事务和日志就是很好的体现
了AOP。比如:操作数据库的增删改之前,都需要开启事务,增删改之后,都需要提交事务,
这样我们就可以写一个拦截器,底层就是采用动态代理实现前置通知和后置通知,在前置通
知中开启事务,在后置通知中提交事务,在spring.xml中配置通知即可,spring的事务管理
底层就用到了AOP
*Spring是非侵入式的,基于Spring开发的应用一般不依赖于Spring的类
*Spring提供对事务的管理

2.Spring注入方式有那些
*setter注入:对于习惯了传统的JavaBean开发的程序员来说,通过setter方法注入属性
值是熟悉的、直观的和自然的。如果依赖关系比较复杂,那么构造方法注入方式会导致构造
方法相当庞大,此时使用设值方式更为简洁
*构造注入:构造方法注入很好的响应了Java设计原则之一,在构造期间即可创建一个完整、
合法的对象;避免了繁琐的setter方法的编写,所有的依赖关系均在构造方法中设定,依赖
关系集中体现;
*接口注入


二.MyBatis面试问题
**  #{}和${}区别是什么?
1 #是将传入的值当做字符串的形式,
eg:select id,name,age from student where id =#{id},当前端把id值1,
传入到后台的时候,就相当于 select id,name,age from student where id ='1'.

2 $是将传入的数据直接显示生成sql语句,
eg:select id,name,age from student where id =${id},当前端把id值1,
传入到后台的时候,就相当于 select id,name,age from student where id = 1.

3 使用#可以很大程度上防止sql注入。(语句的拼接)

4 但是如果使用在order by 中就需要使用 $.

5 在大多数情况下还是经常使用#,但在不同情况下必须使用$. 

我觉得#与的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,
而{}穿入值,sql解析时,参数是不带引号的。

** 讲一下mybatis的缓存机制
MyBatis提供了查询缓存来缓存数据,以提高查询的性能,MyBatis的缓存分为一级缓存和二级缓存。
一级缓存:SqlSession级别的缓存,基于HashMap本地缓存,当同一个sqlSession执行两次相同的SQL
语句时,第一次执行完后会将数据库中查询到的结果写到缓存,第二次查询时直接从缓冲中读取不经
过数据库了。一级缓存默认时开启的二级缓存:mapper级别的缓存,也是基于hashmap本地缓存,不
1同的sqlSession两次执行相同的namespace下的sql语句,第二次查询就不会进行数据库了。


三.Hibernate面试问题
** Hibernate的工作原理?
1.通过Configuration读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource>读取并解析映射文件
3.通过config.buildSessionFactory创建sessionFactory
4.通过sessionFactory.openSession获取session
5.通过session.beginTransaction开启事务
6.操作数据
7.提交事务
8.关闭session和sessionFactory

** Hibernate的优缺点
 
优点:
①. 对JDBC访问数据库的代码进行了封装,简化了数据库访问层繁琐的重复性代码
②. 映射的灵活性,它支持各种关系数据库,从一对一到多对多的各种复杂关系
③. 非侵入性、移植性会好
④. 缓存机制:提供一级缓存和二级缓存
缺点:
①. 无法对SQL进行优化
②. 框架中使用ORM原则,导致配置过于复杂
③. 执行效率和原生的JDBC相比偏差:特别是在批量数据处理的时候
④. 不支持批量修改、删除

** 在Hibernate应用中Java对象的状态有那些
 
①. 临时状态(新建状态):不处于session缓存中
②. 持久化状态:加入到session缓冲中
③. 游离状态:已经被持久化,但不在session的缓存中

** Hibernate如何延迟加载
 
当调用session的load()方法加载实体类时,就会延迟加载

**  Hibernate进行大批量更新的经验
 
直接通过JDBC API执行相关的SQL语句或者调用相关的存储过程是最佳的方式

**  Hibernate的缓存机制
 
**  Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存,当hibernate根据ID访问数据对象时,首先会从session一级缓存中查;查不到,如果配置了二级缓存,则从二级缓存中查;如果都查不到,再查询数据库。
①. 一级缓存:又称为”Session级别缓存”,只存在于session的生命周期中,当session关闭时,该session所管理的一级缓存也会被立即清除。该缓存由Hibernate管理,应用程序无须干预
②. 二级缓存:又称为”SessionFactory级别缓存”,存在于整个应用程序中,一个应用程序对应一个SessionFactory。该缓存可以进行配置和更改,并且可以动态加载和卸载,hibernate为查询结果提供了一个查询缓存,它依赖于二级缓存

**  Hibernate中getCurrentSession()和openSession()的区别?
 
①. getCurrentSession()会先查看当前线程中是否绑定了session,如果有则直接返回,如果没有再创建。而openSession()则直接new一个新的session并返回
②. getCurrentSession在事务提交时会自动关闭session,而openSession()需要手动关闭

** Hibernate查询方式有哪些
 
①. QBC标准查询
②. HQL查询(Hibernate query language hibernate查询语言)
③. 本地SQL查询(原生态查询)

** Hibernate中Load()和get()区别
 
①. 从返回结果上对比:get方法检索不到结果的话,返回结果为null;但是load()方法检索不到结果的话,则会出现ObjectNotFoundException异常
②. 从检索机制上对比:load支持延迟加载(懒加载),get不支持延迟加载

四.Hibernate与mybatis区别
 
** 开发效率方面:
①. hibernate开发中,sql语句已经被封装,直接可以使用,加快系统开发(但是对于庞大复杂系统项目来说,负责语句较多,hibernate就不是一个很好的方案)
②. Mybatis属于半自动化,sql需要手工完成,稍微繁琐
** SQL优化方面
①. Hibernate自动生成SQL,有些语句较为繁琐,会多消耗一些性能
②. MyBatis手动编写SQL,可以避免不需要的查询,提高系统性能
** 对象管理方面
①. hibernate是完整的ORM框架,开发过程中,无需过多关注底层实现,只需要管理对象即可
②. MyBatis需要自行管理映射关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值