Hibernate
二、Hibernate框架
1、为什么要使用Hibernate框架
使用JDBC操作数据的缺点
(1)重复性工作多 (2)代码冗余
n
(3)开发效率低 (4)代码移植困难
使用Hibernate
(1)简化了JDBC 繁琐的编码
(2)提高开发效率,提高可维护性
(3)便于移植
---------------------------------
举例说明:
JDBC持久化保存用户操作
Connection connection=null;
PreparedStatement pstmt=null;
Class.forName("oracle.jdbc.driver.OracleDriver");
connection=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","system","system");
pstmt=connection.prepareStatment("insert into Users(userId,userName,password) values(seq_user.nextval,?,?)";
pstmt.setString(1,"hzhy");
pstmt.setString(2,"123456");
int rows=pstmt.executeUpdate();
pstmt.close();
connection.close();
Hhibernate保存用户操作
session.save(user);
---------------------------------------------------------------------------
2、什么是Hibernate框架:Hibernate是一个轻量级的实现数据持久化操作的ORM对象关系映射框架。
(1)轻量级:体积小、消耗资源少,是对JDBC进行轻量级的封装
(2)持久化:程序数据在瞬时状态和持久状态间转换的过程
(3)ORM对象关系映射:用于实现面向对象编程语言和关系型数据库之间的数据转换。
(a)编写程序的时候,以面向对象的方式处理数据
(b)保存数据的时候,却以关系型数据库的方式存储
3、使用Hibernate的步骤
(1)添加Hibernate Jar文件
hibernate3.jar:核心文件
antlr-2.7.6.jar:词法分析
commons-collections-3.1.jar:操作集合
dom4j-1.6.1.jar:解析XML文档
javassist-3.9.0.GA.jar:操作字节码
jta-1.1.jar:事务管理API
slf4j-api-1.7.21.jar:Simple Log Framework,简单日志框架(只有接口)
slf4j-log4j12-1.7.21.jar:在slf4j和log4j之间转换的工具,采用的适配器模式
log4j-1.2.17.jar:日志框架
ojdbc6-11.1.0.7.0.jar:JDBC驱动包
(2)编写Hibernate配置文件
(3)创建持久化类和映射文件
(4)使用Hibernate API实现持久化操作
SessionFactory sf=null;
Session session=null;
Transaction tx=null;
try {
//1.读取配置文件
Configuration config=new Configuration().configure();
//2.创建SessionFactory
sf=config.buildSessionFactory();
//3.创建Session
session=sf.openSession();
//4.开启事务
tx=session.beginTransaction();
//5.持久化操作
session.save(user);
//6.提交事务
tx.commit();
} catch (HibernateException e) {
//6.回滚事务
if(tx!=null&&tx.isActive()){
tx.rollback();
}
e.printStackTrace();
}finally{
//7.关闭Session
session.close();
}
4、get()和load()方法的区别
(1)使用get()加载对象会立即执行SQL语句,而使用load()方法加载对象不会立即执行SQL语句,只有当真正访问这个对象(除了OID之外的属性或调用方法)时才真正执行SQL语句
(2)使用get()加载对象返回真实的实体类型,所有属性已初始化(从数据库获取相应的值);而使用load()方法加载返回的是代理对象,除了OID(对象标识符)之外,其它的属性都没初始化
(3)当不能加载数据时,get()方法会返回null,如果访问OID会报NullPointerException;load()方法依然返回依然返回代理对象,访问OID不会报NullPointerException,访问其他属性时会报ObjectNotFoundException
(4)使用load()可以实现延迟加载,从而提高性能。所以在不需要访问对象的时候,可以优先考虑使用load()方法
5、openSession()和getCurrentSession()的区别
(1)openSession()每次都获取新的Session对象,getCurrentSession()获取当前Session上下文中已有的对象,如果没有,才创建一个新的Session对象
(2)getCurrentSession()方法获取Session对象需要在Hibernate配置文件中配置管理session的上下文,如下所示:
<property name="hibernate.current_session_context_class">thread</property>
(3)getCurrentSession()方法获取Session对象,在事务提交时会自动关闭Session对象。
6.Hibernate辅助工具类:用于获取Session和关闭Session
(1)初始化一个ThreadLocal对象,ThreadLocal对象有get()和set()方法
(2)ThreadLocal对象的get()方法根据当前线程返回其对应的线程内部变量,即Session对象,保证每个线程都有自己的独立的Session对象,避免了多线程情况下共享数据库连接造成的不安全。
(3)通过ThreadLocal类,可以在用户同一次请求过程中,实现事务操作,并且解决了多线程并发的线程同步问题,为同一个变量在每一个线程中都保留自己的副本。
三、Hibernate中java对象的三种状态及其相互转换
1、Java对象的三种状态
(1)瞬时态(Transient,自由状态):自由地游荡于session之外,不归于Hibernate缓存管理
(2)持久态(Persitent):已经被保存进数据库的实体对象
(3)游离态(Detached,脱管状态):和自由态的区别在于有对象标识符
2、瞬时态对象的特点
(1) 不和 Session 实例关联
(2) 在数据库中没有关联的记录
3、持久态对象的特点:
(1) 和 Session 实例关联,归于Hibernate缓存管理
(2) 在数据库中有关联的记录
4、游离态对象的特点
(1) 本质上和瞬时对象相同
(2) 只是比瞬时态对象多了一个对象标识符id(对应数据库记录主键列的值)
5、三种状态之间的转换
(1)瞬时态转换为持久态:通过 Session 的 save() 和 saveOrUpdate() 方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。
(2)持久态转换为瞬时态:
(3)持久态转换为游离态:当执行 close() 或 clear(),evict() 之后,持久对象会变为脱管对象。
(4)游离态转换为持久态:通过 Session 的 update(),saveOrUpdate() 和 lock() 等方法,把脱管对象变为持久对象。
(5)游离态转换为瞬时态
6、脏检查及刷新缓存机制
(1)脏检查
(2)刷新缓存机制
7、更新数据的方法
(1)update
(2)saveOrUpdate
(3)merge:复制一个对象的状态到具有对象标识符的对象中