《JavaEE开发技术与案例教程 教学课件 ppt 作者 刘彦君 金飞虎 第7章 hibernate3 入门》由会员分享,可在线阅读,更多相关《JavaEE开发技术与案例教程 教学课件 ppt 作者 刘彦君 金飞虎 第7章 hibernate3 入门(60页珍藏版)》请在金锄头文库上搜索。
1、第7章 hibernate3 入门,7.1 hibernate3 入门 7.2 Hibernate对象状态 7.3 hibernate事务 7.4 Hibernate反向工程 7.5 HQL,7.1 hibernate3 入门,7.1.1 hibernate3简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。我们常用的大部分数据库都是关系型的,而我们的编程思维是OO(面向对象)的,Hibernate就是想使用面向对象的思想来操作数据库。所以,Hibernate只是一个工具,也不是非常
2、神秘。我们最需要适应的是编程思维的改变。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JAVA EE架构中取代CMP,完成数据持久化的重任。,7.1.2 持久层与orm ORM的全称是Object Relational Mapping,即对象关系映射。它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。 对象关
3、系映射(ORM)提供了概念性的、易于理解的模型化数据的方法。ORM方法论基于三个核心原则: 简单性:以最基本的形式建模数据; 传达性:数据库结构被任何人都能理解的语言文档化; 精确性:基于数据模型创建正确标准化了的结构。,7.1.3 概念 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。字母O起源于“对象”(Object),而R则来自于“关系“(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。
4、 当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。,一般的ORM包括以下四部分: (1)一个对持久类对象进行CRUD操作的API; (2)一个语言或API用来规定与类和类属性相关的查询; (3)一个规定mapping metadata的工具; (4)一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化操作。,7.1.5 Hiber
5、nate核心接口 Hibernate有五大核心接口,分别是:Session,Transaction, Query, SessionFactory,Configuration 。这五个接口构成了Hibernate运行的基本要素,可以执行存取,持久化,事务管理等操作。这五个接口可以位于系统的业务逻辑层和持久化层。下面是一张Hibernate的关系图:,7.1.6 开发hibernate3程序 (1)首先建立一个java工程(HibernateDemo)。,(3)设置“用户库”,选择“Window”-“ Preferences-”“Java”-“Bild Path”-“User Libraries”
6、,添加所需要的类库。 然后单击“添加JAR”。,(4)设置“构建路径”,点击菜单“Window”-“Preferences” - Java-Build Path,以下都在“Preferences”中配置:,(5)在oracle中建立一个数据库test:create database test,然后建立数据表student。 CREATE TABLE student( stuNo CHAR(32) NOT NULL PRIMARY KEY, stuName VARCHAR2(50) NOT NULL, sex CHAR(1), cource VARCHAR2(50), grade numeric
7、(18,0) );,(6)建立表对应的持久化对象,在eclipse中src目录下建立Student.java. 将ojdbc14.jar到项目的lib目录下 (7)用记事本打开项目根目录下的.classpath文件,在.中加入一行: (8)建立表对应的配置文件 在src中建立Student.hbm.xml文件 (9)建立hibernate.cfg.xml配置文件 (10)编写测试类,在src中建立test.java文件 (11)在项目test上点右键,“刷新” (12)双击test.java,运行程序,成功增加一条记录,查看数据表User观看结果! (13)从图7-8中可以看出,oracle的
8、student表中增加了一行。表明我们的测试程序运行成功。,7.2 Hibernate对象状态,对象的状态 瞬时状态(transient) 瞬时状态对象用new语句创建,还没有被持久化,不处于Session的缓存中。处于瞬时状态的Java对象被称为瞬时对象。 持久化状态(persistent) 持久化状态指已经被持久化,加入到Session的缓存中的状态。处于持久化状态的Java对象被称为持久化对象。 托管状态(detached): 托管状态指已经被持久化,但不再处于Session的缓存中的状态。处于托管状态的Java对象被称为托管对象。,7.3 hibernate事务,7.3.1 事务概述
9、数据库事务的概念 数据库事务是指由一个或多个SQL语句组成的工作单元,这个工作单元中的SQL语句相互依赖,如果有一个SQL语句执行失败,就必须撤销整个工作单元。 在并发环境中,多个事务同时访问相同的数据资源时,可能会造成各种并发问题,可通过设定数据库的事务隔离级别来避免,还可采用悲观锁和乐观锁来解决丢失更新这一并发问题。 2数据库事务ACID特征 A:Atomic原子性,整个事务不可分割,要么都成功,要么都撤销。 C:Consistency一致性,事务不能破坏关系数据的完整性和业务逻辑的一致性,例如转账,应保证事务结束后两个账户的存款总额不变。 I:Isolation隔离性,多个事务同时操纵相
10、同数据时,每个事务都有各自的完整数据空间 。 D:Durability持久性,只要事务成功结束,对数据库的更新就必须永久保存下来,即使系统发生崩溃,重启数据库后,数据库还能恢复到事务成功结束时的状态。 只要声明了一个事务,数据库系统就会自动保证事务的ACID特性。,3事务边界 事务的开始边界。 事务的正常结束边界(commit):提交事务,永久保存。 事务的异常结束边界(rollback):撤销事务,数据库回退到执行事务前的状态,4 数据库支持两种事务模式 (1)自动提交模式:每个SQL语句都是一个独立的事务,数据库执行完一条SQL语句后,会自动提交事务。 (2)手工提交模式:必须由数据库的客
11、户程序显式指定事务的开始和结束边界。 JDBC Connection类的事务控制方法: setAutoCommit(boolean autoCommit) 设置是否自动提交事务,默认自动 commit() 提交事务 rollback() 撤销事务,5Hibernate控制事务的方法 (1)调用sessionFactory不带参数的openSession方法,从连接池获得连接,Session自动把连接设为手工提交事务模式。 Session session = sessionFactory.openSession(); 若调用带connection参数的openSession,则需要先调用conn
12、ection类的setAutoCommit,自己设置手工提交: connection.setAutoCommit(false); Session session = sessionFactory.openSession(connection); (2)声明事务的开始边界 Transaction tx = session.beginTransaction(); (3)提交事务调用Transaction类的commit()方法。 mit(); (4)撤销事务调用Transaction类的rollback()方法,使事务回滚。 tx.rollback();,7.3.3 hibernate事务管理 H
13、ibernate 是JDBC 的轻量级封装,本身并不具备事务管理能力。在事务管理层,Hibernate将其委托给底层的JDBC或者JTA,以实现事务管理和调度功能。 Hibernate的默认事务处理机制基于JDBC Transaction。我们也可以通过配置文件设定采用JTA作为事务管理实现: net.sf.hibernate.transaction.JTATransactionFactory ,基于JDBC的事务管理将事务管理委托给JDBC 进行处理无疑是最简单的实现方式,Hibernate 对于JDBC事务的封装也极为简单。 session = sessionFactory.openSes
14、sion(); Transaction tx = session.beginTransaction(); mit(); 从JDBC层面而言,上面的代码实际上对应着: Connection dbconn = getConnection(); dbconn.setAutoCommit(false); mit();,7.4 Hibernate反向工程,Hibernate反向工程的作用是在MyEclipse下连接数据库并自动生成配置文件和对应的类代码。 (1)打开“DB Browser”,选择“Window”-“Open Perspective”-“Other”。,(2)在“Open Perspect
15、ive”窗口中,选择“MyEclipse Database Explore”。如图7-11所示。,(3)新建数据库连接:在工作空间上将会出现一个DB Browser的配置页面,在配置页面空白处,右键,选择New按钮。,(4)填写配置信息:,(5)导入Hibernate:选择工程,点右键选择“Hibernate Capabilities”。,(6)选择填入信息,点击next。,(7)关闭create SessionFactory,点击Finish完成,Hibernate成功导入到工程中。,(8)用Hibernate自动生成配置文件 选择新建的表t_user,右键选择Hibernate Rever
16、se Enginering。,选择并填入信息,点击next。,(9)填写主键信息,(10)填写类名,及所在包名。,(11)点击Finish完成,自动生成Hibernate配置文件。新的工程目录结构如下图所示:可以看到,系统自动给我们生成了User.java及Hibernate.cfg.xml配置文件,并将Hibernate环境所需要的外部包文件也加入到CLASSPATH当中。,7.5 HQL HQL是Hibernate Query Language的缩写,是官方推荐的查询语言。QBC是Query By Criteria的缩写,是Hibernate提供的一个查询接口。Hibernate是一个轻量级的框架,它允许使用原始SQL语句查询数据库。,7.5.1 HQL基础 HQL检索方式,它使用类似SQL的查询语言,以面向对象的方式从数据库中查询。可以使用HQL查询具有继承、多态和关联关系的数据。在检索数据时应优先考虑使用HQL方式。,默认数据库表和数据 数据库中添加了3个表:学生