面试官常问的 web后台 问题 21-30
21、Hibernate 的工作原理
①. 通过 Configuration 读取并解析 hibernate.cfg.xml 配置文件
②. 由 hibernate.cfg.xml 中的<mapping resource>读取并解析映射文件
③. 通过 config.buildSessionFactory 创建 sessionFactory
④. 通过 sessionFactory.openSession 获取 session
⑤. 通过 session.beginTransaction 开启事务
⑥. 操作数据
⑦. 提交事务
⑧. 关闭 session 和 sessionFactory
1.通过Configuration config = new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过SessionFactory sf = config.buildSessionFactory();//创建SessionFactory
4.Session session = sf.openSession();//打开Sesssion
5.Transaction tx = session.beginTransaction();//创建并启动事务Transation
6.persistent operate操作数据,持久化操作
7.tx.commit();//提交事务
8.关闭Session
9.关闭SesstionFactory
什么是Hibernate?
Hibernate : ORM框架/持久层框架 jdbc 的一个框架
object reference mapping
通过管理对象来改变数据库中的数据、操作数据库
Hibernate优势: 跨数据库的无缝移植
hibernate核心接口
session:负责被持久化对象CRUD操作
sessionFactory:负责初始化hibernate,创建session对象
configuration:负责配置并启动hibernate,创建SessionFactory
Transaction:负责事物相关的操作
Query和Criteria接口:负责执行各种数据库查询
具体步骤:
-
添加hibernate相关依赖
-
在resource目录下添加hibernate.cfg.xml(核心配置文件)
添加DTD支持
添加Hibernate的配置
数据库相关:(connection.username|connection.password|connection.url|connection.driver_class|dialect)
调试相关:
(show_sql|format_sql) -
在开发阶段再创建实体类和实体映射文件(*.hbm.xml)
实体必须实现Serializable接口
22、Hibernate 的优缺点
优缺点:
①. 对SQL代码进行封装;无法对 SQL 进行优化。
②. 映射灵活,支持各种关系数据库;使用 ORM 原则,导致配置过于复杂
③. 非侵入性、移植性好;执行效率和原生的 JDBC 相比偏差:特别是在批量数据处理的时候
④. 缓存机制:提供一级缓存和二级缓存;不支持批量修改、删除
非侵入性
hibernate使用xml或JPA的配置以及数据库方言等等的机制,使得hibernate具有更好的移植性,对于不同的数据库,开发者只需要使用相同的数据操作即可,无需关心数据库之间的差异。而直接使用JDBC就不得不考虑数据库差异的问题。
23、在 Hibernate 应用中 Java 对象的状态有那些
临时状态、持久化状态、游离状态
①. 临时状态(新建状态):不处于 session 缓存中
②. 持久化状态:加入到 session 缓冲中
③. 游离状态:已经被持久化,但不在 session 的缓存中
24、Hibernate 如何延迟加载
调用session的load()方法加载实体类
当调用 session 的 load()方法加载实体类时,就会延迟加载
25、Hibernate 进行大批量更新的经验
1、通过 JDBC API 执行相关的 SQL 语句
2、调用相关的存储过程
26、Hibernate 的缓存机制
一级缓存:session 级别缓存,只存在于 session 的生命周期;
二级缓存:SessionFactory 级别缓存,存在于整个应用程序中;;
Hibernate缓存包括两大类: Hibernate一级缓存和 Hibernate二级缓存,当 hibernate 根据 ID访问数据对象时, 首先会从 session
一级缓存中查;查不到,如果配置了二级缓存,则从二级缓存中查;如果都查不到,再查询数据库。
①. 一级缓存:又称为”session 级别缓存”,只存在于 session 的生命周期中,当 session 关闭时,该 session 所管理的一级
缓存也会被立即清除。该缓存由 Hibernate 管理,应用程序无须干预。
②. 二级缓存:又称为”SessionFactory 级别缓存”,存在于整个应用程序中,一个应用程序对应一个 SessionFactory。该缓
存可以进行配置和更改,并且可以动态加载和卸载,hibernate 为查询结果提供了一个查询缓存,它依赖于二级缓存
27、Hibernate 中 getCurrentSession()和 openSession()的区别?
getCurrentSession():先查看线程中是否绑定了session,有则直接返回,无则先创建;事务提交后自动关闭;
openSession():直接创建新session并返回;事务提交后手动关闭。
①. getCurrentSession()会先查看当前线程中是否绑定了 session,如果有则直接返回,如果没有再创建。
而 openSession()则直接 new 一个新的 session 并返回;
②. getCurrentSession 在事务提交时会自动关闭 session,而 openSession()需要手动关闭
28、Hibernate 查询方式有哪些
①. QBC 标准查询
②. HQL 查询(Hibernate query language hibernate 查询语言)
③. 本地 SQL 查询(原生态查询)
29、Hibernate 中 load()和 get()区别
load():检索不到结果会报ObjectNotFoundException异常;支持懒加载(延迟加载);
get():检索不到结果会返回结果null;不支持懒加载(延迟加载);
①. 从返回结果上对比:get 方法检索不到结果的话,返回结果为 null;但是 load()方法检索不到结果的话,则会出现
ObjectNotFoundException 异常
②. 从检索机制上对比:load 支持延迟加载(懒加载),get 不支持延迟加载
30、Spring 是什么及 Spring 的优点
Spring 是一个轻量级的 IOC 和 AOP 容器框架,包含并且管理应用对象的生命周期和配置,提供对事务的管理;是非侵入式的,基于 Spring 开发的应用一般不依赖于 Spring 的类;对主流的框架提供了很好的集成支持,比如和 hibernate SpringMVC 等框架的集成①. Spring 是一个轻量级的 IOC 和 AOP 容器框架
②. Spring 是非侵入式的,基于 Spring 开发的应用一般不依赖于 Spring 的类
③. Spring 是个容器,因为它包含并且管理应用对象的生命周期和配置,比如对象的创建、销毁、回调等
④. Spring 提供对事务的管理
⑤. Spring 对主流的框架提供了很好的集成支持,比如和 hibernate SpringMVC 等框架的集成