Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任。
1.Hibernate是什么,有什么作用和好处?
Hibernate是一个数据库访问框架,用于实现对数据库的增删改查操作。使用Hibernate框架可以简化数据库访问操作,要程序员将更多的经历放在业务层编写上。
原有JDBC操作数据库存在一些问题,主要有以下几个方面:
a)需要编写大量复杂的SQL语句
b)需要设置大量的SQL参数或者将ResultSet取值封装成实体对象
c)当数据库移值时,需要修改部分SQL语句和操作
使用Hibernate框架可以解决以上问题。
2.什么是ORM?
ORM(Object Relation Mapping)对象关系映射。意思是将程序中的实体对象和关系数据库表中的一行记录进行映射。这样在程序中使用该工具就可以将一个对象写入数据表,或者将数据表记录自动封装成一个对象返回。(这个也是Hibernate实现的原理)
3.Hibernate的几个核心接口?
Configuration类:Configuration用于配置并启动Hibernate。
SessionFactory接口:一个SessionFactory对应一个数据源,它是个重量级对象,不可随意生成多个实例。它是线程安全的,同一个实例可以被应用中的多个线程共享。
Session接口:Session接口是Hibernate应用中使用最广泛的接口了,它是持久化管理器,提供添加、更新、删除、加载、查询对象。Session不是线程安全的,所以应避免多个线程共享同一个Session实例。Session是轻量级对象,它的创建和销毁不需要太多资源,这意味着在应用中可以经常创建和销毁Session对象。
Transaction接口:Transaction是Hibernate的数据库事务接口,它对底层的事务接口进行了封装。
Query和Criteria接口:这两个是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程。
4.Hibernate的一级缓存?
是session级别的缓存。
a.当查询某个对象时,Hibernate首先去一级缓存中查找,如果存在将缓存中的对象取出返回。如果不存在才去数据库查询。
b.当查询某个对象时,Hibernate会自动将数据库查询出的对象放入一级缓存。(例如session的load和get方法查出的对象)
c.一级缓存默认启用,一般被称为Session级别的缓存。因此一级缓存随着Session对象创建,随着Session对象释放而销毁。
d.每个Session都有自己一个独立的一级缓存空间,不能访问其他Session的缓存空间。
----------------------一级缓存的好处-------------------------
在使用同一个Session查询同一个对象若干次的时候,只在第一次时查询数据库,后续几次都会从缓存取出。从而减少对数据库的查询次数。
-----------------------**使用建议(重点)**----------------------------
为了将一级缓存的优势更好的发挥出来,建议在处理一个请求时,使用一个Session对象处理。可以使用ThreadLocal技术封装Session.
在Hibernate中,可以 <!-- 指定将session与处理线程绑定,实现线程单例 -->
5.Hibernate的二级缓存?
二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享 ,可以被多个不Session对象访问,二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
6.Hibernate中session的get和load方法区别?
相同点:作用相同,都是按照主键条件查询某个对象。
不同点:
1).get方法不使用延迟加载机制,load采用延迟加载机制
2).如果没有满足条件的记录,get方法返回null,load则抛出异常
3).load方法返回的对象是一个动态代理类(Hibernate框架动态生成的,是实体类的子类型)。
4).get方法返回的对象类型就是原实体类型
注意:a.在程序中,如果使用上述延迟加载操作,需要避免Session对象过早关闭问题。(could not initialize proxy - no Session)
b.为避免上述异常,一般采用OpenSessionInView模式。
c.可以将Session关闭采用Filter或Interceptor(Struts2推荐)封装。
7.线程单例及其使用
线程单例:
回到服务器中,只要是服务器,每一个浏览器访问服务器时,服务器会为每个浏览器创建一个线程。假设Some就是Session,如果使用这种机制获取Session,当同一个用户浏览器不论怎么调用session都是同一个(只要在相同的线程中)。这种机制就叫做线程单例。
线程单例的实现原理就是如上SomeFactory做的。
8.HQL和SQL的区别
Hibernate Query Language(Hibernate查询语言)
结构化查询语言(Structured Query Language)简称SQL
HQL语句结构与SQL语句相似, SQL语句是面向数据表和字段进行查询,而HQL是面向映射后的对象和属性进行查询。因此HQL被称为面向对象查询语句。
HQL语句与SQL相似点如下:
a.HQL语句支持select,from,where,order by ,group by,having子句
b.HQL语句支持分组函数max,min,avg,sum,count
c.HQL语句支持运算符和表达式
d.HQL语句支持>,>=,<,<=,in,not in,like,between... and...,
<>,!=等查询条件,也支持and,or关键字
e.HQL语句支持inner join,left outer join,full join 等连接
HQL语句与SQL不同点如下:(下面内容为重点)
a.HQL区分大小写(大小写敏感),除关键字之外
b.HQL语句使用的类名和属性名(将SQL表名替换成类名,字段名替换成属性名)
c.HQL不支持select *写法,但支持select count(*)
d.HQL语句不支持表连接的on子句,on关联条件可以通过关联映射自动追加
9.Hibernate中操作并发处理?(乐观锁和悲观锁)
Hibernate框架可以使用锁的机制来解决操作并发。
a.悲观锁
在数据查询出来时,就给数据加一个锁,锁定。这样其他用户再执行删、改操作时不允许。当占用着事务结束,锁会自动解除。
Hibernate采用的是数据库锁机制实现悲观锁控制。
缺点:将并发用户操作同步开,一个一个处理。当一个用户处理时间比较长时,效率会比较低。
b.乐观锁
允许同时更新提交,但是最快的会成功,慢的失败。
在记录中追加一个字段值,用该字段值当做版本。当最先提交者提交后,会自动将版本字段值提升,这样其他用户提交,会发现版本低于数据库记录目前版本,因此抛出异常提示失败。
特点:允许用户同时处理,但只能有一个成功,其他失败,以异常方式提示。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任。
1.Hibernate是什么,有什么作用和好处?
Hibernate是一个数据库访问框架,用于实现对数据库的增删改查操作。使用Hibernate框架可以简化数据库访问操作,要程序员将更多的经历放在业务层编写上。
原有JDBC操作数据库存在一些问题,主要有以下几个方面:
a)需要编写大量复杂的SQL语句
b)需要设置大量的SQL参数或者将ResultSet取值封装成实体对象
c)当数据库移值时,需要修改部分SQL语句和操作
使用Hibernate框架可以解决以上问题。
2.什么是ORM?
ORM(Object Relation Mapping)对象关系映射。意思是将程序中的实体对象和关系数据库表中的一行记录进行映射。这样在程序中使用该工具就可以将一个对象写入数据表,或者将数据表记录自动封装成一个对象返回。(这个也是Hibernate实现的原理)
3.Hibernate的几个核心接口?
Configuration类:Configuration用于配置并启动Hibernate。
SessionFactory接口:一个SessionFactory对应一个数据源,它是个重量级对象,不可随意生成多个实例。它是线程安全的,同一个实例可以被应用中的多个线程共享。
Session接口:Session接口是Hibernate应用中使用最广泛的接口了,它是持久化管理器,提供添加、更新、删除、加载、查询对象。Session不是线程安全的,所以应避免多个线程共享同一个Session实例。Session是轻量级对象,它的创建和销毁不需要太多资源,这意味着在应用中可以经常创建和销毁Session对象。
Transaction接口:Transaction是Hibernate的数据库事务接口,它对底层的事务接口进行了封装。
Query和Criteria接口:这两个是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程。
4.Hibernate的一级缓存?
是session级别的缓存。
a.当查询某个对象时,Hibernate首先去一级缓存中查找,如果存在将缓存中的对象取出返回。如果不存在才去数据库查询。
b.当查询某个对象时,Hibernate会自动将数据库查询出的对象放入一级缓存。(例如session的load和get方法查出的对象)
c.一级缓存默认启用,一般被称为Session级别的缓存。因此一级缓存随着Session对象创建,随着Session对象释放而销毁。
d.每个Session都有自己一个独立的一级缓存空间,不能访问其他Session的缓存空间。
----------------------一级缓存的好处-------------------------
在使用同一个Session查询同一个对象若干次的时候,只在第一次时查询数据库,后续几次都会从缓存取出。从而减少对数据库的查询次数。
-----------------------**使用建议(重点)**----------------------------
为了将一级缓存的优势更好的发挥出来,建议在处理一个请求时,使用一个Session对象处理。可以使用ThreadLocal技术封装Session.
在Hibernate中,可以 <!-- 指定将session与处理线程绑定,实现线程单例 -->
5.Hibernate的二级缓存?
二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享 ,可以被多个不Session对象访问,二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
6.Hibernate中session的get和load方法区别?
相同点:作用相同,都是按照主键条件查询某个对象。
不同点:
1).get方法不使用延迟加载机制,load采用延迟加载机制
2).如果没有满足条件的记录,get方法返回null,load则抛出异常
3).load方法返回的对象是一个动态代理类(Hibernate框架动态生成的,是实体类的子类型)。
4).get方法返回的对象类型就是原实体类型
注意:a.在程序中,如果使用上述延迟加载操作,需要避免Session对象过早关闭问题。(could not initialize proxy - no Session)
b.为避免上述异常,一般采用OpenSessionInView模式。
c.可以将Session关闭采用Filter或Interceptor(Struts2推荐)封装。
7.线程单例及其使用
线程单例:
回到服务器中,只要是服务器,每一个浏览器访问服务器时,服务器会为每个浏览器创建一个线程。假设Some就是Session,如果使用这种机制获取Session,当同一个用户浏览器不论怎么调用session都是同一个(只要在相同的线程中)。这种机制就叫做线程单例。
线程单例的实现原理就是如上SomeFactory做的。
Session session = tl.get0; if (session == null) { session = factory.openSession(); tl.set(session); }8.HQL和SQL的区别
Hibernate Query Language(Hibernate查询语言)
结构化查询语言(Structured Query Language)简称SQL
HQL语句结构与SQL语句相似, SQL语句是面向数据表和字段进行查询,而HQL是面向映射后的对象和属性进行查询。因此HQL被称为面向对象查询语句。
HQL语句与SQL相似点如下:
a.HQL语句支持select,from,where,order by ,group by,having子句
b.HQL语句支持分组函数max,min,avg,sum,count
c.HQL语句支持运算符和表达式
d.HQL语句支持>,>=,<,<=,in,not in,like,between... and...,
<>,!=等查询条件,也支持and,or关键字
e.HQL语句支持inner join,left outer join,full join 等连接
HQL语句与SQL不同点如下:(下面内容为重点)
a.HQL区分大小写(大小写敏感),除关键字之外
b.HQL语句使用的类名和属性名(将SQL表名替换成类名,字段名替换成属性名)
c.HQL不支持select *写法,但支持select count(*)
d.HQL语句不支持表连接的on子句,on关联条件可以通过关联映射自动追加
9.Hibernate中操作并发处理?(乐观锁和悲观锁)
Hibernate框架可以使用锁的机制来解决操作并发。
a.悲观锁
在数据查询出来时,就给数据加一个锁,锁定。这样其他用户再执行删、改操作时不允许。当占用着事务结束,锁会自动解除。
Hibernate采用的是数据库锁机制实现悲观锁控制。
缺点:将并发用户操作同步开,一个一个处理。当一个用户处理时间比较长时,效率会比较低。
b.乐观锁
允许同时更新提交,但是最快的会成功,慢的失败。
在记录中追加一个字段值,用该字段值当做版本。当最先提交者提交后,会自动将版本字段值提升,这样其他用户提交,会发现版本低于数据库记录目前版本,因此抛出异常提示失败。
特点:允许用户同时处理,但只能有一个成功,其他失败,以异常方式提示。