Hibernate的缓存机制(重要)

1.说下Hibernate的缓存机制(重要)
一级缓存,二级缓存
Session 的缓存被称为hibernate的第一级缓存。SessionFactory的外置缓存称为hibernate 的二级缓存。这两个缓存都位于持久层,它们存放的都是数据库数据的拷贝。SessionFactory的内置缓存存放元数据和预定义SQL,SessionFactory的内置缓存是只读缓存。
Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。
2.简要说说session.load()和session.get()的区别(重要)
1:在立即加载对象(当hibernate在从数据库中取得数据组装好一个对象后会立即再从数据库取得数据此对象所关联的对象)时,如果对象存在,load()和get()方法没有区别,都可以取得已初始化的对象;但如果当对象不存在且是立即加载时,使用get()方法则返回null,而使用load()则抛出一个异常。因此使用load()方法时,要确认查询的主键ID一定是存在的,从这一点讲它没有get方便!
2:在延迟加载对象(Hibernate从数据库中取得数据组装好一个对象后,不会立即再从数据库取得数据组装此对象所关联的对象,而是等到需要时,都会从数据库取得数据组装此对象关联的对象)时,get()方法仍然使用立即加载的方式发送SQL语句,并得到已初始化的对象,而load()方法则根本不发送SQL语句,它返回一个代理对象,直到这个对象被访问时才被
初始化。
load()方法的执行顺序如下:
a):首先通过id在session缓存中查找对象,如果存在此id的对象,直接将其返回
b):在二级缓存中查找,找到后将 其返回。
c):如果在session缓存和二级缓存中都找不到此对象,则从数据库中加载有此ID的对象
因此load()方法并不总是导致SQL语句,只有缓存中无此数据时,才向数据库发送SQL
主要有以下三项区别:
① 如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。
② get方法直接返回实体类对象,load方法返回实体类对象的代理。
③ 在Hibernate 3之前,get方法只在一级缓存中进行数据查找,如果没有找到对应的数据则越过二级缓存,直接发出SQL语句完成数据读取;load方法则可以从二级缓存中获取数据;从Hibernate 3开始,get方法不再是对二级缓存只写不读,它也是可以访问二级缓存的。
说明:对于load()方法Hibernate认为该数据在数据库中一定存在可以放心的使用代理来实现延迟加载,如果没有数据就抛出异常,而通过get()方法获取的数据可以不存在。
3.持久化类有三种状态,这三种状态各有什么特点?三种状态之间是怎样切换的?

  1. 瞬时态(Transient),也叫临时态。处于这种状态的对象具备的特征如下:
    a) 不在Session的缓存中,不与任何的Session实例相关联。
    b) 在数据库中没有与之相对应的记录。(没有数据库识别值id)
  2. 持久态(Persistent),处于这种状态的对象具备的特征如下:
    a) 在Session的缓存中,与Session实例相关联。
    b) 在数据库中存在与之相对应的记录。
  3. 脱管态(Detached),也叫游离态。处于这种状态的对象具备的特征如下:
    a) 不在Session的缓存中,不与任何的Session实例相关联。
    b) 在数据库中存在与之相对应的记录。(有数据库识别值id)

Hibernate的缓存机制(重要)

4.简要谈谈对hibernate框架的理解(是什么,原理,优点,应用场景以及为什么使用这个框架等)
hibernate是什么:
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的 orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
hibernate工作原理:
①读取并解析hibernate.cfg.xml配置文件;
②由hibernate.cfg.xml中的读取并解析映射信息;
③.通过SessionFactory sf = config.buildSessionFactory();创建SessionFactory
④Session session = sf.openSession();//打开Sesssion
⑤Transaction tx = session.beginTransaction();//创建并启动事务Transation
⑥persistent operate操作数据,持久化操作
⑦tx.commit();//提交事务
⑧关闭Session
⑨关闭SesstionFactory
Hibernate技术特点:
1、 标准的orm框架,程序员不需要编写SQL语句。
2、 具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。
3、 学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。
4、 程序员不能自主的去进行SQL性能优化。
应用场景:
需求明确、业务固定的项目,例如OA项目、ERP项目等

为什么用hibernate:
① 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
②HIbernate是基于JDBC的主流持久化框架,是一个优秀的对象关系映射实现,它在很大程度上简化了DAO层的编码工作;
③Hibernate使用java反射机制,而不是字节码增强程序来实现透明性;
④Hibernate性能非常好,因为它是一个轻量级框架,映射的灵活性很出色,它支持各种关系数据库,从一对一到多对多的各种复杂关系。
5.讲一下你对SQL语句优化的了解(重要,面试必问)
1.尽量避免使用子查询:先查外表再匹配内表,而不是先查内表t2,当外表的数据很大时,查询速度会非常慢。
2.避免函数索引:由于MySQL不像Oracle那样支持函数索引,即使该字段有索引,也会直接全表扫描。
3.用 exists 代替 in,EXISTS 是判断是否存在,和in类似,但效率要比in高
4.尽量不要使用Like模糊查询:全表查询
5.如果知道要查的数据的大概位置,读取适当的记录用LIMIT M,N
6.禁止不必要的ORDER BY排序
7.如果需要插入大量数据,批量INSERT插入,不要一条一条插
8.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
9.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
6.讲一下你对SQL和HQL的一些理解
hql是面向对象查询,格式:from + 类名 + 类对象 + where + 对象的属性
sql是面向数据库表查询,格式:from + 表名 + where + 表中字段
Hibernate 负责解析 HQL 查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句
Hql对大小写敏感
7.简述 Hibernate 和 JDBC 的区别、优缺点?
JDBC与Hibernate在性能上相比,JDBC灵活性有优势。而Hibernate在易学性,易用性上有些优势。当用到很多复杂的多表联查和复杂的数据库操作时,JDBC有优势。
相同点:
◆两者都是JAVA的数据库操作中间件。
◆两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭。
◆两者都可以对数据库的更新操作进行显式的事务处理。
不同点:
◆使用的SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate使用的是HQL(Hibernate query language)语言
◆操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中。
◆数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。